【问题标题】:Key Frame Extraction From Video从视频中提取关键帧
【发布时间】:2012-02-22 07:28:34
【问题描述】:

我需要从视频/流中提取关键帧。所以有没有标准的实现。 我正在使用开放式简历。 (目前我每秒都在提取帧,这比较慢,我需要提高性能。) 因此,如果有人优化了实现,请在此处回复。

【问题讨论】:

    标签: opencv computer-vision keyframe


    【解决方案1】:

    我会假设 keyframe 是一个呈现内容的框架,与之前的有很大不同(它不是一个正式的定义,但它很合适)。取帧 ii+1。使用cv2.absDiff 计算帧之间的差异,使用cv2.sumElems 获得所有像素差异的总和。对所有帧 i 执行此操作。这会将您的视频流减少为一维信号。在此信号中寻找 peaks 并选择与这些峰值相对应的关键帧。要找到峰值,可以通过手动找到您认为是关键帧的帧,并将其错误作为错误阈值来手动选择此信号的阈值,或者自动使用统计信息(例如,任何帧 i+1,其中错误大于 1 标准差平均误差)。

    【讨论】:

    • 我得到一个从 sumElems() 返回的 RGB 值的标量。如何以最聪明的方式处理这个标量?对 RGB 通道求和?只关注某个频道?
    • 对 RGB 通道求和或只使用灰度。
    • 你能分享一个示例代码来找到峰值帧
    • 6 年后回到这个答案,仍然很棒!
    【解决方案2】:

    使用 ffmpeg,您可以使用以下代码提取所有关键帧:

    ffmpeg -vf select="eq(pict_type\,PICT_TYPE_I)" -i yourvideo.mp4 -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg
    

    ffmpeg 命令行中的 -vf 后面是 Filtergraph 描述。选择过滤器选择要传入输出的帧。过滤器的常数是“pict_type”,值是“PICT_TYPE_I”。所以 ffmpeg 只是将关键帧传递给输出。

    -vsync 2 防止 ffmpeg 为每个关键帧生成多个副本。

    -f image2 将视频帧写入图像文件。输出文件名由模式指定,可用于生成按顺序编号的文件系列。该模式可能包含字符串“%d”或“%0Nd”。

    参考: http://www.videoproductionslondon.com/blog/scene-change-detection-during-encoding-key-frame-extraction-code

    【讨论】:

    • 我收到Undefined constant or missing '(' in 'PICT_TYPE_I)'
    • 您好!这是一个很有价值的命令,但是它的顺序放错了位置,您也可能正在重新调整图像的大小。您应该将 -i video.mp4 放在首位,然后放在其他所有内容之前。它类似于:ffmpeg -i "yourInputVideo.mp4" -vf select="eq(pict_type\,PICT_TYPE_I)" -vsync 2 -f image2 thumbnail_%02d.jpeg
    • 根据doc herepict_type 现在采用I 而不是PICT_TYPE_I
    【解决方案3】:

    ffmpeg 解决方案应该可以正常工作。

    对于遇到选择过滤器“eq(pict_type\,PICT_TYPE_I)”问题的人,您可能想尝试使用“eq(pict_type\,I)”过滤器。这被破坏了一段时间,因此某些版本的 ffmpeg 可能无法识别该常量。修复可见here

    最后对我有用的命令是:

    ffmpeg -vf select='eq(pict_type\,I)' -i yourVideo.mp4 -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg
    

    【讨论】:

      【解决方案4】:

      如果上面的代码有问题,试试这个参数顺序。

      ffmpeg -i yourVideo.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg
      

      【讨论】:

        【解决方案5】:

        您可以使用 ffprobe 提取关键帧。它是ffmpeg中的一个工具。

        使用命令:

        ffprobe in.mp4 -select_streams v -show_entries frame=key_frame,pkt_pts_time -of csv=nk=1:p=0 | findstr "1,"
        

        【讨论】:

          猜你喜欢
          • 2014-02-27
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          • 2018-05-27
          • 2017-11-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-22
          相关资源
          最近更新 更多