我目前正在使用QTCreator版本4.7.4来编写一个在应用程序中播放AVI文件的GUI应用程序。
我这样做的方法是将每个帧设置为QLabel内的QPixmap。
video.load("lk",video.EXT_AVI);
if(video.hasLoaded()){
while(!video.hasFinished()){
frame = video.getCurrentFrame();
cv::cvtColor(frame, frame, CV_BGR2RGB);
QImage myImage = QImage( (const unsigned char*) (frame.data),frame.cols, frame.rows, frame.step1(),QImage::Format_RGB888 );
ui->displayLabel->setPixmap((QPixmap::fromImage(myImage)));
video.nextFrame();
}
}
由于我使用opencv API中的VideoCapture类来获取每个帧,因此帧最初被检索为CV :: MAT对象,因此我将它们转换为QImages。
如果我在一个简单的控制台程序中使用opencv API中的CV :: imshow()函数,我可以正常播放文件,但是当我在循环中运行上面的代码时,我的程序本质上崩溃直到最后一帧,然后它将返回到显示最后一帧的稳定状态。
我对C ++很陌生,但对Java有很好的经验,所以我对这个问题的初步猜测是一切都在事件线程上完成,因此占用了所有资源,导致应用程序停止回应一段时间。
任何帮助将不胜感激。
注意:视频是我自己的类,它封装了opencv API中的VideoCapture类。
答案 0 :(得分:5)
你不能在这里使用循环(好吧,你真的可以,但不需要) 你应该创建一个函数,它显示一个单独的框架,然后完成让Qt处理事件。 并且Qt应该在一定的时间间隔内调用此函数,该时间间隔由帧速率确定 使Qt以指定的时间间隔调用某个函数的最佳方法是使用timer。
因此,要开始播放,您应该初始化video
stream ant启动一个计时器。显示最后一帧后,您应该停止计时器。