当前位置: 首页 > article >正文

视频基础操作

1.1. 例子

读取mp4格式的视频,将每一帧改为灰度图,并且打上水印(“WaterMark”),并将其输出保存为out.mp4,在这个例子中可以看到视频读取,每帧数据处理,视频保存的整体流程简单示例

import cv2

try:
    cap=cv2.VideoCapture("CatCloth.mp4")
    if not cap.isOpened():
        print("Video can't be opened")
        raise IOError
    
    # 获取视频的宽度、高度和帧率
    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)
    delay=int(1000/(fps)) #计算每帧视频播放延时

    # 创建 VideoWriter 对象
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    output_path="OutPut.mp4"
    out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))

    while True:
        ret,frame=cap.read() #读取一帧数据
        if not ret:
            break
        #对每一帧图像进行处理
        # 转换为灰度图像
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 打上水印
        cv2.putText(gray_frame, "WaterMark", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

        # 写入输出文件
        out.write(gray_frame)

        # 显示处理后的帧
        cv2.imshow("Processed Video", gray_frame)

        #此处延迟FPS计算出来的时间,按照视频原有速度播放视频 按q键退出
        if(cv2.waitKey(delay)&0xff==ord('q')):
            break

    # 释放 VideoCapture 和 VideoWriter 对象及所有窗口资源
    cap.release() 
    out.release()
    cv2.destroyAllWindows() 
except IOError as e:
    print(f'IOError:{e}')
except Exception as e:
    print(f"Error: {e}")

1.2. 常见操作补充说明

1.2.1. 读取视频文件或摄像头

使用 cv2.VideoCapture() 可以读取视频文件或摄像头。

cv2.VideoCapture 是一个用于捕获视频的类,可以从视频文件、摄像头或网络视频流中读取视频帧。它的构造函数和方法支持多种参数和重载形式,以便灵活地处理不同的视频源。

  1. 默认构造函数
cap = cv2.VideoCapture()
    • 创建一个空的 VideoCapture 对象,通常用于后续调用 open() 方法打开视频源。
  1. 从视频文件或摄像头打开
cap = cv2.VideoCapture(filename, apiPreference=CAP_ANY)
    • filename:视频文件路径或摄像头索引(整数,如 0 表示默认摄像头)。
    • apiPreference:指定使用的后端 API(如 cv2.CAP_ANYcv2.CAP_FFMPEG 等)。默认值为 cv2.CAP_ANY,表示自动选择合适的后端。
  1. 从视频文件或摄像头打开(带参数)
cap = cv2.VideoCapture(filename, apiPreference, params)
    • params:一个参数列表,用于指定额外的配置(如分辨率、帧率等)。参数以 (paramId, paramValue) 的形式传递。

常用参数解释:

  • filename
    • 可以是视频文件路径(如 'video.mp4')。
    • 可以是摄像头索引(如 0)。
    • 可以是网络视频流的 URL(如 'http://192.168.1.100:8080/video')。
  • apiPreference
    • 指定使用的后端 API,例如:
      • cv2.CAP_ANY:自动选择后端。
      • cv2.CAP_FFMPEG:使用 FFmpeg 后端。
      • cv2.CAP_MSMF:使用 Microsoft Media Foundation 后端(Windows)。
      • cv2.CAP_V4L:使用 Video4Linux 后端(Linux)。
  • params
    • 一个参数列表,用于指定额外的配置。例如:
      • cv2.CAP_PROP_FRAME_WIDTH:设置帧宽度。
      • cv2.CAP_PROP_FRAME_HEIGHT:设置帧高度。
      • cv2.CAP_PROP_FPS:设置帧率。

# 读取视频文件 自动选择后端,且无其他设置
cap = cv2.VideoCapture("example.mp4")

# 读取摄像头
# cap = cv2.VideoCapture(0)  # 默认摄像头(索引0)

#检查视频是否正确读取
if not cap.isOpened():
    print("Video can't be opened")
    return

1.2.2. 获取视频属性

可以通过 cap.get() 获取视频的各种属性,例如宽度、高度、帧率等。

width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)  # 帧宽
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 帧高
fps = cap.get(cv2.CAP_PROP_FPS)  # 帧率
print(f"Width: {width}, Height: {height}, FPS: {fps}")

1.2.3. 逐帧读取视频

通过循环逐帧读取视频,并处理每一帧。



while cap.isOpened():
    ret, frame = cap.read()  # 读取一帧
    if not ret:
        break  # 视频结束

    #
    # 显示当前帧
    cv2.imshow("Frame", frame)

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

cap.release()  # 释放视频流
cv2.destroyAllWindows()

1.2.4. 保存视频

使用 cv2.VideoWriter() 可以将处理后的视频保存为文件。

cv2.VideoWriter() 是 OpenCV 库中用于创建视频写入对象的函数,可以将一组图像帧保存为视频文件。

#函数参数介绍
cv.VideoWriter(filename, fourcc, fps, frameSize[, isColor])

参数介绍:

  • filename (str): 输出视频文件的路径。
  • fourcc (int): 指定编码器的四字符代码(FourCC)。
    • 例如:
    • - FFmpeg 使用:
        • cv2.VideoWriter_fourcc(*'mp4v')
        • cv2.VideoWriter_fourcc(*'XVID')
    • Windows 开发版 上编译的 OpenCV 使用
      • cv2.VideoWriter_fourcc(*'MJPG')
  • fps (float): 视频的帧率(每秒帧数)。
  • frameSize (tuple): 视频帧的尺寸(宽,高)。
  • isColor (bool, optional): 指示视频是否为彩色。默认为 True(彩色)。如果设置为 False,输出视频将为灰度。
# 设置视频编码器和帧率
fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 使用 XVID 编码器
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))  # 文件名、编码器、帧率、尺寸

# 写入帧
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    out.write(frame)  # 写入帧
    cv2.imshow("Frame", frame)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cap.release()
out.release()  # 关闭视频写入
cv2.destroyAllWindows()

http://www.kler.cn/a/543133.html

相关文章:

  • [特殊字符] 基于 FastAPI 和 React 构建车牌号识别网站
  • 开发完的小程序如何分包
  • ASP.NET Core程序的部署
  • 业务开发 | 基础知识 | Maven 快速入门
  • java.io.InvalidClassException
  • Linux服务管理操作命令-systemctl命令
  • 【进阶】JVM篇
  • MapboxGL加载离线字体
  • Android开发获取缓存,清理缓存工具类
  • 如何使用Java语言在Idea和Android中分别建立服务端和客户端实现局域网聊天
  • java后端开发day14--之前练习的总结和思考
  • 【通俗易懂说模型】一篇弄懂几个经典CNN图像模型(AlexNet、VGGNet、ResNet)
  • 基于全志T507的边缘计算机,推动光伏电站向智能运维转型
  • DVWA靶场篇(一)——命令执行、CSRF、文件包含
  • NO.12十六届蓝桥杯备战|关系操作符|操作符连用|浮点数比较|练习2道(C++)
  • win11 终端乱码导致IDE 各种输出也乱码
  • GitCode 助力 Easy-Es,革新 Elasticsearch 开发体验
  • 传统架构 VS 云上架构
  • 医疗影响分割 | 使用 Swin UNETR 训练自己的数据集(3D医疗影像分割教程)
  • 自定义比较方法1 仿函数(set,map)
  • C语言基础入门:2.5基础输入输出
  • Ubuntu 上安装和配置 Apache RocketMQ 4.7.1
  • Linux | 系统调用
  • 变化检测相关论文可读list
  • 展厅为何倾向使用三维数字沙盘进行多媒体互动设计?优势探讨!
  • 8K样本在DeepSeek-R1-7B模型上的复现效果