在 Qt GUI 中显示图像序列?

Posted

技术标签:

【中文标题】在 Qt GUI 中显示图像序列?【英文标题】:Displaying image sequence in Qt GUI? 【发布时间】:2014-05-25 01:15:29 【问题描述】:

我有一个处理图像序列的 OpenCV 算法,我想使用如下代码在 Qt 窗口中显示每个处理过的帧:

while(someCondition)
    Mat img;
    ... //some OpenCV process here
    QImage qimg = matToQImage (img); //a function I found
    ui->someLabel->setPixmap(QPixmap::fromImage(qimg));

    //I want to add a delay here or some wait condition

但标签中只显示最后一张图片。我认为这是因为循环太快了,GUI 更新速度不够快。有没有办法让循环暂停,让 GUI 有时间显示图像,然后仅在 GUI 显示图像时继续?

【问题讨论】:

如果图像来得比 UI 更新快,你为什么要经常更新它?为什么你不放弃循环概念来支持信号和插槽,比如 QTimer 或在带有 drawImage() 和自己的信号发射的小部件子类中重新实现paintEvent? 我在想我可以在只使用 OpenCV 时做类似的事情,我可以在每次迭代中调用 cv::imshow()cvWaitKey()。我实际上只是将循环重写为 QTimer 插槽,它现在可以工作了。 【参考方案1】:

根据您对我的评论问题的回复,这似乎是您可以接受的解决方案:

    connect(timer, &QTimer::timeout, [=] () 
        Mat img;
        ... //some OpenCV process here
        QImage qimg = matToQImage (img); //a function I found
        ui->someLabel->setPixmap(QPixmap::fromImage(qimg));
    );
    timer->start(10);

由于它使用的是the new shiny signal-slot syntax for syntactic sugar,所以不要忘记将它添加到您的项目文件中:

CONFIG += c++11

【讨论】:

以上是关于在 Qt GUI 中显示图像序列?的主要内容,如果未能解决你的问题,请参考以下文章

Qt C++ 在 GUI 线程(Boost 线程)之外显示图像

在Qt中单击图像时尝试立即显示用户编辑操作的结果

Qt-OpenCV:如何在 Qt 中显示灰度图像(opencv)

为啥我执行 Python QT5 代码时没有显示图标和图像?

如何为 Qt GUI 小部件使用图像

使用 QT 查看来自相机的流式图像