C++ opencv VideoCapture在线程中被阻止

C++ opencv VideoCapture在线程中被阻止,c++,multithreading,opencv,C++,Multithreading,Opencv,我需要一些关于在另一个线程中使用opencv VideoCapture的帮助 当我在主线程中使用时,它非常好,并且可以流畅地显示视频。但是,一旦我把代码放到另一个线程中,并期望它做同样的事情,视频捕获似乎根本不起作用 我做了一些尝试:如果我用0(默认值)作为参数初始化VideoCapture,它就会被阻止。但是如果我不初始化它 VideoCapture cap; 或者使用另一个号码 VideoCapture cap(1); 它打印出错误消息并退出,但不会被阻止 代码如下: #includ

我需要一些关于在另一个线程中使用opencv VideoCapture的帮助

当我在主线程中使用时,它非常好,并且可以流畅地显示视频。但是,一旦我把代码放到另一个线程中,并期望它做同样的事情,视频捕获似乎根本不起作用

我做了一些尝试:如果我用0(默认值)作为参数初始化VideoCapture,它就会被阻止。但是如果我不初始化它

VideoCapture cap; 
或者使用另一个号码

VideoCapture cap(1); 
它打印出错误消息并退出,但不会被阻止

代码如下:

#include <iostream>
#include <thread>
#include <functional>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;

class MyClass {
public:
    // display the video
    static void display(int i) {
        VideoCapture cap(0);

        if (!cap.isOpened()) {
            cout << "cannot access webcame" << endl;
            exit(-1);
        }

        Mat imgOriginal;
        namedWindow("Original", WINDOW_AUTOSIZE);
        while (true) {
            bool success = cap.read(imgOriginal);
            if (!success) {
                cout << "fail to read video into mat" << endl;
                break;
            }
            imshow("Original", imgOriginal);

            if (waitKey(30) == 27) {
                break;
            }
        }
    }
};

int main()
{
    //cout << "Hello World!" << endl;
    thread myThread(bind(MyClass::display, 0));
    myThread.join();

    return 0;
}
#包括
#包括
#包括
#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
使用名称空间std;
使用名称空间cv;
类MyClass{
公众:
//显示视频
静态无效显示(int i){
视频捕获上限(0);
如果(!cap.isOpened()){

如果highgui模块非常原始,请不要尝试弯曲它。如果必须使用线程,请将处理任务外包给另一个线程,将捕获和gui保留在主线程中。@berak感谢您的评论。。如果它真的不起作用,我会将它们保留在主线程中。。