OpenCV-Python快速入门系列22视频处理与保存

前言

视频处理是计算机视觉中不可或缺的一部分,无论是实时视频流的分析还是本地视频文件的后处理,都是常见的应用场景。

功能实现

本示例实现了以下功能:

  1. 从摄像头捕获视频流,并显示视频画面。
  2. 读取本地视频文件,逐帧处理并叠加时间戳。
  3. 保存处理后的视频文件,并输出其基本信息。

完整代码

import datetime
import cv2 as cv


def get_video_info(cap):
    """获取并打印视频的基本信息"""
    frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
    frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv.CAP_PROP_FPS)
    frame_count = int(cap.get(cv.CAP_PROP_FRAME_COUNT))

    print(f"视频宽度:{frame_width}")
    print(f"视频高度:{frame_height}")
    print(f"帧率(FPS):{fps}")
    print(f"总帧数:{frame_count}")


def camera_demo():
    """从摄像头捕获视频流并显示"""
    cap = cv.VideoCapture(1)  # 修改为 0 或 1 选择不同的摄像头
    if not cap.isOpened():
        print("无法打开摄像头")
        return

    get_video_info(cap)

    while True:
        ret, frame = cap.read()
        if not ret:
            print("无法读取摄像头帧")
            break

        cv.imshow("Camera Video", frame)
        if cv.waitKey(1) == 27:  # 按下 ESC 键退出
            break

    cap.release()
    cv.destroyAllWindows()


def video_file_demo(video_path):
    """读取并播放本地视频文件"""
    cap = cv.VideoCapture(video_path)
    if not cap.isOpened():
        print(f"无法打开视频文件:{video_path}")
        return

    get_video_info(cap)

    # 定义视频编码器和输出文件
    fourcc = cv.VideoWriter_fourcc(*'mp4v')  # 使用 MPEG-4 编码器
    frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
    frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv.CAP_PROP_FPS)
    out = cv.VideoWriter("output_with_timestamp.mp4", fourcc, fps, (frame_width, frame_height))

    while True:
        ret, frame = cap.read()
        if not ret:
            print("视频播放结束或无法读取帧")
            break

        # 获取当前日期和时间
        current_datetime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        # 在帧上叠加日期和时间
        cv.putText(frame, current_datetime, (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv.LINE_AA)

        # 写入帧到输出视频
        out.write(frame)

        # 显示帧
        cv.imshow("Video Playback", frame)
        if cv.waitKey(30) == 27:  # 按下 ESC 键退出
            break

    cap.release()
    out.release()
    cv.destroyAllWindows()


# 调用摄像头演示
# camera_demo()

# 调用视频文件演示
video_file_demo("images/balltest.mp4")

代码详解

获取视频的基本信息

def get_video_info(cap):
    frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
    frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv.CAP_PROP_FPS)
    frame_count = int(cap.get(cv.CAP_PROP_FRAME_COUNT))

    print(f"视频宽度:{frame_width}")
    print(f"视频高度:{frame_height}")
    print(f"帧率(FPS):{fps}")
    print(f"总帧数:{frame_count}")
  • cv.CAP_PROP_FRAME_WIDTHcv.CAP_PROP_FRAME_HEIGHT:视频帧的宽度和高度。
  • cv.CAP_PROP_FPS:视频帧率(每秒帧数)。
  • cv.CAP_PROP_FRAME_COUNT:视频总帧数。

从摄像头捕获视频流

cap = cv.VideoCapture(1)  # 打开摄像头
if not cap.isOpened():
    print("无法打开摄像头")
    return
  • 使用 cv.VideoCapture(0) 打开默认摄像头,1 表示第二个摄像头设备。

处理本地视频文件

视频编码器与保存

fourcc = cv.VideoWriter_fourcc(*'mp4v')  # MPEG-4 编码器
frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv.CAP_PROP_FPS)
out = cv.VideoWriter("output_with_timestamp.mp4", fourcc, fps, (frame_width, frame_height))
  • cv.VideoWriter:用于保存处理后的视频。
    • 文件名为 "output_with_timestamp.mp4"
    • 视频帧率和分辨率与输入视频保持一致。

添加时间戳

current_datetime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cv.putText(frame, current_datetime, (10, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv.LINE_AA)
  • 获取当前时间,并将其格式化为字符串 YYYY-MM-DD HH:MM:SS
  • 使用 cv.putText 在视频帧的左上角叠加时间戳。
图片[1]-OpenCV-Python快速入门系列22视频处理与保存-天煜博客
© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容