在 OpenCV 中,摄像头和视频操作的核心是 cv2.VideoCapture(读取视频 / 摄像头帧)和 cv2.VideoWriter(保存视频)。以下是详细的操作方法和示例:

一、核心函数说明

  1. cv2.VideoCapture:用于读取视频文件或摄像头流

    • 参数:0 表示默认摄像头(内置摄像头),1 表示外接摄像头,或视频文件路径(如 "video.mp4")。
    • 常用方法:
      • read():读取一帧图像,返回 (ret, frame)ret 为 True 表示读取成功,frame 为帧数据(图像矩阵)。
      • isOpened():判断摄像头 / 视频是否成功打开(返回 True/False)。
      • release():释放资源。
  2. cv2.VideoWriter:用于保存视频

    • 参数:输出路径、编解码器(fourcc)、帧率(fps)、帧尺寸((width, height))。
    • 编解码器:需与输出格式匹配(如 'XVID' 对应 .avi 格式),通过 cv2.VideoWriter_fourcc(*'编码') 定义。

二、摄像头操作(实时读取与显示)

示例:打开摄像头并实时显示画面

python

运行

import cv2

# 1. 打开摄像头(0为默认摄像头)
cap = cv2.VideoCapture(0)

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("无法打开摄像头,请检查设备或权限!")
    exit()

# 2. 循环读取并显示帧
while True:
    # 读取一帧
    ret, frame = cap.read()
    if not ret:  # 若读取失败(如摄像头断开),退出循环
        print("无法获取帧,退出...")
        break

    # (可选)对帧进行处理(如转为灰度图)
    # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 显示帧
    cv2.imshow("Camera", frame)

    # 按 'q' 键退出循环(waitKey(1) 表示等待1毫秒,返回按键ASCII码)
    if cv2.waitKey(1) == ord('q'):
        break

# 3. 释放资源
cap.release()  # 关闭摄像头
cv2.destroyAllWindows()  # 关闭所有窗口

三、视频文件操作(读取与播放)

示例:读取本地视频并播放

python

运行

import cv2

# 1. 打开视频文件(替换为你的视频路径)
cap = cv2.VideoCapture("test_video.mp4")

if not cap.isOpened():
    print("无法打开视频文件,请检查路径!")
    exit()

# 2. 循环读取并播放视频
while True:
    ret, frame = cap.read()
    if not ret:  # 视频播放完毕
        print("视频播放结束")
        break

    # 显示帧
    cv2.imshow("Video Playback", frame)

    # 控制播放速度(25毫秒/帧,接近正常视频帧率;按 'q' 退出)
    if cv2.waitKey(25) == ord('q'):
        break

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

四、保存视频(摄像头录制或视频处理后保存)

示例:录制摄像头画面并保存为视频文件

python

运行

import cv2

# 1. 打开摄像头
cap = cv2.VideoCapture(0)
if not cap.isOpened():
    print("无法打开摄像头!")
    exit()

# 2. 设置视频参数
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # 帧宽度
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 帧高度
fps = 20.0  # 帧率(可根据需求调整)

# 定义编解码器('XVID' 对应 .avi 格式,兼容性好)
fourcc = cv2.VideoWriter_fourcc(*'XVID')

# 创建VideoWriter对象(输出路径、编解码器、帧率、尺寸)
out = cv2.VideoWriter('output.avi', fourcc, fps, (frame_width, frame_height))

# 3. 录制并保存视频
while True:
    ret, frame = cap.read()
    if not ret:
        break

    # (可选)处理帧(如添加文字)
    cv2.putText(frame, "Recording...", (10, 30), 
                cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    # 写入帧到视频文件
    out.write(frame)

    # 实时显示录制画面
    cv2.imshow("Recording", frame)

    # 按 'q' 停止录制
    if cv2.waitKey(1) == ord('q'):
        break

# 4. 释放所有资源
cap.release()
out.release()  # 关闭视频写入器(必须调用,否则视频文件损坏)
cv2.destroyAllWindows()

五、常见问题与解决

  1. 摄像头无法打开

    • 检查摄像头是否被其他程序占用(如 Zoom、微信视频)。
    • 确保设备权限(如 Linux/macOS 需授予终端摄像头权限)。
    • 尝试更换摄像头索引(1 或 2,部分设备索引非 0)。
  2. 视频无法播放 / 读取

    • 检查视频路径是否正确,文件是否损坏。
    • 确认 OpenCV 支持该视频格式(建议用 .mp4 或 .avi)。
  3. 保存的视频无法打开

    • 确保 VideoWriter 的帧尺寸(width, height)与实际帧尺寸一致(可通过 frame.shape 查看,注意 shape 是 (height, width))。
    • 编解码器与文件格式匹配(如 XVID 对应 .avimp4v 对应 .mp4)。

通过上述方法,可实现摄像头实时采集、视频播放、视频保存等核心操作,结合帧处理(如滤波、目标检测)还能实现更复杂的功能(如实时人脸追踪)。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐