具有多线程的Opencv VideoCapture

时间:2015-03-29 14:34:52

标签: c++ multithreading opencv

我试图通过使用带有cv :: VideoCapture和std :: thread的多线程来显示多个视频。如果我只是调用function work(),它就可以了!但是当我把它放入一个线程时,没有显示任何内容。我在这里错过了吗?或者你有更好的做法吗?谢谢!

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;
}

2 个答案:

答案 0 :(得分:0)

旧帖子,但在致电cv::waitKey(5);后你可能会错过cv::imshow

答案 1 :(得分:0)

在一个额外的线程中使用cv :: imshow()可能不是一个好主意。 cv :: imshow()仅适用于主线程。