如何从视频文件中提取清晰的帧?
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 个清晰的帧/图像。
【讨论】:
以上是关于如何从视频文件中提取清晰的帧?的主要内容,如果未能解决你的问题,请参考以下文章