从视频中提取关键帧

use*_*178 10 opencv computer-vision keyframe

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

小智 16

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

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

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

  • 你好 !这是一个有价值的命令,但是它的顺序放错了位置,您也可能正在重新调整图像的大小。您应该先将 -i video.mp4 放在首位。它是这样的: ffmpeg -i "yourInputVideo.mp4" -vf select="eq(pict_type\,PICT_TYPE_I)" -vsync 2 -f image2 thumb_%02d.jpeg (2认同)

TH.*_*TH. 7

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