Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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
如何通过Qt gui应用程序显示视频帧?_Qt_Video_Opencv_Qt Creator - Fatal编程技术网

如何通过Qt gui应用程序显示视频帧?

如何通过Qt gui应用程序显示视频帧?,qt,video,opencv,qt-creator,Qt,Video,Opencv,Qt Creator,我试图通过OpenCV库的方法播放视频帧来处理视频,并使用OpenCV/highgui的imshow方法显示这些帧,在这里没有问题 但当涉及到使用QtGUI应用程序实时显示它们时,我无法管理 程序从openfile对话框中获取视频的路径,并开始在while循环中绘制视频帧并对其进行处理。在处理步骤之后,当我尝试在QLabel上显示这些处理过的帧时,gui应用程序的QLabel不会显示任何内容(沿视频长度),只会显示视频末尾的最后一帧,而不会显示其他内容。我尝试刷新/更新每个帧的标签,但没有成功

我试图通过OpenCV库的方法播放视频帧来处理视频,并使用OpenCV/highgui的
imshow
方法显示这些帧,在这里没有问题

但当涉及到使用QtGUI应用程序实时显示它们时,我无法管理

程序从openfile对话框中获取视频的路径,并开始在while循环中绘制视频帧并对其进行处理。在处理步骤之后,当我尝试在QLabel上显示这些处理过的帧时,gui应用程序的QLabel不会显示任何内容(沿视频长度),只会显示视频末尾的最后一帧,而不会显示其他内容。我尝试刷新/更新每个帧的标签,但没有成功

我错过了什么事吗?还是有更方便的方法

下面是我代码的必要部分。提前谢谢

bool stop=false;
cv::VideoCapture capture("a.avi");
cv::Mat cur_frame;

while (!stop) {    
             //...               
             capture.read(cur_frame);                
             //process steps..               
             QImage img= QImage((const unsigned char*)(cur_frame.data),
                                 cur_frame.cols,cur_frame.rows,
                                 QImage::Format_RGB888);
             ui->label->setPixmap(QPixmap::fromImage(img));
             // resize the label to fit the image
             ui->label->resize(ui->label->pixmap()->size());
             //...
             cv::waitkey(50);
             }

Qt只能在控件返回到事件循环时更新UI。您可以尝试在循环中调用
qApp->processEvents()
,但这可能不是最佳方法。

谢谢Arnold,它很有效,至少现在它对我很有用。除此之外,做这项工作的最佳方法是什么?使用Qlabel显示帧是处理这项工作的一种可用且合适的方法吗?(我不这么认为,我使用Qlabel是因为我对QT不太了解)不幸的是,我没有一个好的答案告诉你最好的方法。虽然这是一个老问题,但我只想指出,这个答案()可能会有所帮助。