c++ - OpenCV - 显着提高播放帧速率

标签 c++ performance opencv

在 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);

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

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

最佳答案

您正在使用旧 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 毫秒,所以这个例子将以大约 15 秒的速度播放一个 30 fps 的视频。两倍的速度(减去抓取一帧所需的时间)。

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

关于c++ - OpenCV - 显着提高播放帧速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24070528/

相关文章:

c++ - 根据类定义分配的存储

内部命名空间的 C++ 命名空间解析

java - 如何使用java中opencv的Imgproc.compareHist方法判断两张图片的相似度?

java - 如何使用 OpenCV Java 转换矩阵中的矩形颜色 (ROI)?

C++链表删除错误的项目

java - 具有良好性能的多重映射

c++ - OpenCL 缓冲区分配和映射最佳实践

c++ - 2 while 循环 vs 1 while 循环中的 if else 语句

c++ - 基于生产者-消费者的多线程图像处理

c++ - 如何使用boost在C++中实现独立于系统时间的定时器回调