使用 cvSetCaptureProperty 中的 CV_CAP_PROP_POS_FRAMES 获取单个帧

2023-11-21

我试图通过设置跳转到特定的帧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(使用前将#替换为@)

使用 cvSetCaptureProperty 中的 CV_CAP_PROP_POS_FRAMES 获取单个帧 的相关文章

随机推荐