自学内容网 自学内容网

从零开始学cv-18:opencv视频处理


前言

随着科技的飞速发展,计算机视觉技术在我们的日常生活中扮演着越来越重要的角色。在众多计算机视觉库中,OpenCV凭借其开源、跨平台、功能强大等特点,成为了许多开发者和研究者的首选工具。本次博客将带领大家走进OpenCV的世界,探讨视频处理这一领域的应用与实践。视频处理技术广泛应用于安防监控、智能交通、医疗影像、影视制作等多个领域。通过学习OpenCV视频处理,我们将掌握如何捕捉视频、提取关键帧、保存视频等技术。


视频的读取与保存

在OpenCV中,处理视频主要涉及到两个核心函数:cv2.VideoCapture 和 cv2.VideoWriter。下面将分别介绍这两个函数及其在视频读取和保存中的应用。

1.1视频读取:

cv2.VideoCapture 类是 OpenCV 库中用于从视频文件、图像序列或摄像头捕获视频的类。要使用 cv2.VideoCapture 类,首先需要创建一个 VideoCapture 对象。可以传递一个视频文件的路径或者一个摄像头的索引号(通常从 0 开始)。
比如:

import cv2

# 从视频文件读取
cap = cv2.VideoCapture('path_to_video.mp4')

# 从摄像头读取,0 通常代表第一个摄像头
cap = cv2.VideoCapture(0)

常见的方法有以下几种:
isOpened(): 检查视频是否成功打开。
read(): 读取视频的下一帧。返回两个值:一个布尔值表示是否成功读取,以及读取到的帧。
release(): 释放视频捕获对象。

import cv2

# 创建VideoCapture对象
cap = cv2.VideoCapture('path_to_video.mp4')

# 检查是否打开成功
if not cap.isOpened():
    print("Error opening video file")
else:
    # 读取帧
    while True:
        ret, frame = cap.read()
        
        # 如果读取帧失败,则退出循环
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        
        # 处理帧(例如显示)
        cv2.imshow('Frame', frame)
        
        # 按'q'键退出
        if cv2.waitKey(1) == ord('q'):
            break

# 释放VideoCapture对象
cap.release()
# 关闭所有OpenCV窗口
cv2.destroyAllWindows()

要获取cv2.VideoCapture 类创建的对象的属性,可以使用 get 方法,它接受一个属性ID作为参数,并返回该属性的值,使用方法为cap.get(propId):
一些常用的属性ID包括:

cv2.CAP_PROP_FRAME_WIDTH: 视频帧的宽度
cv2.CAP_PROP_FRAME_HEIGHT: 视频帧的高度
cv2.CAP_PROP_FPS: 帧率
cv2.CAP_PROP_POS_FRAMES: 当前帧的位置(可以用来跳转到视频的特定帧)
cv2.CAP_PROP_POS_MSEC: 当前帧的位置(以毫秒为单位)

import cv2

cap = cv2.VideoCapture('path_to_video.mp4')

# 获取视频的宽度
frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
# 获取视频的高度
frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
# 获取视频的帧率
fps = cap.get(cv2.CAP_PROP_FPS)
# 获取视频的总帧数
frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)

print(f"Frame Width: {frame_width}")
print(f"Frame Height: {frame_height}")
print(f"FPS: {fps}")
print(f"Frame Count: {frame_count}")

cap.release()

同时也可以使用set方法设置视频流属性,它接受一个属性ID和要设置的值。,使用方法为cap.set(propId, value)。案例如下所示:

import cv2

cap = cv2.VideoCapture(0)

# 设置摄像头分辨率
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

# 设置帧率(可能不适用于所有设备)
cap.set(cv2.CAP_PROP_FPS, 30)

cap.release()

1.2 视频保存

cv2.VideoWriter 是 OpenCV 库中用于写入视频文件的一个类。使用 cv2.VideoWriter,你可以将一系列图像帧写入到一个视频文件中,创建一个新的视频。一般的使用步骤为:

  1. 确定视频参数:
  2. 确定视频的输出文件名(包括路径)。
  3. 选择合适的编解码器(FourCC代码)。
  4. 设置视频的帧率(fps)。
  5. 确定视频的分辨率(frameSize)。

使用以下构造函数创建一个 cv2.VideoWriter 对象:cv2.VideoWriter(filename, fourcc, fps, frameSize)
其中FourCC 是一个四字符代码,用于指定视频编解码器。以下是一些常见的 FourCC 代码:

‘XVID’: Xvid 编解码器
‘DIVX’: DivX 编解码器
‘MJPG’: Motion JPEG 编解码器
‘X264’: x264 编解码器
‘WMV1’: Windows Media Video V7
‘WMV2’: Windows Media Video V8

其他参数说明:

filename: 输出视频文件的路径。
fourcc: 四字符代码(FourCC),用于指定视频编解码器。
fps: 视频的帧率(每秒帧数)。
frameSize: 视频帧的大小,格式为 (width, height)。

使用案例:

import cv2

# 步骤 1: 确定视频参数
filename = 'output.avi'  # 输出视频文件名
fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 编解码器
fps = 20.0  # 帧率
frame_size = (640, 480)  # 分辨率

# 步骤 2: 初始化 VideoWriter 对象
out = cv2.VideoWriter(filename, fourcc, fps, frame_size)

# 假设你有一个图像帧列表 frames
frames = [...]  # 这里应该是图像帧列表

# 步骤 3: 写入帧到视频
for frame in frames:
    out.write(frame)  # 写入每一帧

# 步骤 4: 释放 VideoWriter 对象
out.release()


原文地址:https://blog.csdn.net/HanWenKing/article/details/142847226

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!