如何从视频文件中提取清晰的帧?
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。
我只想从视频文件中提取清晰的帧(未抖动的)。这对我的注释过程很有用。
我正在使用以下代码从视频文件中提取帧。
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。