zoukankan      html  css  js  c++  java
  • opencv中cvSetCaptureProperty定位不准的原因及解决

    出处:http://blog.csdn.net/friedvan/article/details/6195777 (opencv2.3.1仍然有这问题)

    以前在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:测试的代码


    参考:http://wsqhs.spaces.live.com/blog/cns!94F639580F58209C!697.entry

    http://www.ffmpeg.com.cn/index.php/%E5%85%B3%E4%BA%8E_frame%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86



    作者:wqvbjhc
    出处:https://www.cnblogs.com/wqvbjhc/
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
  • 相关阅读:
    UESTC
    Education Round 8 A
    Gym
    Gym
    hdoj 1159 Common Subsequence
    UVA
    UESTC
    51Nod 1068 Bash游戏 V3 (这规律不好找)
    51Nod 1066 Bash游戏
    51Nod 1002 数塔取数问题
  • 原文地址:https://www.cnblogs.com/wqvbjhc/p/2465094.html
Copyright © 2011-2022 走看看