我想做一些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%的速度读取...任何想法如何更快地抓取帧?
答案 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);
这将缩短您处理每个帧所需的时间,因为它们会更小。 希望它有所帮助