【代码---利用程序读取视频,每隔几帧保存为一张图片】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 代码
  • 详细解释
    • 导入OpenCV库:
    • 定义保存帧的函数 save_frames:
    • 打开视频文件并获取基本信息:
    • 输出视频信息:
    • 循环读取视频帧并保存:
    • 每隔一定帧数保存一帧:
    • 调整帧的大小并保存:
    • 更新当前帧数:
    • 释放视频捕获对象:
    • 使用函数示例:
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

一个用于将视频文件保存为单帧图片的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帧保存一次。


总结

以上利用程序读取视频,每隔几帧保存为一张图片,不足之处,请大家斧正!!!

你可能感兴趣的:(音视频,python,opencv,ubuntu,计算机视觉)