cvCaptureProperty()定位不准的另类解决办法
2014-03-29 16:57
253 查看
最近想实现对打开的视频实时定位,结果总是定位不成功。
上网查了一下,发现是版本更新后出现的问题,使用OpenCV 1.1版本,就可以正常定位。
OpenCV 2.X 版本中,调用cvCaptureProperty()定位视频到指定帧,采用下面两种方法都会出现定位不准的问题。
cvSetCaptureProperty( capture, CV_CAP_PROP_POS_AVI_RATIO, t)
或
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, t);
网上的解决办法是:
原因在于opencv2.0以后,采用ffmpeg采集视频,而在opencv1.0采用vfw采集视频(具体的概念暂时还不清楚,有时间继续补上)。而opencv在定位时候,调用的ffmpeg的av_seek_frame()函数,此函数原型为:
int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags);
其中,最后一个参数有
AVSEEK_FLAG_BACKWARD = 1; ///< seek backward
AVSEEK_FLAG_BYTE = 2; ///< seeking based on position in bytes
AVSEEK_FLAG_ANY = 4; ///< seek to any frame, even non key-frames
ffmpeg默认的是选取关键帧(这个概念需要具体定义)。opencv里面这个函数的参数flag是0,
int ret = av_seek_frame(ic, video_stream, timestamp, 0);
也就是按照默认的读取关键帧。因此,视频跳跃就出现了。
解决这个问题需要将0改为 AVSEEK_FLAG_ANY ,即:
int ret = av_seek_frame(ic, video_stream, timestamp, AVSEEK_FLAG_ANY );
之后重新编译opencv库,就可以了。
但是这样做会造成花频(具体原因不清楚)。所以我用了一个比较笨的办法:重新获取capture,然后一直调用到指定的帧数。
具体代码:
上网查了一下,发现是版本更新后出现的问题,使用OpenCV 1.1版本,就可以正常定位。
OpenCV 2.X 版本中,调用cvCaptureProperty()定位视频到指定帧,采用下面两种方法都会出现定位不准的问题。
cvSetCaptureProperty( capture, CV_CAP_PROP_POS_AVI_RATIO, t)
或
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, t);
网上的解决办法是:
原因在于opencv2.0以后,采用ffmpeg采集视频,而在opencv1.0采用vfw采集视频(具体的概念暂时还不清楚,有时间继续补上)。而opencv在定位时候,调用的ffmpeg的av_seek_frame()函数,此函数原型为:
int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags);
其中,最后一个参数有
AVSEEK_FLAG_BACKWARD = 1; ///< seek backward
AVSEEK_FLAG_BYTE = 2; ///< seeking based on position in bytes
AVSEEK_FLAG_ANY = 4; ///< seek to any frame, even non key-frames
ffmpeg默认的是选取关键帧(这个概念需要具体定义)。opencv里面这个函数的参数flag是0,
int ret = av_seek_frame(ic, video_stream, timestamp, 0);
也就是按照默认的读取关键帧。因此,视频跳跃就出现了。
解决这个问题需要将0改为 AVSEEK_FLAG_ANY ,即:
int ret = av_seek_frame(ic, video_stream, timestamp, AVSEEK_FLAG_ANY );
之后重新编译opencv库,就可以了。
但是这样做会造成花频(具体原因不清楚)。所以我用了一个比较笨的办法:重新获取capture,然后一直调用到指定的帧数。
具体代码:
int count=GetDlgItemInt(IDC_EDIT_FRAME); //cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,count);//该函数会出现定位不准情况 //cvReleaseCapture(&capture); capture = cvCaptureFromFile(m_sFilePathName);//opencv的初始帧是从-1开始的 for (;count>=0;count--) { cvQueryFrame(capture); }//到达count-1帧处
相关文章推荐
- 修改Keil C 程序代码字体 修改Keil C 微软雅黑 以及 Keil C 光标定位不准的解决办法
- SharpDevelop光标定位不准解决办法
- jq中使用offset定位不准的解决办法
- 移动端fixed定位按钮在底部,键盘弹起,底部按钮顶上去另类解决办法
- 去掉jbuider光标定位不准的解决办法
- JS解决url传值出现中文乱码的另类办法
- 虚拟机下win2003无法关机奇怪原因之另类解决办法
- 关于在运行qt的程序时提示无法定位程序输入点_ZdaPvj于动态链接库Qt5Cored.dll”的解决办法
- 百度地图定位getAddrStr() 获取为空 解决办法
- div设置contentEditable="true"作为文本编辑器,定位光标解决办法
- vmware响应缓慢,鼠标定位不准的解决方法
- outlook出现"定位链接浏览器"错误的解决办法
- 关于百度地图定位出现5e-324的解决办法
- IOS8下,百度地图无法定位解决办法,亲测可用
- mac系统高德定位调试抱key错误的解决办法
- Android 关于Edittext输入框光标焦点无法及时定位解决办法.
- c++多继承二义性的另类解决办法
- “无法定位程序输入点_ZdaPvj于动态链接库Qt5Cored.dll”的解决办法
- ionic 之cordova 极光推送jpush和百度定位插件结合使用之定位失效问题解决办法