OpenCV 也可以检测、跟踪移动物体

科技   2024-10-28 10:44   中国香港  
点击上方小白学视觉”,选择加"星标"或“置顶
重磅干货,第一时间送达
本文关键词:OpenCV、Python、背景减除器、KNN、MOG2、目标检测与追踪
想象一下,你用手机拍摄视频,按下一个按钮,相机就开始录制视频。在幕后,手机相机非常快速地捕捉图像,当你观看视频时,你看到的是一幅接一幅的图像,但你没注意到,因为这个过程发生得非常快。一秒钟内,你的手机显示了30多幅图像。如果你比较这些图像并找到它们之间的差异,你就可以检测到移动物体,这正是背景减除器的工作原理。
使用背景减除器检测和追踪鸟类
在本文中,我将解释背景减除器的工作原理、不同类型的背景减除器以及如何使用 OpenCV 在 Python 中使用它们。
检测移动物体的方法
1. 基本运动检测
第一种方法也是最直观的方法是计算帧与帧之间,或一个被认为是“背景”的帧和所有其他帧之间的差异。这个想法在最高层次上相当简单:首先,保存第一帧。保存后,将其与新帧进行比较。通过逐像素比较,简单地从两幅图像中减去。通过这种方式,你将获得移动物体。
  • 这种技术实现起来相当快,但并不适合应用,因为你需要将默认帧设置为背景,而背景在你的应用中可能不会保持恒定。
想象一下,你正在检测汽车。设置一个默认背景并不会有效,因为汽车在不断移动,一切都在变化。光线在变化,物体在移动。例如,你将第一帧设置为背景图像,背景图像中有3辆汽车,但仅仅一秒钟后,它们就不会再存在,因为它们在移动。因此,背景图像变得不准确,因为一切都在迅速变化。因此,算法不会很准确,特别是在环境快速变化的情况下。
看看图像;算法是工作的,但不是很准确。看看左边的图像;有一些无意义的区域。那是因为在视频中,背景几乎每秒钟都在变化,但在算法中,背景是恒定的。
左边的图像显示了默认背景帧和当前帧之间的差异,而右边的图像显示了带有边界框的当前帧
我想你已经理解了基本运动检测的主要思想。根据你的期望,它可能有用。如果你不期望高精度,你可以考虑使用它。为了解决我上面讨论的问题,背景减除器开始发挥作用。现在是时候谈谈背景减除和减除器了。
2. 背景减除 
背景减除是计算机视觉中的一项基本技术,用于在视频流中将移动物体从背景中隔离出来。通过将视频中的每一帧与背景模型进行比较,可以识别出显著差异的区域作为潜在的前景物体。然后,这个前景信息可以用于各种目的,包括目标检测和追踪。背景减除通常是许多目标追踪和检测算法中的关键步骤。
在背景减除中,背景图像不是恒定的;由于光线变化、物体移动和场景动态等各种因素,它会随着时间变化。背景减除算法的目标是适应性地建模和更新背景,以在变化的环境中准确检测前景物体。通过这种方式,背景问题得到了解决。
在 OpenCV 中,背景减除器可以检测阴影,并且通过阈值处理,它们可以从减除器检测到的物体中排除阴影。这确实是准确检测物体的一个非常重要的特性,因为未识别的阴影区域可能被减除器错误地解释为单独的移动物体,这是不可取的。
使用 OpenCV 中的背景减除器
Opencv 有几种不同的背景减除器。我将使用其中两个最著名的减除器:
  • K-最近邻 (KNN)
  • 高斯混合 (MOG2)
我将只解释 MOG2 如何进行背景减除,但我将使用这两种方法来检测和追踪视频。
下面是 MOG2 如何进行背景减除的:
  1. 初始化:初始化 K 个高斯分布的混合,以模拟场景的背景。每个像素的背景模型由高斯混合表示,K 是一个预定义的参数。
  2. 适应:随着时间的推移,更新每个像素的背景模型,调整高斯分布的参数以适应场景的变化。
  3. 前景检测:根据高斯混合模型计算每个像素属于背景的概率。概率低的像素被分类为前景。
  4. 更新背景:对于被分类为背景的像素,更新高斯分布以纳入新的观察结果并适应场景的变化
  5. 后处理:应用形态学操作(腐蚀、膨胀..)或其他技术来细化前景掩码并去除噪声。
代码 / 检测和追踪移动物体
在代码中,我已经解释了大部分过程,但理解它的最佳方式是复制代码并使用 cv2.imshow 函数观察每个操作后的每一帧。
Subtraction
Threshold
Dilation
# import librariesimport cv2import numpy as np
# KNNKNN_subtractor = cv2.createBackgroundSubtractorKNN(detectShadows = True) # detectShadows=True : exclude shadow areas from the objects you detected
# MOG2MOG2_subtractor = cv2.createBackgroundSubtractorMOG2(detectShadows = True) # exclude shadow areas from the objects you detected
# choose your subtractorbg_subtractor=MOG2_subtractor
camera = cv2.VideoCapture("resources/run.mp4")
while True: ret, frame = camera.read()
# Every frame is used both for calculating the foreground mask and for updating the background. foreground_mask = bg_subtractor.apply(frame)
# threshold if it is bigger than 240 pixel is equal to 255 if smaller pixel is equal to 0 # create binary image , it contains only white and black pixels ret , treshold = cv2.threshold(foreground_mask.copy(), 120, 255,cv2.THRESH_BINARY) # dilation expands or thickens regions of interest in an image. dilated = cv2.dilate(treshold,cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3)),iterations = 2) # find contours contours, hier = cv2.findContours(dilated,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # check every contour if are exceed certain value draw bounding boxes for contour in contours: # if area exceed certain value then draw bounding boxes if cv2.contourArea(contour) > 50: (x,y,w,h) = cv2.boundingRect(contour) cv2.rectangle(frame, (x,y), (x+w, y+h), (255, 255, 0), 2)
cv2.imshow("Subtractor", foreground_mask) cv2.imshow("threshold", treshold) cv2.imshow("detection", frame) if cv2.waitKey(30) & 0xff == 27: break camera.release()cv2.destroyAllWindows()

·  END  ·

下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


小白学视觉
哈工大在读博士的公众号,《OpenCV 4快速入门》的作者,面向初学者介绍计算机视觉基础知识、OpenCV使用、SLAM技术,深度学习等内容。
 最新文章