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

Posted

技术标签:

【中文标题】如何通过 Qt gui 应用程序显示视频的帧?【英文标题】:How to display the frames of a video via Qt gui application ? 【发布时间】:2012-04-24 23:07:31 【问题描述】:

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

但是当涉及到使用 Qt-gui 应用程序实时显示它们时,我无法管理。

程序从 openfile 对话框中获取视频的路径,并开始在 while 循环中抓取视频的帧并处理它们。在处理步骤之后,当我尝试在 QLabel 上显示这些处理过的帧时,gui-app 的 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);
             

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢阿诺德,它有效,至少现在它对我有用。除此之外,完成这项工作的最佳方法是什么?使用 Qlabel 显示帧是处理这项工作的一种可用且合适的方式吗?(我不这么认为,我使用 Qlabel 是因为我不太了解 QT) 很遗憾,我无法为您提供最好的解决方法。我还没有用 Qt 做任何比实时视频要求更高的事情。 尽管这是一个老问题,但我只想指出这个答案 (***.com/a/2671834/1990758) 可能会有所帮助。

以上是关于如何通过 Qt gui 应用程序显示视频的帧?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt GUI 应用程序中工作循环并显示 qimage

在 Qt GUI 中显示图像序列?

如何抑制 Qt GUI 应用程序?

如何使用 Qt 库为 GUI 集成文本显示? [关闭]

为啥我的 Qt 应用程序在执行时不显示 GUI?

QT:QTimeLine时间轴处理(动画显示)。