在 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-OpenCV:如何在 Qt 中显示灰度图像(opencv)