OpenCV开发教程之视频中运动物体检测

10人浏览 / 0人评论 / 添加收藏

视频中的运动检测

在OpenCV中,运动物体检测是视频处理中的一个重要应用。我们可以通过计算帧与帧之间的差异来检测运动物体。

OpenCV中主要有三种检测方法:帧差法背景减除法光流法。可以根据你的具体需求来选择,今天小编介绍的就是帧差法。

三种主流方法对比

 
 
方法 原理 (一句话) 优点 缺点 适用场景
帧差法 计算连续两/三帧像素间的差异。 计算量最小,速度最快,对光照变化不敏感。 结果空洞、"双影"多,无法检测静止物体。 实时性要求极高、运动物体特征明显的场景,如简单的闯入检测。
背景减除法 建立并动态更新背景模型,将当前帧与背景做差。 能提取完整运动区域,自适应光照,可检测阴影(MOG2)。 背景建模需要时间,对动态背景(如树叶晃动)敏感,计算量适中。 安防监控、交通流量统计等多数通用场景,也是目前最主流的方法
光流法 计算像素在连续帧间的运动矢量。 能精确追踪像素运动,获取速度、方向,可应对运动相机。 计算复杂度最高,对噪声敏感,实时性差,参数调校复杂。 高级应用,如动作识别、自动驾驶、机器人导航。

 

以下是一个简单的运动物体帧差法检测示例,代码如下:

# 视频中运动检测
import cv2
from opencv_jupyter_ui import cv2_imshow


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

# 读取第一帧
ret, prev_frame = cap.read()
prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)

while True:
   ret, frame = cap.read()
   if not ret:
       break
   
   # 将当前帧转换为灰度图像
   gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
   
   # 计算当前帧与前一帧的差异
   frame_diff = cv2.absdiff(prev_gray, gray_frame)
   
   # 对差异图像进行二值化处理
   _, thresh = cv2.threshold(frame_diff, 30, 255, cv2.THRESH_BINARY)
   
   # 显示运动检测结果
   cv2.imshow('Motion Detection', thresh)
   
   # 更新前一帧
   prev_gray = gray_frame
   
   if cv2.waitKey(25) & 0xFF == ord('q'):
       break

cap.release()
cv2.destroyAllWindows()

代码中将视频文件修改你本地的视频文件路径。

运行效果图如下:

全部评论