1. 视频读取与帧提取

视频读取与帧提取 学习卡片

任务目标

使用OpenCV读取本地视频文件,逐帧提取图像并实时显示,同时支持空格键暂停/继续、ESC键退出播放。通过本案例掌握VideoCapture的基本读取流程与帧循环控制逻辑。

环境依赖

  • Python 3.7+
  • OpenCV:pip install opencv-python
  • 测试视频:任意本地视频文件(如test.mp4),或使用下方代码自动生成的示例视频

关键完整代码

import cv2

def play_video(video_path):
    """读取视频文件并逐帧显示,支持播放控制"""
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        print(f"错误:无法打开视频文件 {video_path}")
        return

    paused = False
    while True:
        if not paused:
            ret, frame = cap.read()
            if not ret:
                print("视频播放完毕")
                break
            cv2.imshow("Video Player", frame)

        key = cv2.waitKey(30) & 0xFF
        if key == 27:          # ESC键退出
            break
        elif key == 32:        # 空格键暂停/继续
            paused = not paused

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    # 若没有测试视频,可先运行以下代码生成一个示例视频
    # 生成10秒、30fps、640x480的随机噪声视频
    import numpy as np
    out = cv2.VideoWriter("test.mp4", cv2.VideoWriter_fourcc(*"mp4v"), 30, (640, 480))
    for _ in range(300):
        frame = np.random.randint(0, 256, (480, 640, 3), dtype=np.uint8)
        out.write(frame)
    out.release()
    print("示例视频 test.mp4 已生成")

    play_video("test.mp4")

运行方式

  1. 将上述代码保存为video_player.py。
  2. 确保当前目录下有视频文件test.mp4(代码首次运行会自动生成一个随机噪声示例视频)。
  3. 执行命令:python video_player.py。

验证方法

  • 正常播放:程序启动后弹出标题为"Video Player"的窗口,画面持续更新(示例视频为彩色噪点动态变化)。
  • 暂停功能:按下空格键,画面冻结在当前帧;再次按空格键恢复播放。
  • 退出功能:按下ESC键,窗口关闭,程序正常结束,终端无报错。
  • 播放结束:视频播放至最后一帧后,终端输出"视频播放完毕",窗口自动关闭。

常见问题

  • 视频无法打开:检查文件路径是否正确,或视频编码是否为OpenCV支持的格式(推荐MP4/H264)。
  • 播放速度异常:waitKey(30)中的30表示每帧间隔约30ms(约33fps),若视频帧率不同可调整该值匹配实际帧率。
  • 窗口无响应:确保在循环中调用了cv2.waitKey(),否则窗口无法处理键盘事件。