OpenCV-Python快速入门系列22摄像头与视频文件的读取与播放

前言

在计算机视觉领域,实时视频流的处理是一个常见且重要的任务。OpenCV 提供了强大的接口,允许我们轻松地从摄像头捕获视频流或读取视频文件进行处理。本文将详细介绍如何使用 OpenCV 读取和播放摄像头视频流以及本地视频文件。

完整代码

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(0)
    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)

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

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

    cap.release()
    cv.destroyAllWindows()

# 调用摄像头演示
camera_demo()

# 调用视频文件演示
# video_file_demo("path_to_your_video.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}")
  • cap.get(cv.CAP_PROP_FRAME_WIDTH):获取视频帧的宽度。
  • cap.get(cv.CAP_PROP_FRAME_HEIGHT):获取视频帧的高度。
  • cap.get(cv.CAP_PROP_FPS):获取视频的帧率(每秒帧数)。
  • cap.get(cv.CAP_PROP_FRAME_COUNT):获取视频的总帧数。

从摄像头捕获视频流并显示

def camera_demo():
    """从摄像头捕获视频流并显示"""
    cap = cv.VideoCapture(0)
    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()
  • cv.VideoCapture(0):打开默认摄像头。参数 0 表示第一个摄像头设备。
  • cap.isOpened():检查摄像头是否成功打开。
  • cap.read():读取一帧视频。返回值 ret 表示读取是否成功,frame 是捕获的帧。
  • cv.imshow():显示帧。
  • cv.waitKey(1):等待键盘事件,参数 1 表示等待 1 毫秒。返回值为按键的 ASCII 码。
  • cap.release():释放摄像头资源。

读取并播放本地视频文件

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

    get_video_info(cap)

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

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

    cap.release()
    cv.destroyAllWindows()
  • cv.VideoCapture(video_path):打开指定路径的视频文件。
  • cap.isOpened():检查视频文件是否成功打开。
  • cap.read():读取一帧视频
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容