C++ OpenCV QT,显示视频帧(不使用While循环)

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

我有一个简单的个人项目,它使用QT和OpenCV框架在QLabel中显示视频。我知道如何转换成QImage和设置Pixmap

然而,视频在while循环下运行得太快,当我检查fps时,无论我加载哪个视频,fps都是29或30。 为了解决这个问题,我还实现了一个QTimer,在加载视频时启动。 我不知道如何使用它来显示具有需要设置的适当帧速率的帧


你知道我该怎么做吗

我在之前的项目中已经完成了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);
}