如何从视频文件中提取清晰的帧?

Posted

技术标签:

【中文标题】如何从视频文件中提取清晰的帧?【英文标题】:How to extract clear frames from video file? 【发布时间】:2021-05-03 01:26:25 【问题描述】:

我只想从视频文件中提取清晰的帧(未动摇)。这对我的注释过程很有用。

我正在使用以下代码从视频文件中提取帧。

    counter=0
    cap = cv2.VideoCapture(file_)
    success, frame = cap.read()
    while success:
        counter += 1
        cv2.imwrite(f"counter.jpg", frame)
        for i in range(15):
            cap.read()
        success, frame = cap.read()

在上面的 sn-p 中,我每 15 个连续帧跳过一次,以避免提取所有帧。无论如何我可以找到帧中的模糊并只跳过那些吗?

任何提示都会很明显。

【问题讨论】:

可能是 FFT。 ***.com/questions/48864995/… 这能回答你的问题吗? Python - Extracting and Saving Video Frames 【参考方案1】:

我不知道您拥有的图像类型,但我想这 link 会有所帮助。出于相同目的,*** 上也有一个答案here。

几乎所有方法都使用图像的清晰度来判断图像是否模糊。(边缘检测函数的方差会很小)。

laplace = cv2.Laplacian(frame, cv2.CV_64F).var()
if laplace>5:
   write image

这个阈值 5 不是绝对的。你可能不得不修补它。

【讨论】:

【参考方案2】:

我正在发布从一秒剪辑中提取一帧的完整解决方案。该解决方案基于@Kuldeep Singh 的解决方案。

cap = cv2.VideoCapture("input.mp4")
fps = int(cap.get(cv2.CAP_PROP_FPS))
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))


for i in range(int(frame_count/fps)):
    arr_frame=[]
    arr_lap=[]
    for j in range(fps):
        success, frame = cap.read()
        laplacian = cv2.Laplacian(frame, cv2.CV_64F).var()
        arr_lap.append(laplacian)
        arr_frame.append(frame)
    selected_frame = arr_frame[arr_lap.index(max(arr_lap))]
    cv2.imwrite(f"i.jpg", selected_frame)

上面的代码读取每一秒视频剪辑的帧。即,假设输入视频有 30 fps,然后代码读取 30 帧并计算拉普拉斯方差值。读取 30 帧后,它将帧写入图像以获得最大方差值。因为,数字越大,边缘越锋利。上述过程会一直持续到最后一秒。

所以,最终输出是,如果您通过 10 秒的视频,您将获得 10 个清晰的帧/图像。

【讨论】:

以上是关于如何从视频文件中提取清晰的帧?的主要内容,如果未能解决你的问题,请参考以下文章

我的视频的 naturalSize 仅为 (4.0, 3.0) 像素,这也是提取的帧大小

如何使用 openCV 库在视频中提取清晰的轮廓

opencv中如何将从视频中抓取的帧释放掉

工具介绍 - 如何查看视频文件的帧信息

工具介绍 - 如何查看视频文件的帧信息

从视频文件中提取wav文件