1

我想做一些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% 的速度阅读......知道如何更快地抓取帧吗?

4

3 回答 3

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方式(320x240)。

于 2012-10-13T20:13:34.553 回答
0

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

我希望它有效,祝你好运

于 2012-10-13T19:27:12.717 回答
-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);

这将缩短处理每一帧所需的时间,因为它们会更小。希望能帮助到你

于 2015-05-28T13:24:38.690 回答