文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-11-29 19:03

关注

使用背景减除器检测和追踪鸟类

在本文中,我将解释背景减除器的工作原理、不同类型的背景减除器以及如何使用 OpenCV 在 Python 中使用它们。

检测移动物体的方法

1. 基本运动检测

第一种方法也是最直观的方法是计算帧与帧之间,或一个被认为是“背景”的帧和所有其他帧之间的差异。这个想法在最高层次上相当简单:首先,保存第一帧。保存后,将其与新帧进行比较。通过逐像素比较,简单地从两幅图像中减去。通过这种方式,你将获得移动物体。

这种技术实现起来相当快,但并不适合应用,因为你需要将默认帧设置为背景,而背景在你的应用中可能不会保持恒定。

想象一下,你正在检测汽车。设置一个默认背景并不会有效,因为汽车在不断移动,一切都在变化。光线在变化,物体在移动。例如,你将第一帧设置为背景图像,背景图像中有3辆汽车,但仅仅一秒钟后,它们就不会再存在,因为它们在移动。因此,背景图像变得不准确,因为一切都在迅速变化。因此,算法不会很准确,特别是在环境快速变化的情况下。

看看图像;算法是工作的,但不是很准确。看看左边的图像;有一些无意义的区域。那是因为在视频中,背景几乎每秒钟都在变化,但在算法中,背景是恒定的。

左边的图像显示了默认背景帧和当前帧之间的差异,而右边的图像显示了带有边界框的当前帧

我想你已经理解了基本运动检测的主要思想。根据你的期望,它可能有用。如果你不期望高精度,你可以考虑使用它。为了解决我上面讨论的问题,背景减除器开始发挥作用。现在是时候谈谈背景减除和减除器了。

2. 背景减除 

背景减除是计算机视觉中的一项基本技术,用于在视频流中将移动物体从背景中隔离出来。通过将视频中的每一帧与背景模型进行比较,可以识别出显著差异的区域作为潜在的前景物体。然后,这个前景信息可以用于各种目的,包括目标检测和追踪。背景减除通常是许多目标追踪和检测算法中的关键步骤。

在背景减除中,背景图像不是恒定的;由于光线变化、物体移动和场景动态等各种因素,它会随着时间变化。背景减除算法的目标是适应性地建模和更新背景,以在变化的环境中准确检测前景物体。通过这种方式,背景问题得到了解决。

在 OpenCV 中,背景减除器可以检测阴影,并且通过阈值处理,它们可以从减除器检测到的物体中排除阴影。这确实是准确检测物体的一个非常重要的特性,因为未识别的阴影区域可能被减除器错误地解释为单独的移动物体,这是不可取的。

使用 OpenCV 中的背景减除器

Opencv 有几种不同的背景减除器。我将使用其中两个最著名的减除器:

我将只解释 MOG2 如何进行背景减除,但我将使用这两种方法来检测和追踪视频。

下面是 MOG2 如何进行背景减除的:

代码 / 检测和追踪移动物体

在代码中,我已经解释了大部分过程,但理解它的最佳方式是复制代码并使用 cv2.imshow 函数观察每个操作后的每一帧。

Subtraction

Threshold

Dilation


# import libraries
import cv2
import numpy as np

# KNN
KNN_subtractor = cv2.createBackgroundSubtractorKNN(detectShadows = True) # detectShadows=True : exclude shadow areas from the objects you detected

# MOG2
MOG2_subtractor = cv2.createBackgroundSubtractorMOG2(detectShadows = True) # exclude shadow areas from the objects you detected

# choose your subtractor
bg_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()

来源:小白玩转Python内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯