C++ OpenCV和Qt VideoCapture无法在windows上打开正确的摄像头

C++ OpenCV和Qt VideoCapture无法在windows上打开正确的摄像头,c++,windows,qt,opencv,image-processing,C++,Windows,Qt,Opencv,Image Processing,我正在使用opencv和Qt创建一个应用程序。在应用程序中,我正在创建一个小工具来录制视频。因此,为了不阻止主事件线程,我创建了一个单独的对话框,其中包含一个录制线程。对于初学者来说,在这个线程中,我只想看到相机的输出(我还没有介绍录制代码)。因此,我将QThread子类化,并且run()函数如下所示: void VideoRecordThread::run(){ cv::VideoCapture capture; cv::Mat frame; QImage img;

我正在使用opencv和Qt创建一个应用程序。在应用程序中,我正在创建一个小工具来录制视频。因此,为了不阻止主事件线程,我创建了一个单独的对话框,其中包含一个录制线程。对于初学者来说,在这个线程中,我只想看到相机的输出(我还没有介绍录制代码)。因此,我将
QThread
子类化,并且
run()
函数如下所示:

void VideoRecordThread::run(){
    cv::VideoCapture capture;
    cv::Mat frame;
    QImage img;

    qDebug() << "Opening camera" << cameraIndex ;
    capture.open(cameraIndex);

    if(!capture.isOpened()){
        qDebug() << "Could not open camera" << cameraIndex;
        emit threadReturned();
        return;
    }

    while(!stopFlag){
        capture >> frame;
        qDebug() << "Frame Width = " << frame.cols << "Frame Height = " << frame.rows;
        if(frame.cols ==0 || frame.rows==0){
            qDebug() << "Invalid frame skipping";
            continue;
        }
        img = cvMatToQImage(frame); //Custom function
        emit imageCaptured(img);
    }
    capture.release();
    emit threadReturned(); //Custom signal
    qDebug() << "Thread returning";
}
void VideoRecordThread::run(){
视频捕获;
cv::垫架;
QImage img;

qDebug()我注意到,当某些函数没有从主线程执行时,OpenCV会出现问题

将捕获过程的初始化移动到应用程序的主线程,其余部分保留在辅助线程上。初始化部分似乎是:

cv::VideoCapture capture;

qDebug() << "Opening camera" << cameraIndex ;
capture.open(cameraIndex);

if(!capture.isOpened())
{
    qDebug() << "Could not open camera" << cameraIndex;
    emit threadReturned();
    return;
}
cv::视频捕获;

qDebug()什么是
cameraIndex
?如果只有一个摄像头,或者不管使用什么摄像头,都可以传递-1。在Windows上,索引0打开该对话框供用户选择视频源。是的,但问题是我有一个主窗口->录制对话框->视频录制线程。如何将视频捕获从线程2级别移动到主窗口了吗?只需跨类传递
cv::VideoCapture
对象。如果需要,您可以放入类的构造函数,以便在初始化新类时,它已经可以访问捕获接口,或者在主线程中成功初始化后,添加一个新方法在这些类中设置此变量。Or、 作为最后一个(丑陋的)选项,将
cv::VideoCapture
声明为一个全局变量——我想出于测试目的,实现和测试会更快。