Objective c 从视频文件OpenCV抓取帧的最快方法
我想做一些openCV视频处理。我在Mac上用OpenCV在XCODE 4中工作,所以实际上我的代码是目标C++。 我希望尽可能快地访问视频的所有帧(不显示也不拖放),并对它们进行计算 获取帧的代码: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
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);