使用 Qt 和 openCV 逐帧读取视频的更有效方法

问题描述 投票:0回答:1

我目前正在使用Qt和OpenCV从本地文件获取逐帧视频(1920*1280,每秒30帧,未压缩)


bool MainWindow::foo()

{

    const std::string name = loadFileName.toStdString();

    cv::VideoCapture cap(name);

    if(!cap.isOpened()) 

        return false;

    cap.set(cv::CAP_PROP_BUFFERSIZE, 3);

    cv::Mat frame;

    while (cap.isOpened())

    {

        CHiResTimer timer; // custom timer class

        timer.Start();

        cap >> frame;

        timer.Stop();

        QTest::qWait(1);

    }

    frame.release();

    cap.release(); 

    return true;

}

但只有

cap >> frame
线需要 10-12 毫秒,这对我来说太慢了,因为我想做一些处理并以最小的延迟显示 30 fps 视频。我发现 gstreamer 的管道可以帮助更快地读取文件,但我对这个框架绝对不熟悉,所以我不知道是否有必要将它仅用于一个管道。有没有其他方法可以加快阅读速度(即使没有 OpenCV)?

c++ qt opencv video-processing
1个回答
0
投票

如果您想要 30 fps 输出,那么每帧需要 33 毫秒的时间。

按顺序完成所有操作(读取、处理和显示),您将有 10-12 毫秒的时间用于读取,21-23 毫秒的时间用于进一步处理和显示。如果时间不够,那么两倍快的输入(5-6 毫秒,因此处理和显示需要 27-28 毫秒)不太可能拯救您。处理和显示时间仅增加 22%。

您可能需要使用其他方法来加快速度。例如,如果您有 3 个单独的线程处理帧(并且不执行其他操作),则每个线程都有 100 毫秒的时间来处理帧。

© www.soinside.com 2019 - 2024. All rights reserved.