C++ OpenCV QT,显示视频帧(不使用While循环)
我有一个简单的个人项目,它使用QT和OpenCV框架在QLabel中显示视频。我知道如何转换成QImage和设置Pixmap 然而,视频在while循环下运行得太快,当我检查fps时,无论我加载哪个视频,fps都是29或30。 为了解决这个问题,我还实现了一个QTimer,在加载视频时启动。 我不知道如何使用它来显示具有需要设置的适当帧速率的帧C++ OpenCV QT,显示视频帧(不使用While循环),c++,qt,opencv,C++,Qt,Opencv,我有一个简单的个人项目,它使用QT和OpenCV框架在QLabel中显示视频。我知道如何转换成QImage和设置Pixmap 然而,视频在while循环下运行得太快,当我检查fps时,无论我加载哪个视频,fps都是29或30。 为了解决这个问题,我还实现了一个QTimer,在加载视频时启动。 我不知道如何使用它来显示具有需要设置的适当帧速率的帧 你知道我该怎么做吗 我在之前的项目中已经完成了mat到QImage的转换 static QImage Mat2QImage(const cv::Mat3
你知道我该怎么做吗 我在之前的项目中已经完成了mat到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;
}
就我所记得的,Mat图像应该是ARGB32。它以每秒30帧的速度顺利工作
我听说最好的性能解决方案是使用QOpenglWidget,但我不知道如何实现相同的功能。也许你可以看看
使用while循环没有错,您只需正确计算帧速率,然后为每个循环休眠,就可以这样做:
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);
}
intfps=static_cast(capture.get(cv::CAP_PROP_FPS));
uint delayTime=静态施法(1000/FPS);
while(捕获.读取(帧))
{
//处理框架
...
//现在睡眠(毫秒)
QThread::msleep(delayTime);
}
现在,视频将以正常速率显示。您可以使用前面提到的Hello来设置它们,我成功地通过使用QTimer解决了这个问题。谢谢你的贡献。我来看看密码
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);
}