【问题标题】: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 个连续帧跳过一次,以避免提取所有帧。无论如何我可以找到帧中的模糊并只跳过那些吗?

任何提示都会很明显。

【问题讨论】:

标签: python-3.x opencv image-processing cv2


【解决方案1】:

我不知道您拥有的图像类型,但我想这 link 会有所帮助。出于相同目的,stackoverflow 上也有一个答案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 个清晰的帧/图像。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-21
      • 2022-11-10
      • 1970-01-01
      • 2020-09-17
      • 2020-06-07
      • 2019-04-25
      • 2014-09-30
      • 1970-01-01
      相关资源
      最近更新 更多