Я пытаюсь отображать мульти-видео, используя многопоточность с cv :: VideoCapture и std :: thread. Если я просто позвоню в функцию function(), это сработает! Но когда я помещаю его в поток, ничего не отображается. Я что-то пропустил? Или у вас есть лучший parctice для этого? Благодаря!Opencv VideoCapture с многопоточным
p.s. Я использую Mac OS X 10.10.2, OpenCV 2.4.9
Вот код:
void work(std::string address, std::string window) {
cv::VideoCapture cap(address);
if (!cap.isOpened()) {
std::cout << "Cannot open camera" << std::endl;
return;
}
cv::Mat frame;
while (char(cv::waitKey(1)) != 'q' && cap.isOpened()) {
cap >> frame;
if(frame.empty()) {
std::cout << "Video over" << std::endl;
break;
}
cv::imshow(window, frame);
}
}
int main(int argc, char *argv[]) {
std::thread t1(work, "/Path/to/test.mp4", "test");
t1.join();
// work("/Path/to/test.mp4", "test"); // it works if just call function work()
std::cout << "Done..." << std::endl;
}
Я не могу воспроизвести вашу проблему в Windows 7; у вас случайно есть строка 'cv :: namedWindow (« test »);' в вашем фактическом коде? Если я включу это в основную функцию перед созданием потока, я просто получу серый экран и приложение зависает. Если у вас есть, попробуйте переместить функцию окна внутри функции 'work', чтобы окно было создано потоком, который выполняет отображение и проверку ввода с клавиатуры. – ChK
Это тоже не работает. Я обнаружил, что если я включу cv :: namedWindow() до создания потока, он может просто показать мне первый кадр видео и приложение зависает. Но я получаю серый экран, и приложение зависает, если я удалю cv :: namedWindow(). Я действительно смущен. – wking
Странно. Что касается [документации] (http://docs.opencv.org/modules/highgui/doc/user_interface.html#imshow), 'imshow' автоматически создает окно, и поэтому он должен работать, t инициализировать окно из основной функции и попытаться получить к нему доступ из потока. Если вы помещаете 'cv :: nameWindow (« test »);' в функцию работы, это также создает серый экран и зависает? – ChK