目录
1.问题背景
在提取视频文件的关键内容时,手动查看会非常耗时。即使你快进视频,一个小时的视频也需要超过10分钟;通常,一秒钟的视频包含24帧图像。如果你能“捕获”视频中的关键帧(key frame),尤其是在长时间拍摄类似镜头的场景中,对图像进行重复数据消除将有助于过滤掉大多数“噪声”帧,并最大程度地提取视频的核心内容。
随着短视频越来越流行,视频的内容分析与文本的内容分析一样重要。然而,如果每个分析师都想看每一段视频,那就需要太多时间。即使使用快进功能,节省的时间仍然不够。此外,由于人为疏忽,内容分析会出现错误和遗漏。相较于基于文本的内容分析,会发现一个主要的区别:查看文本内容可以一目十行,并且没有强制的前后时间线。相反,观看流媒体必须消耗流媒体的长度。然后我们会有一个问题:我们能一目了然地看到流媒体吗?事实上,视频流中的大量信息是冗余的,并且信息量非常低。信息量仅集中在一个关键帧(也称为信息帧或I帧)图片中。如果你把这些图片一张一张地放在面前,你也可以做到像文本内容一样一目十行,减少人为疏忽。
关于视频的相关概念可以看一下这个博客:
音视频 pts dts基本概念及理解https://blog.csdn.net/qq_33588386/article/details/115348464
2.效果展示
3.解决方案
3.1.Katna提取视频的关键帧
Katna关键帧提取的选择标准:
- 在LUV颜色空间中,与历史帧在绝对差异(absolute differences)方面有很大不同的帧;
- 依靠帧的亮度分数进行过滤
- 依靠帧的熵/对比度分数过滤
- 使用图像直方图对帧进行 K-Means 聚类
- 基于拉普拉斯方差算法聚类的关键帧抽取(图像模糊检测)
代码:
'''
===========================================
@author: jayce
@file: extract_video_keyframes.py
@time: 2022/4/11 20:38
===========================================
'''
from Katna.video import Video
from Katna.writer import KeyFrameDiskWriter
# For windows, the below if condition is must.
if __name__ == "__main__":
# initialize video module
vd = Video()
# number of images to be returned
no_of_frames_to_returned = 12
# initialize diskwriter to save data at desired location
disk_writer = KeyFrameDiskWriter(location=r'E:\Code\Python\extract_video_keyframes\Katna')
# Video file path
video_file_path = r'E:\Code\Python\extract_video_keyframes\test video.mp4'
print(f"Input video file path = {video_file_path}")
# extract keyframes and process data with diskwriter
vd.extract_video_keyframes(
no_of_frames=no_of_frames_to_returned, file_path=video_file_path,
writer=disk_writer
)