OpenCV 学习11 读取和写入视频文件

在 OpenCV 中,VideoCapture 和 VideoWriter 是两个用于处理视频输入和输出的核心类,支持各种视频文件格式。

1、VideoCapture

用于读取视频文件或捕获摄像头实时画面。

1.1 构造函数

python 复制代码
cap = cv2.VideoCapture(device_index or filename, apiPreference=None)
  • 参数说明
参数 类型 说明
device_index int 摄像头设备索引(如 0, 1 表示第一个、第二个摄像头)
filename str 视频文件路径
apiPreference int(可选) 指定后端 API Windows DirectShow:cv2.CAP_DSHOW () Windows Media Foundation:cv2.CAP_MSMF FFMPEG后端:cv2.CAP_FFMPEG ...

1.2 主要方法

方法 说明
read 读取一帧
isOpened 检查VideoCapture对象是否成功打开
release 释放资源
get(propId) 获取视频属性值
set(propId, value) 设置属性
  • 常用属性
属性常量 说明
cv2.CAP_PROP_FRAME_WIDTH 帧宽度
cv2.CAP_PROP_FRAME_HEIGHT 帧高度
cv2.CAP_PROP_FPS 帧率
cv2.CAP_PROP_FOURCC 编码格式
cv2.CAP_PROP_FRAME_COUNT 总帧数
cv2.CAP_PROP_BRIGHTNESS 亮度
... 请查手册

1.3 代码示例

示例代码功能:打开摄像头、读取视频流,显示图像和视频属性、按q退出

python 复制代码
import cv2

# 创建 VideoCapture 对象,0 表示默认摄像头
cap = cv2.VideoCapture(0)

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("无法打开摄像头")
    exit()

while True:
    # 读取一帧图像
    ret, frame = cap.read()
    
    if not ret:
        print("无法读取视频流")
        break

    # 获取视频属性
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv2.CAP_PROP_FPS)
    
    # 在图像上添加文字信息
    info_text = [
        f"Resolution: {width}x{height}",
        f"FPS: {fps:.1f}"
    ]
    
    # 设置字体参数
    font = cv2.FONT_HERSHEY_SIMPLEX
    font_scale = 0.7
    color = (0, 255, 0)  # 绿色
    thickness = 2
    line_type = cv2.LINE_AA
    
    # 在图像上逐行添加信息
    y_offset = 30
    for i, text in enumerate(info_text):
        cv2.putText(frame, text, (10, y_offset + i * 30), 
                   font, font_scale, color, thickness, line_type)

    # 显示图像
    cv2.imshow('Camera', frame)

    # 按下 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

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

2、VideoWriter

用于将图像帧写入视频文件,相关定义及方法请查手册。

  • 常见 FourCC 编码
编码字符串 说明
XVID 广泛兼容的AVI编码,.avi
MJPG Motion-JPEG,质量较高但文件大,.avi
H264 H.264 编码,压缩率高,.mp4
MP4V MP4 视频编码,.mp4

示例代码功能:打开摄像头、读取视频流,显示图像并保存到文件、按q退出

python 复制代码
import cv2

# 打开摄像头
cap = cv2.VideoCapture(0)

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("无法打开摄像头")
    exit()

# 获取摄像头的帧宽和帧高
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))

# 定义编码格式并创建 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 编码器
# 等同于下面的写法
# fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
out = cv2.VideoWriter('camera.avi', fourcc, fps, (frame_width, frame_height))

# 检查 VideoWriter 是否成功创建
if not out.isOpened():
    print("创建 VideoWriter 失败")
    cap.release()
    exit()

print("开始录制视频... 按 'q' 键停止并保存")

# 循环读取摄像头帧
while True:
    ret, frame = cap.read()

    if not ret:
        print("无法读取摄像头帧")
        break

    # 显示当前帧
    cv2.imshow('Camera', frame)

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

    # 按 q 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        print("停止录制,正在保存...")
        break

# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
相关推荐
sali-tec35 分钟前
C# 基于OpenCv的视觉工作流-章75-线-线角度
图像处理·人工智能·opencv·算法·计算机视觉
Hua-Jay1 小时前
OpenCV联合C++/Qt 学习笔记(二十三)----图像校正及单目位姿估计
c++·笔记·qt·opencv·学习·计算机视觉
Hua-Jay3 小时前
OpenCV联合C++/Qt 学习笔记(二十四)----差值法检测移动物体、稠密光流法跟踪移动物体及稀疏光流法跟踪移动物体
c++·笔记·qt·opencv·学习·计算机视觉
Hua-Jay1 天前
OpenCV联合C++/Qt 学习笔记(二十二)----相机模型与投影及单目相机标定
c++·笔记·qt·opencv·学习·计算机视觉
sali-tec1 天前
C# 基于OpenCv的视觉工作流-章74-线-线距离
图像处理·人工智能·opencv·算法·计算机视觉
问窗1 天前
计算机视觉入门案例 高速公路车辆计数系统技术解析
python·opencv·计算机视觉
爱炸薯条的小朋友2 天前
全局锁的性能优势,以及链路优化为何常常低于预期——基于 `MatPoolsTest` 中小图池与大图池的实战复盘
opencv·算法·c#
m0_617493942 天前
OpenCV报错解决:cornerSubPix断言失败 src.channels() == 1 的终极指南
人工智能·opencv·计算机视觉
weixin_307779132 天前
OCR图片文本提取代码
图像处理·python·opencv·自动化·ocr
勤自省2 天前
ROS2 + OpenCV 实战教程:人脸识别、物体跟踪、ArUco 二维码识别初级
人工智能·opencv·ubuntu·计算机视觉·ros2