Objective c 从视频文件OpenCV抓取帧的最快方法

Objective c 从视频文件OpenCV抓取帧的最快方法,objective-c,xcode,video,opencv,frames,Objective C,Xcode,Video,Opencv,Frames,我想做一些openCV视频处理。我在Mac上用OpenCV在XCODE 4中工作,所以实际上我的代码是目标C++。 我希望尽可能快地访问视频的所有帧(不显示也不拖放),并对它们进行计算 获取帧的代码: CvCapture* capture = cvCaptureFromFile("A MOVIE FILE HERE"); IplImage* frame; while(1) { frame = cvQueryFrame(capture); if (!frame) break

我想做一些openCV视频处理。我在Mac上用OpenCV在XCODE 4中工作,所以实际上我的代码是目标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%的速度阅读。。。你知道如何更快地抓取帧吗?

我注意到好几次
cv::waitKey()
/
cvWaitKey()
简而言之并不准确(实际上只有一件事会让你的程序变慢,那就是
waitKey
,昆汀·盖斯曼已经提到过。如果你说:

试过了-忘了提了。没加速 事情

我不相信你,因为我刚刚在我的环境中测试了它,它的速度提高了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;
}
进入其他(320x240)。

功能

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);
这将提高处理每个帧所需的时间,因为它们会更小。
希望能有所帮助

谢谢你的快速回复,已经尝试过了-忘了提及。并没有真正加快速度。对我来说,分辨率保持不变并不重要-只是帧必须没有滴落。我不知道是否有方法从分辨率较低的视频文件中捕获?因为我使用的是很长的material-我不想手动将文件转换为较低的分辨率。不知道是否有类似的内容:
cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT,320);cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH,200)
有效?什么也没做。你是否尝试过将抓取和解码操作分开,以查看哪一步最长?
cvWaitKey()
根本不需要。@kava它提高了你的速度吗?不幸的是,它没有-当我注释掉cvWaitKey()时,没有视频抓取/播放功能。它只是挂在第一帧上。似乎我需要cvWaitKey()?!我期待着找到一种以较低分辨率处理帧的方法。我正在使用FullHD材质,但足以以320x200的速度处理它们。我需要cvConvertImage()吗或者有没有其他方法“以较低分辨率读取文件”?当我播放四分之一大小的全高清文件时,Quicktimeplayer会做什么?@kava欢迎回来!你已经很久没有忘记这个问题了…现在你决定再次提高速度?请参阅我答案的更新部分。CV_CAP_PROP_FRAME参数在视频上似乎不起作用s、 我假设这些只是为了在拍摄过程中设置相机结果。我想我必须实现ffmpeg或类似的功能才能对视频文件进行低分辨率处理。。。
cv::Size videoSize = cv::Size ((int) 320, (int) 200);
cv::resize(srcFrame,resFrame, videoSize);