OpenCV QT,显示视频的帧(不使用while循环)
OpenCV QT, Displaying Frames of a Video (Not using a While Loop)
我有一个简单的个人项目,它使用QT和OpenCV框架在QLabel中显示视频。我知道如何转换为QImage并设置Pixmap。
但是,视频在 while 循环下运行得太快,当我检查时,无论我加载哪个视频,fps 都是 29 或 30。 为了解决这个问题,我还实现了一个QTimer,以便在加载视频时启动。 我不确定如何使用它以我需要设置的适当帧速率显示帧。
知道我该如何实现这一点吗?
我之前在我的项目中做过垫子到 QImage 的转换。
static QImage Mat2QImage(const cv::Mat3b &src) {
QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
for (int y = 0; y < src.rows; ++y) {
const cv::Vec3b *srcrow = src[y];
QRgb *destrow = (QRgb*)dest.scanLine(y);
for (int x = 0; x < src.cols; ++x) {
destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);
}
}
return dest;
}
用法可能是这样的
void foo::timeout() // A slot which QTimer's timeout signal is connected to
{
// I didn't tested the code but it should work
Mat frame;
m_cap >> frame;
QImage img = Mat2QImage(frame);
QPixmap pixmap = QPixmap::fromImage(img);
ui->streamDisplay->setPixmap(pixmap);
}
据我所知,垫子图像应该是 ARGB32。它以 30 fps 的速度顺利工作。
我听说性能最好的解决方案是使用QOpenglWidget,但我不知道如何实现相同的功能。也许你可以看看。
我的旧存储库链接
显示代码-CPP
图像转换-CPP
使用 while-loop 没有错,你只需要正确计算帧率,然后为每个循环休眠,就像这样做:
int FPS = static_cast<int>(capture.get(cv::CAP_PROP_FPS));
uint delayTime = static_cast<uint>(1000 / FPS);
while(capture.read(frame))
{
// process the frame
...
// now sleep (milli secconds)
QThread::msleep(delayTime);
}
现在视频将以正常速率显示。
相关文章:
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- while循环中while循环的时间复杂度是多少
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 擦除while循环中迭代的元素
- 为什么我不能在 while 循环中创建线程?
- 退出简单while循环时出现问题
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 嵌套While循环不起作用(C++问题)
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 使用 GMP 的 while 循环出现问题
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 为什么在 while 循环中返回表达式不起作用
- 如何使用 do while 循环确定最高值和最低值
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- OpenCV QT,显示视频的帧(不使用while循环)
- 在 while 循环中使用 pow() 函数 C++
- C++ 制作/命名不初始化的向量(在 while 循环中)
- std::getline没有在while循环中重新请求用户输入