在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()
代码中将视频文件修改你本地的视频文件路径。
运行效果图如下:


全部评论