提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
一个用于将视频文件保存为单帧图片的Python脚本,使用了OpenCV库。以下是对代码的详细解释:
提示:以下是本篇文章正文内容,下面案例可供参考
代码
import cv2
def save_frames(input_path, output_path, frame_interval=1):
"""
将图像或视频保存为单帧图片
参数:
- input_path: 输入图像或视频文件的路径
- output_path: 输出单帧图片保存的路径
- frame_interval: 每隔多少帧保存一次,默认为1(保存所有帧)
返回:
无
"""
cap = cv2.VideoCapture(input_path)
# 获取视频的帧率和总帧数
fps = cap.get(cv2.CAP_PROP_FPS)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(f"视频帧率: {fps}")
print(f"总帧数: {total_frames}")
current_frame = 0
while True:
ret, frame = cap.read()
if not ret:
break
# 每隔frame_interval帧保存一次
if current_frame % frame_interval == 13:
# 调整帧的大小为720x1080
resized_frame = cv2.resize(frame, (1280, 720))
output_frame_path = f"{output_path}/{str(current_frame).zfill(6)}.jpg"
cv2.imwrite(output_frame_path, resized_frame)
print(f"保存帧 {current_frame} 到 {output_frame_path}")
current_frame += 1
cap.release()
# 例子:将视频保存为单帧图片,保存间隔为每20帧保存一次
input_video_path = "/media/l/us_lane_video/two_two_dao_3.avi"
output_frames_path = "/media/l/us_lane_video/all_us_tusimple"
save_frames(input_video_path, output_frames_path, frame_interval=20)
详细解释
导入OpenCV库:
import cv2
这里导入了OpenCV库,它是一个广泛用于计算机视觉任务的库。
定义保存帧的函数 save_frames:
def save_frames(input_path, output_path, frame_interval=1):
这个函数有三个参数:
input_path: 输入图像或视频文件的路径。
output_path: 输出单帧图片保存的路径。
frame_interval: 每隔多少帧保存一次,默认为1,即保存所有帧。
打开视频文件并获取基本信息:
cap = cv2.VideoCapture(input_path)
fps = cap.get(cv2.CAP_PROP_FPS)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
这里使用 cv2.VideoCapture 打开输入路径的视频文件,然后获取视频的帧率和总帧数。
输出视频信息:
print(f"视频帧率: {fps}")
print(f"总帧数: {total_frames}")
将视频的帧率和总帧数打印到控制台。
循环读取视频帧并保存:
current_frame = 0
while True:
ret, frame = cap.read()
if not ret:
break
使用 cap.read() 读取视频的每一帧,如果读取失败(可能是因为到达视频末尾),则跳出循环。
每隔一定帧数保存一帧:
if current_frame % frame_interval == 13:
这里选择每隔 frame_interval 帧保存一帧,且选择的条件是 current_frame % frame_interval == 13。
也就是说,只有当当前帧数除以帧间隔的余数等于13时,才保存这一帧。
这是一个特定的选择,你可以根据需要更改这个条件。
调整帧的大小并保存:
resized_frame = cv2.resize(frame, (1280, 720))
output_frame_path = f"{output_path}/{str(current_frame).zfill(6)}.jpg"
cv2.imwrite(output_frame_path, resized_frame)
print(f"保存帧 {current_frame} 到 {output_frame_path}")
对选中的帧进行大小调整(这里是将帧调整为720x1080),然后将其保存为JPEG格式的图片。
图片的文件名以帧数为基础,使用六位数表示,并保存在指定的输出路径。
更新当前帧数:
current_frame += 1
释放视频捕获对象:
cap.release()
循环结束后,释放 cv2.VideoCapture 对象,关闭视频文件。
使用函数示例:
input_video_path = "/media/l/us_lane_video/two_two_dao_3.avi"
output_frames_path = "/media/l/us_lane_video/all_us_tusimple"
save_frames(input_video_path, output_frames_path, frame_interval=20)
这里是如何使用该函数的示例。在这个例子中,将视频保存为单帧图片,保存间隔为每20帧保存一次。
总结
以上利用程序读取视频,每隔几帧保存为一张图片,不足之处,请大家斧正!!!