郭震 AI公众号:郭震AI

16 OpenCV使用教程:视频处理之读取与处理视频流

发布日期:

最近更新:

分类: Opencv教程

预计阅读: 3 分钟

阅读次数: 0

预计阅读3 分钟
结构重点9 个
图文要点6 张
正文规模1.3k 字

整理说明

这篇内容怎么整理

郭震 · 2026-06-04

独立整理围绕 9 个结构重点拆成环境、步骤、验证点和常见误区,尽量让读者能照着复现。
图文对照保留 6 张和配置、流程、判断结果有关的图片,方便快速定位正文重点。
持续校对工具、模型和命令变化较快,后续优先修正入口、参数和风险提醒。

阅读路线

先按这条路线读

先抓住主线,再回到代码、配置和图文细节,读起来会更稳。

图文要点

先看本文图文节点

按图先建立主线,再跳回正文核对步骤、配置和判断标准。

OpenCV使用教程:视频处理之读取与处理视频流结构图查看大图
OpenCV使用教程:视频处理之读取与处理视频流结构图

OpenCV 学习要把图像输入、处理步骤、检测结果和工程性能放在一起验证。阅读时可以按「一、读取视频流 -> 从摄像头读取视频流 -> 从视频文件读取 -> 获取视频属性」建立结构,再回到正文里的代码、案例或指标做验证。

OpenCV使用教程:视频处理之读取与处理视频流核对图查看大图
OpenCV使用教程:视频处理之读取与处理视频流核对图

读完后,用一个真实小任务复查:输入是什么,处理环节在哪里,输出是否可验收;失败时先查「一、读取视频流」,再查「从摄像头读取视频流」。

在上篇教程中,我们讨论了目标检测的两个流行算法:YOLO和SSD。目标检测是计算机视觉中的一个重要应用,它使我们能够识别图像中的对象。然而,当我们需要处理动态视频流时,除了对象检测,还需要了解如何能够高效处理视频流。在本篇文章中,我们将深入探讨OpenCV如何读取和处理视频流。

一、读取视频流

在OpenCV中,可以使用cv2.VideoCapture类来读取视频流。该类可以处理来自文件、摄像头或其他视频源的输入。我们将以从摄像头读取视频流为例。

OpenCV视频流处理判断卡查看大图
OpenCV视频流处理判断卡

使用 OpenCV 处理视频流时,先看摄像头或文件输入、帧读取、逐帧处理、显示输出、异常退出和资源释放。

1. 从摄像头读取视频流

以下是一个简单的示例,演示如何打开摄像头并读取视频流:

import cv2

# 打开摄像头,0表示默认摄像头
cap = cv2.VideoCapture(0)

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

while True:
    # 逐帧捕捉
    ret, frame = cap.read()
    if not ret:
        print("无法获取视频帧")
        break
    
    # 显示视频帧
    cv2.imshow('Camera', frame)
    
    # 按'q'键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

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

在上面的代码中,cv2.VideoCapture(0)用于打开默认摄像头。通过循环读取每一帧视频并使用cv2.imshow显示在窗口中,我们可以实时查看摄像头录制的视频流。

2. 从视频文件读取

如果希望从视频文件中读取,可以将cv2.VideoCapture的参数更改为视频文件的路径:

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

3. 获取视频属性

使用cap.get()方法可以获取视频的属性,如帧率、宽度和高度等:

# 获取视频的帧率
fps = cap.get(cv2.CAP_PROP_FPS)
# 获取视频的宽度
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
# 获取视频的高度
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

print(f'帧率: {fps}, 宽度: {width}, 高度: {height}')

二、处理视频流

在读取到视频流后,我们可以对每一帧应用多种图像处理技术,例如滤波、边缘检测、特征提取等。在这一部分,我们将介绍如何对视频流进行简单的处理。

OpenCV阅读地图卡查看大图
OpenCV阅读地图卡

《OpenCV使用教程:视频处理之读取与处理视频流》读到最后,可以把图里的流程当成检查表:问题是否明确,操作是否落地,判断标准是否能复用。

1. 灰度处理

将每一帧转换为灰度图像是视频处理中的常见操作:

gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray Camera', gray_frame)

2. 边缘检测

使用Canny算法进行边缘检测:

edges = cv2.Canny(gray_frame, 100, 200)
cv2.imshow('Edges', edges)

3. 结合处理实例

将矩形框绘制到检测到的对象上,我们将演示如何结合上述处理进行简单的对象检测。例如,假设我们在视频流中要检测运动:

# 用于存储前一帧
prev_frame = None

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 转换为灰度图像
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 计算前一帧与当前帧之间的差异
    if prev_frame is not None:
        diff_frame = cv2.absdiff(prev_frame, gray_frame)
        _, thresh_frame = cv2.threshold(diff_frame, 30, 255, cv2.THRESH_BINARY)
        contours, _ = cv2.findContours(thresh_frame, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        # 在检测到的物体周围绘制矩形框
        for contour in contours:
            if cv2.contourArea(contour) < 500:
                continue
            (x, y, w, h) = cv2.boundingRect(contour)
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

        cv2.imshow('Motion Detection', frame)

    # 更新前一帧
    prev_frame = gray_frame

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

在这个示例中,我们定期对当前帧和前一帧之间的差异进行计算,并绘制出运动的边界框。这种简单的运动检测方法为之后更复杂的对象跟踪算法奠定了基础。

OpenCV使用教程:视频处理之读取与处理视频流应用复盘卡查看大图
OpenCV使用教程:视频处理之读取与处理视频流应用复盘卡

读到这里,可以把《OpenCV使用教程:视频处理之读取与处理视频流》整理成一张复盘表:先说清主线,再拿一个小任务检查结果。

OpenCV使用教程:视频处理之读取与处理视频流应用检查卡查看大图
OpenCV使用教程:视频处理之读取与处理视频流应用检查卡

读完《OpenCV使用教程:视频处理之读取与处理视频流》后,可以先挑一个小样例走完整流程,再判断哪些步骤已经能独立完成。

结论

在这一篇教程中,我们学习了如何使用OpenCV读取和处理视频流,不论是来自摄像头还是视频文件。我们展示了如何提取视频属性和进行基础图像处理。这些基本操作为后续的深入对象跟踪打下了基础。在下一篇文章中,我们将介绍如何在视频中实现对象跟踪,进一步提升我们的计算机视觉应用能力。

继续阅读

从这篇继续找到相关教程

AI 教程总索引

常见问题

读前先确认这三点

OpenCV使用教程:视频处理之读取与处理视频流适合谁读?

这是 OpenCV 教程 系列第 16 / 24 篇,适合正在学习OpenCV 教程,并且需要把概念落到操作步骤或判断标准里的读者。

读这篇OpenCV教程要多久?

按中文技术文章阅读速度估算,通读大约 3 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。

这篇文章里的图文节点怎么用?

正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

继续阅读

继续找到相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...