C++ OpenCV和Qt VideoCapture无法在windows上打开正确的摄像头
我正在使用opencv和Qt创建一个应用程序。在应用程序中,我正在创建一个小工具来录制视频。因此,为了不阻止主事件线程,我创建了一个单独的对话框,其中包含一个录制线程。对于初学者来说,在这个线程中,我只想看到相机的输出(我还没有介绍录制代码)。因此,我将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;
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
声明为一个全局变量——我想出于测试目的,实现和测试会更快。