我试图通过设置跳转到特定的帧CV_CAP_PROP_POS_FRAMES
属性,然后像这样读取框架:
cvSetCaptureProperty( input_video, CV_CAP_PROP_POS_FRAMES, current_frame );
frame = cvQueryFrame( input_video );
我面临的问题是,OpenCV 2.1 对于 12 个连续值返回相同的帧current_frame
而我想读取每个单独的帧,而不仅仅是关键帧。谁能告诉我出了什么问题吗?
我做了一些研究,发现问题是由解压算法引起的。
类似MPEG的算法(包括HD等)不会单独压缩每一帧,而是时不时地保存一个关键帧,然后只保存最后一帧和后续帧之间的差异。
您报告的问题是由于以下事实引起的:当您选择帧时,解码器(可能是 ffmpeg)会自动前进到下一个关键帧。
那么,有办法解决这个问题吗?我不仅想要关键帧,还想要每个单独的帧。
我不知道这对于您的目的是否足够精确,但我已经成功地通过获取帧速率、将帧编号转换为时间、然后前进到 MPEG 视频中的特定点来实现时间。就像这样:
cv::VideoCapture sourceVideo("/some/file/name.mpg");
double frameRate = sourceVideo.get(CV_CAP_PROP_FPS);
double frameTime = 1000.0 * frameNumber / frameRate;
sourceVideo.set(CV_CAP_PROP_POS_MSEC, frameTime);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)