8

我正在使用 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";
}

这应该可以工作,但问题是当线程启动时,我得到一个“突然”的新对话框,要求我在选择其中一个连接的相机时选择相机,它有时工作,有时它不工作吨。这是我得到的对话框:

在此处输入图像描述

关于我能做什么的任何帮助?

4

1 回答 1

4

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

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

cv::VideoCapture capture;

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

if(!capture.isOpened())
{
    qDebug() << "Could not open camera" << cameraIndex;
    emit threadReturned();
    return;
}
于 2012-04-27T02:08:29.027 回答