Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果

一、简单介绍

二、简单指定视频某片段重复播放效果实现原理

三、简单指定视频某片段重复播放效果案例实现简单步骤

四、注意事项


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、简单指定视频某片段重复播放效果实现原理

要在 Python 中使用 OpenCV 指定视频某段连续帧,然后重复播放若干次。当指定的起始帧和结束帧超出视频的有效范围时,我们需要进行安全校验,以防止越界访问。

并将重复的视频片段插入原始视频中,分别处理重复片段之前和之后的部分,然后再将它们组合起来。

实现中涉及了以下关键函数:

通过这些关键函数的组合和调用,实现了从原始视频中提取指定片段、重复播放指定次数,并生成新的视频文件的功能。

三、简单指定视频某片段重复播放效果案例实现简单步骤

1、编写代码

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果-LMLPHP

2、运行效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之五 简单指定视频某片段重复播放效果-LMLPHP

3、具体代码

"""
简单指定视频某片段重复播放效果
    1、使用 OpenCV 中的 cv2.VideoCapture() 函数读取原始视频文件。
    2、获取原始视频的帧率、总帧数和尺寸等信息。
    3、对指定的重复片段之前、重复片段和重复片段之后的部分进行逐帧处理。
    4、利用 cv2.VideoWriter() 创建输出视频文件对象,并按照顺序将处理好的视频帧写入其中。
"""

import cv2


def repeat_video_segment(input_video_path, output_video_path, start_frame, end_frame, repeat_count):
    """
    指定视频片段重复若干次
    :param input_video_path:
    :param output_video_path:
    :param start_frame:
    :param end_frame:
    :param repeat_count:
    :return:
    """
    # 读取原始视频文件
    cap = cv2.VideoCapture(input_video_path)

    # 获取原始视频的帧率和总帧数
    fps = cap.get(cv2.CAP_PROP_FPS)
    total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    # 校验起始帧和结束帧是否有效
    if start_frame < 0 or end_frame < 0 or start_frame >= total_frames or end_frame >= total_frames:
        print("Error: Invalid start or end frame.")
        return

    # 获取原始视频的宽度和高度
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

    # 定义视频编码器
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')

    # 创建输出视频文件对象
    out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))

    # 设置视频文件读取的起始帧
    cap.set(cv2.CAP_PROP_POS_FRAMES, 0)

    # 写入重复片段之前的部分
    for frame_index in range(start_frame):
        ret, frame = cap.read()
        if ret:
            out.write(frame)
        else:
            break

    # 写入重复片段
    for _ in range(repeat_count):
        # 设置视频文件读取的起始帧为重复片段的起始帧
        cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame)

        # 逐帧读取重复片段并写入输出视频对象
        for frame_index in range(start_frame, end_frame + 1):
            ret, frame = cap.read()
            if ret:
                out.write(frame)
            else:
                break

    # 写入重复片段之后的部分
    for frame_index in range(end_frame + 1, total_frames):
        cap.set(cv2.CAP_PROP_POS_FRAMES, frame_index)
        ret, frame = cap.read()
        if ret:
            out.write(frame)
        else:
            break

    # 释放资源
    cap.release()
    out.release()
    cv2.destroyAllWindows()


def main():
    # 调用函数并指定输入和输出视频文件路径,以及要重复播放的视频段的起始帧和结束帧,以及重复播放的次数
    input_video_path = "Videos/CatRun.mp4"
    output_video_path = "Videos/VideoRepeatSegment.mp4"
    start_frame = 130  # 重复片段的起始帧
    end_frame = 200  # 重复片段的结束帧
    repeat_count = 3  # 重复播放的次数
    repeat_video_segment(input_video_path, output_video_path, start_frame, end_frame, repeat_count)


if __name__ == "__main__":
    main()

四、注意事项

  1. 校验起始帧和结束帧是否有效,确保不会越界。
  2. 在处理视频片段之前和之后,需要设置视频文件读取的起始帧。
  3. 在循环读取视频帧时,需要判断视频文件是否读取到了末尾。
  4. 最后需要释放资源,包括释放视频文件对象和关闭所有窗口。
04-09 05:53