18 视频处理之视频分析与处理
系列进度
OpenCV 教程 · 第 18 / 24 篇
整理说明
这篇内容怎么整理
郭震 · 2026-06-04
阅读路线
先按这条路线读
先抓住主线,再回到代码、配置和图文细节,读起来会更稳。
OpenCV 学习要把图像输入、处理步骤、检测结果和工程性能放在一起验证。阅读时可以按「视频分析概述 -> 常见的视频分析任务 -> OpenCV中的视频分析工具 -> 背景减除」建立结构,再回到正文里的代码、案例或指标做验证。
读完后,用一个真实小任务复查:输入是什么,处理环节在哪里,输出是否可验收;失败时先查「视频分析概述」,再查「常见的视频分析任务」。
在前一篇文章中,我们探讨了视频对象跟踪的基本概念与实现方法。本篇将重点关注视频分析与处理的技术与应用,旨在帮助读者理解如何在视频流中提取有价值的信息,以及如何对视频进行各种处理操作。
视频分析概述
视频分析是从输入的视频流中提取关键信息的过程。它可以包括对象识别、动作识别、行为分析等多种任务。视频分析通常是实现智能监控、交通流量分析以及体育赛事分析等应用的核心技术。
常见的视频分析任务
- 对象检测:识别并定位视频帧中的特定对象。
- 行为识别:分析对象在视频中的行为模式。
- 场景理解:对视频中的场景进行语义分割和理解。
OpenCV中的视频分析工具
OpenCV为视频分析提供了一系列强大的工具和算法。以下是一些常用的功能:
背景减除:识别视频流中的动态对象。特征提取和匹配:获取关键点并进行匹配分析。光流法:计算对象间相对运动。
背景减除
背景减除是一种常见的视频分析技术,用于在固定背景下识别动态对象。OpenCV中提供了多种背景减除算法,如MOG2和KNN。
以下是一个使用MOG2进行背景减除的示例代码:
import cv2
# 创建视频捕捉对象
cap = cv2.VideoCapture('video.mp4')
# 创建背景减除器
backSub = cv2.createBackgroundSubtractorMOG2()
while True:
ret, frame = cap.read()
if not ret:
break
# 应用背景减除
fgMask = backSub.apply(frame)
# 显示结果
cv2.imshow('Frame', frame)
cv2.imshow('FG Mask', fgMask)
keyboard = cv2.waitKey(30)
if keyboard == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
特征提取与匹配
特征提取技术被广泛用于视频分析中,尤其是在对象检测与识别中。OpenCV提供了多种特征检测算法,例如ORB、SIFT和SURF。下面是基于ORB算法进行特征提取与匹配的代码样例:
import cv2
# 读取参考图像和视频流
img1 = cv2.imread('object.jpg', 0) # 参考图像
cap = cv2.VideoCapture('video.mp4')
# 创建ORB检测器
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1, None)
while True:
ret, frame = cap.read()
if not ret:
break
# 检测并计算特征
kp2, des2 = orb.detectAndCompute(frame, None)
# 使用BFMatcher进行特征匹配
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
# 绘制匹配结果
frame_matches = cv2.drawMatches(img1, kp1, frame, kp2, matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2.imshow('Matches', frame_matches)
keyboard = cv2.waitKey(30)
if keyboard == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
光流法
光流法用于计算图像序列中像素的运动。它非常适合用于跟踪移动对象。OpenCV提供calcOpticalFlowFarneback函数来实现光流计算。
做 OpenCV 视频分析时,先看帧率、分辨率、预处理、检测或跟踪算法、异常帧和输出保存。
import cv2
# 创建视频捕捉对象
cap = cv2.VideoCapture('video.mp4')
# 读取第一帧
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
# 获取初始角点
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7)
# 创建掩膜图像用于绘制光流
mask = np.zeros_like(old_frame)
while True:
ret, frame = cap.read()
if not ret:
break
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 计算光流
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None)
# 选择确认为好的点
good_new = p1[st==1]
good_old = p0[st==1]
# 绘制光流
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()
c, d = old.ravel()
mask = cv2.line(mask, (a, b), (c, d), (0, 255, 0), 2)
frame = cv2.circle(frame, (a, b), 5, (0, 0, 255), -1)
img = cv2.add(frame, mask)
cv2.imshow('Optical Flow', img)
# 更新新的旧帧和角点
old_gray = frame_gray.copy()
p0 = good_new.reshape(-1, 1, 2)
keyboard = cv2.waitKey(30)
if keyboard == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
学完《视频处理之视频分析与处理》后,不妨换一个自己的场景试一次,重点观察输入、处理和输出是否能对应起来。
如果想把《视频处理之视频分析与处理》用到自己的任务里,可以先缩小场景,只验证一个最关键的判断点。
总结
在本篇中,我们讨论了视频分析的基本概念和常用技术,包括背景减除、特征提取与匹配以及光流法。这些工具不仅适用于简单的对象跟踪任务,也为复杂的视频分析奠定了基础。
《视频处理之视频分析与处理》这类内容容易被细节带偏。先看图里的主线,再回到正文核对环境、输入、输出和判断标准。
在下一篇文章中,我们将深入探讨如何与深度学习框架集成,以实现更复杂的视觉任务,如目标检测和分类。请继续关注我们的系列教程!
继续阅读
从这篇继续找到相关教程
常见问题
读前先确认这三点
视频处理之视频分析与处理适合谁读?
这是 OpenCV 教程 系列第 18 / 24 篇,适合正在学习OpenCV 教程,并且需要把概念落到操作步骤或判断标准里的读者。
读这篇OpenCV教程要多久?
按中文技术文章阅读速度估算,通读大约 3 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。
这篇文章里的图文节点怎么用?
正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。
分享文章
转发到常用平台
微信/朋友圈可先复制链接
相关教程
从相近问题继续读
继续阅读