Bootstrap

OpenCV-02 视频处理入门

介绍

在现代计算机视觉和多媒体应用中,处理视频内容已经成为常见的任务之一。本文将介绍如何使用 Python 中的 OpenCV 库进行基本的视频处理和操作,包括从摄像头获取实时视频、读取本地视频文件、以及将处理后的视频保存为文件。通过本文,您将学习如何利用 OpenCV 和一些简单的 Python 代码处理视频流。

准备工作

在开始之前,请确保已经安装了以下库:

  • Python 3.x
  • OpenCV (pip install opencv-python)
  • NumPy (pip install numpy)
  • Matplotlib(可选,用于显示图像,pip install matplotlib
获取摄像头内容

首先,我们来看如何从摄像头获取实时视频流并进行简单的处理。

from datetime import datetime
import numpy as np
import cv2 as cv

def get_camera():
    # 打开摄像头设备
    cap = cv.VideoCapture(0)
    
    # 打印窗口尺寸信息
    print("窗口宽度:"+str(cap.get(cv.CAP_PROP_FRAME_WIDTH)))
    print("窗口长度:"+str(cap.get(cv.CAP_PROP_FRAME_HEIGHT)))
    
    # 设置摄像头输出窗口尺寸为1920x1080
    cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920)
    cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080)

    while True:
        if cap.isOpened():
            # 读取摄像头内容
            ret, frame = cap.read()
            
            # 转换为灰度图像
            gray = cv.cvtColor(frame, cv.COLOR_BGRA2GRAY)
            
            # 显示灰度图像
            cv.imshow('frame', gray)
        
        # 检测按下键盘上的 'q' 键来退出程序
        if cv.waitKey(1) & 0xFF == ord('q'):
            break

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

以上代码中,我们首先通过 cv.VideoCapture(0) 打开编号为 0 的摄像头设备(通常是默认的摄像头设备)。然后,我们不断读取摄像头的帧,将帧转换为灰度图像,并使用 cv.imshow() 在窗口中显示灰度图像。按下键盘上的 'q' 键即可退出程序。此外,我们还展示了如何设置摄像头输出窗口的尺寸。

读取本地视频文件

接下来,我们看一下如何读取本地存储的视频文件。

def get_video():
    # 打开本地视频文件
    cap = cv.VideoCapture('img/video1.mp4')
    
    while cap.isOpened():
        # 读取视频帧
        ret, frame = cap.read()
        
        # 检查 ret 是否为 True(表示读取成功)
        if not ret:
            break
        
        # 转换为灰度图像
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        
        # 显示灰度图像
        cv.imshow('frame', gray)
        
        # 检测按下键盘上的 'q' 键来退出程序
        if cv.waitKey(25) & 0xFF == ord('q'):
            break

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

以上代码中,我们使用 cv.VideoCapture('img/video1.mp4') 打开名为 video1.mp4 的本地视频文件。随后的步骤与从摄像头获取视频内容基本相同,包括帧的读取、灰度转换和显示。

将处理后的视频保存为文件

最后,我们学习如何将处理后的视频内容保存为新的视频文件。

def save_video():
    # 打开摄像头设备
    cap = cv.VideoCapture(0)
    
    # 声明编码器并创建 VideoWriter 对象
    fourcc = cv.VideoWriter_fourcc(*'XVID')
    out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
    
    while cap.isOpened():
        ret, frame = cap.read()
        if ret:
            # 翻转帧
            frame = cv.flip(frame, 0)
            
            # 将帧写入输出视频文件
            out.write(frame)
            
            # 显示帧
            cv.imshow('frame', frame)
            
            # 检测按下键盘上的 'q' 键来退出程序
            if cv.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            break
    
    # 释放 VideoCapture 和 VideoWriter 对象
    cap.release()
    out.release()
    # 关闭所有窗口
    cv.destroyAllWindows()

在上述代码中,我们首先使用 cv.VideoCapture(0) 打开摄像头设备,然后声明编码器为 XVID 并创建一个 VideoWriter 对象,用于将帧写入到名为 output.avi 的输出文件中。每帧经过翻转处理后,将其写入文件,并在窗口中显示。按下键盘上的 'q' 键即可退出程序并保存视频。

总结

通过本文,您已经了解了如何使用 OpenCV 和 Python 处理视频流的基础知识。从获取实时摄像头内容到读取本地视频文件,再到将处理后的视频保存为新文件,这些操作为您进入计算机视觉和多媒体处理领域提供了一个良好的起点。继续探索更多 OpenCV 提供的功能和算法,您将能够创建更复杂和精细的视频处理应用程序。

    关注公众号:资小库,问题快速答疑解惑

;