zoukankan      html  css  js  c++  java
  • 【OpenCV学习】准确定位帧

    问题描述:关键帧提取后,将会得一序列关键帧的帧号,然后需要把这些帧保存起来,以便于浏览和管理.

    通过opencv里的VideoCapture的函数set(CV_CAP_PROP_POS_FRAMES,nextFrameNumber),定位到具体的帧号,但最终读取的并不是对应帧的图像.

    问题出现的原因:

    Opencv底层是通过ffmpeg读取视频.其中定位主要用av_seek_frame()来定位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.

    因而,进行定位时,若下一帧不是关键帧,进行读取时会出跳跃现象.

    将参数改为AVSEEK_FLAG_ANY,虽然可以解决跳跃现象,读取任何帧图像.

    但是将会出现花屏现象,因为帧图像解码是需要利用关键帧的图像进行帧间的解码,

    若读取帧图像时,其对应关键帧没有被读取解码,将只会对该帧进行帧内解码得到花屏图像.

    如何才能解决跳跃现象,但不产生花屏图像?

    解决思路:读取下一帧号最相近且前面的关键帧,然后一帧帧的读取视频,直到读到下一帧的帧号为止.

    将Opencv2.3.1里面的cap_ffmpeg_impl.cpp里面bool CvCapture_FFMPEG::setProperty( int property_id, double value )函数改成如下实现方式,

    即可达到准确定位的效果.

  • 相关阅读:
    vscode英文显示设置为中文语言
    vscode各插件使用-背景图-scss
    公众号关联小程序
    js点击遮罩空白区域关闭,点击遮罩内元素不关闭
    swiper使用-点击跳转指定页
    小程序内部引导关注公众号实现方法
    jq赋值input值为空
    sass中代码使用
    Sources”参数中指定了多次。“Sources”参数不支持重复项
    将已存在小程序项目添加云开发配置
  • 原文地址:https://www.cnblogs.com/dwdxdy/p/2534733.html
Copyright © 2011-2022 走看看