【问题标题】:OpenCV - Dramatically increase frame rate from playbackOpenCV - 从播放中显着提高帧速率
【发布时间】:2014-06-05 21:32:34
【问题描述】:

在 OpenCV 中有一种方法可以显着提高视频 (.mp4) 的帧速率。我尝试了增加视频播放的方法,包括:

提高帧率:

cv.SetCaptureProperty(cap, cv.CV_CAP_PROP_FPS, int XFRAMES)

跳帧:

for( int i = 0; i < playbackSpeed; i++ ){originalImage = frame.grab();}

&

video.set (CV_CAP_PROP_POS_FRAMES, (double)nextFrameNumber);

还有其他方法可以达到预期的效果吗?任何建议将不胜感激。

更新 只是为了澄清一下,播放速度并不慢,我只是在寻找一种让它更快的方法。

【问题讨论】:

  • 请编辑您的问题以显示minimal 重现您的问题的代码量。在您展示生成它的代码之前,我们无法回答您为什么播放缓慢。
  • 对不起,我认为没有必要,我只是在使用基本功能来播放视频,没有进行检测或识别。帧速率现在很好,但我的意思是只使用最少量的代码就可以显着提高播放速度。 (几乎就像在快进观看视频)...我回家后会更新我的代码摘录。

标签: c++ performance opencv


【解决方案1】:

您正在使用旧 API (cv.CaptureFromFile) 从视频文件中捕获。

如果您使用新的 C++ API,您可以按照您想要的速率抓取帧。这是一个非常简单的示例代码:

#include "opencv2/opencv.hpp"

using namespace cv;

int main(int, char**)
{
    VideoCapture cap("filename"); // put your filename here

    namedWindow("Playback",1);

    int delay = 15; // 15 ms between frame acquisitions = 2x fast-forward

    while(true)
    {
        Mat frame;
        cap >> frame; 
        imshow("Playback", frame);
        if(waitKey(delay) >= 0) break;
    }

    return 0;
}

基本上,您只需在每个循环中抓取一个帧,然后使用cvWaitKey() 在帧之间等待。您在每帧之间等待的毫秒数将设置您的加速。在这里,我放了 15 毫秒,所以这个例子将以大约 30 fps 的速度播放视频。两倍的速度(减去抓取帧所需的时间)。

如果您真的想控制从视频文件中抓取的方式和内容,另一种选择是使用 GStreamer API 抓取图像,然后转换为 OpenCV 进行图像处理。您可以在这篇文章中找到有关此的一些信息:MJPEG streaming and decoding

【讨论】:

  • +1 用于 mjpeg 流和解码,从未考虑过 Gstreamer
  • 是的,VideoCapture 似乎以最大速度运行,但它看起来是单线程的,因此您可能会看到接近实时的速度并假设捕获确实仅以这种速度生成帧.这就是我的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
相关资源
最近更新 更多