设为首页 加入收藏

TOP

OpenCV中cvSetCaptureProperty定位不准的原因及解决
2014-11-24 12:37:48 来源: 作者: 【 】 浏览:0
Tags:OpenCV cvSetCaptureProperty 定位 不准 原因 解决

以前在opencv2.0里面用到cvSetCaptureProperty函数的时候总是发生定位不准确的问题,明明是让其跳到100帧,结果却总不是100帧,定位一段连续的视频,总是出现跳跃的现象。同样的代码在opencv1.0里面完全没错。可是这是为什么?这个问题一直困扰了我半年,终于在今天知道原因了。


经过差不多一晚上的探究,得出粗略的结论。原因在于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库,就可以了。


P.S:测试的代码


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇设定cvSetCaptureProperty后取帧.. 下一篇在Java 7 里如何对文件进行操作

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·工业机器人TCP校准中 (2025-12-25 05:19:17)
·opc 通讯协议与 TCP (2025-12-25 05:19:15)
·labview中tcp/ip通信 (2025-12-25 05:19:13)
·新书介绍《Python数 (2025-12-25 04:49:47)
·怎么利用 Python 进 (2025-12-25 04:49:45)