2015-03-29 2 views
0

Я пытаюсь отображать мульти-видео, используя многопоточность с 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; 
} 
+0

Я не могу воспроизвести вашу проблему в Windows 7; у вас случайно есть строка 'cv :: namedWindow (« test »);' в вашем фактическом коде? Если я включу это в основную функцию перед созданием потока, я просто получу серый экран и приложение зависает. Если у вас есть, попробуйте переместить функцию окна внутри функции 'work', чтобы окно было создано потоком, который выполняет отображение и проверку ввода с клавиатуры. – ChK

+0

Это тоже не работает. Я обнаружил, что если я включу cv :: namedWindow() до создания потока, он может просто показать мне первый кадр видео и приложение зависает. Но я получаю серый экран, и приложение зависает, если я удалю cv :: namedWindow(). Я действительно смущен. – wking

+0

Странно. Что касается [документации] (http://docs.opencv.org/modules/highgui/doc/user_interface.html#imshow), 'imshow' автоматически создает окно, и поэтому он должен работать, t инициализировать окно из основной функции и попытаться получить к нему доступ из потока. Если вы помещаете 'cv :: nameWindow (« test »);' в функцию работы, это также создает серый экран и зависает? – ChK

ответ

0

Использование cv :: imshow() в дополнительном потоке не может быть хорошей идеей. cv :: imshow() работает только в основном потоке.

0

Старый нитка, но вы, вероятно, пропустите cv::waitKey(5); после вызова cv::imshow.

Смежные вопросы