从视频文件OpenCV中获取帧的最快方法

时间:2012-10-13 19:13:39

标签: objective-c xcode video opencv frames

我想做一些openCV视频处理。我在Mac上使用Xcode 4中的openCV,所以实际上我的代码是Objective C ++。

我希望尽可能快地访问视频的所有帧(不显示它而不丢弃)并对它们进行计算。

我的代码来获取帧:

CvCapture* capture = cvCaptureFromFile("A MOVIE FILE HERE");

IplImage* frame;

 while(1) {
    frame = cvQueryFrame(capture);

    if (!frame) break;

       // openCV Stuff here...

    char c = cvWaitKey(1); 
    if(c==27) break;
}

我知道速度很大程度上取决于编解码器/分辨率/比特率 - 但似乎我无法以超过120%的速度读取...任何想法如何更快地抓取帧?

3 个答案:

答案 0 :(得分:1)

实际上只有一件事会减慢你的节目 - waitKey已经提到了 Quentin Geissmann 。如果你说:

  

已经尝试过 - 忘记提及。没有真正加快   的东西。

我不相信你,因为我刚刚在我的环境中测试它,它的速度提高了30-40%。

这是基准代码:

#define WAIT_ON
int main()
{
    cv::Mat frame;
    cv::VideoCapture capture = cv::VideoCapture("video/in.avi");
    int k;

    double benchTime = (double)cv::getTickCount();
    while (1)
    {
        capture >> frame;
        if (!frame.data)
        {
            break;
        }

#ifdef WAIT_ON
        k = cv::waitKey(1);
        if (k == 27)
        {
            break;
        }
#endif
    }

    std::cout << ((double)cv::getTickCount() - benchTime)/cv::getTickFrequency() << std::endl;
}

视频输入:854x480, 24fps, 2:00

使用WAIT_ON宏: ~11秒

没有: ~7.3秒

<强>更新

要降低视频流中的图像分辨率,请设置以下参数:

CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.

set method到其他(320x240)。

答案 1 :(得分:0)

我已经多次注意到cv::waitKey() / cvWaitKey()在短(<10ms)时间内不准确。事实上,在我的情况下,它似乎至少睡10毫秒,任何值都不到10毫秒。也许有人可以为此提供更多的精确度,但我建议从你的循环中将其删除(如果可以的话)。

我希望它有效, 祝你好运

答案 2 :(得分:-1)

功能

cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 320);
cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 200);

不影响视频本身,如果你想改变帧的分辨率,你可以使用类似的东西:

cv::Size videoSize = cv::Size ((int) 320, (int) 200);
cv::resize(srcFrame,resFrame, videoSize);

这将缩短您处理每个帧所需的时间,因为它们会更小。 希望它有所帮助