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

How to extract clear frames from video file?

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

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

    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()

在上面的代码片段中,我每隔 15 个连续帧就跳过一次,以避免提取所有帧。无论如何我可以找到框架中的模糊并只跳过那些?

任何提示都将不胜感激。

我不知道你的图像类型,但我猜这是 link would be helpful. Also there is an answer on Whosebug for the same purpose here

几乎所有的方法都使用图像的清晰度来判断图像是否模糊。(边缘检测功能将具有低方差)。

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

这个阈值 5 不是绝对的。您可能需要修改它。

我正在发布从一秒剪辑中提取一帧的完整解决方案。该解决方案基于@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 个清晰 frames/images。