Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带多线程的Opencv视频捕获_C++_Multithreading_Opencv - Fatal编程技术网

C++ 带多线程的Opencv视频捕获

C++ 带多线程的Opencv视频捕获,c++,multithreading,opencv,C++,Multithreading,Opencv,我试图通过使用多线程和cv::VideoCapture以及std::thread来显示多个视频。如果我只调用函数work,它就工作了!但是当我把它放到一个线程中时,什么也不显示。我错过什么了吗?或者你有更好的办法吗?谢谢 p、 我使用的是MacOSX10.10.2和Opencv 2.4.9 代码如下: void work(std::string address, std::string window) { cv::VideoCapture cap(address); if (!c

我试图通过使用多线程和cv::VideoCapture以及std::thread来显示多个视频。如果我只调用函数work,它就工作了!但是当我把它放到一个线程中时,什么也不显示。我错过什么了吗?或者你有更好的办法吗?谢谢

p、 我使用的是MacOSX10.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;
}

旧线程,但您可能会错过cv::waitKey5;调用cv::imshow之后。

在附加线程中使用cv::imshow可能不是一个好主意。cv::imshow只能在主线程中正常工作。

我无法在Windows 7上重现您的问题;你是否碰巧有一行cv::namedWindowtest;在你的实际代码中?如果在创建线程之前将其包含在main函数中,则只会得到一个灰色屏幕,应用程序将挂起。如果确实有,请尝试将window函数移动到work函数中,使窗口由执行显示和检查键盘输入的线程创建。它也不起作用。我发现如果在创建线程之前包含cv::namedWindow,它只会显示视频的第一帧,应用程序就会挂起。但是如果我删除cv::namedWindow,我会看到一个灰色屏幕,应用程序会挂起。我真的很困惑。奇怪。至于,imshow会自动创建窗口,因此如果您不从主函数初始化窗口并尝试从线程访问它,它应该可以工作。如果放置cv::nameWindowtest;在工作功能中,它是否也会产生灰色屏幕并挂起?您好。这个问题有进展吗?在python上创建stereocam查看器时,我也遇到了一个问题。它们可以在多个进程上正常运行,但不能在多个线程上运行。