前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 OpenCV 快速检测、跟踪移动物体

使用 OpenCV 快速检测、跟踪移动物体

作者头像
小白学视觉
发布于 2024-12-24 10:39:38
发布于 2024-12-24 10:39:38
35101
代码可运行
举报
运行总次数:1
代码可运行

本文关键词: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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
计算机视觉 | Python OpenCV 3 使用背景减除进行目标检测
背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤。如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算像素差从而获取到前景对象。但是在大多数情况下,我们可能没有这样的图像,所以我们需要从我们拥有的任何图像中提取背景。当运动物体有阴影时,由于阴影也在移动,情况会变的变得更加复杂。为此引入了背景减除算法,通过这一方法我们能够从视频中分离出运动的物体前景,从而达到目标检测的目的。 OpenCV已经实现了几种非常容易使用的算法。 环境 Python 3.6
用户1332428
2018/03/09
3.9K0
计算机视觉 | Python OpenCV 3 使用背景减除进行目标检测
OpenCV:目标跟踪。
下面就通过计算视频帧之间的差异(即考虑背景帧和其他帧之间的差异),进而实现目标跟踪。
AiTechYun
2019/07/17
2K0
OpenCV:目标跟踪。
基于OpenCV和Matplotlib的物体移动可视化
在计算机视觉中,一个基本目标是从静态图像或视频序列中提取有意义的信息。为了理解这些信号,通常有助于对其进行可视化。例如,在跟踪高速公路上行驶的单个汽车时,我们可以围绕它们绘制边界框,或者在检测传送带上产品线中的问题时,我们可以使用不同的颜色来标记异常。但是,如果提取的信息是更具数值性质的,并且你希望可视化该信号的时间动态呢?
小白学视觉
2024/12/25
1650
基于OpenCV和Matplotlib的物体移动可视化
OpenCV视频分析背景提取与前景提取
OpenCV中支持的两种背景提取算法都是基于模型密度评估,然后在像素级对图像进行前景与背景分类的方法,它们具有相同的假设前提 – 各个像素之间是没有相关性的,跟它们算法思想不同的方法主要是基于马尔可夫随机场理论,认为每个像素跟周围的像素是有相关性关系,但是基于马尔可夫随机场的方法速度与执行效率都堪忧!所以OpenCV中没有实现。
OpenCV学堂
2019/05/22
5.1K0
OpenCV视频分析背景提取与前景提取
学习—用 Python 和 OpenCV 检测和跟踪运动对象
学习了pyimagesearch 的《PyImageSearch Gurus course》。现在记录下代码的分析。
十四君
2019/11/23
3.1K0
学习—用 Python 和 OpenCV 检测和跟踪运动对象
混合高斯背景建模原理_高斯图模型
在运动目标检测提取中,背景目标对于目标的识别和跟踪至关重要。而建模正是背景目标提取的一个重要环节。
全栈程序员站长
2022/11/16
6760
混合高斯背景建模原理_高斯图模型
教程 | 基于计算机视觉使用Python和OpenCV计算道路交通
本文介绍了不使用复杂的深度学习算法计算道路交通的方法。该方法基于计算机视觉,仅使用 Python 和 OpenCV,在背景提取算法的帮助下,使用简单的移动侦测来完成任务。 今天我们将学习如何在没有复
刘盼
2018/03/16
1.9K0
教程 | 基于计算机视觉使用Python和OpenCV计算道路交通
图片中的人物和背景分离
链接:https://cloud.tencent.com/developer/article/2467199这篇文章详细介绍了通过API接口创建企微获客链接时出现了中文乱码问题,对于这种中文乱码的问题,一般来说通常可以通过设置请求头内容类型的方式来解决
七条猫
2024/11/27
1960
python进阶——人工智能实时目标跟踪
若不知道怎么安装opencv或者使用的请看我的这篇文章(曾上过csdn综合热榜的top1):
淼学派对
2023/10/14
4830
python进阶——人工智能实时目标跟踪
opencv 8 --背景减除 -- BackgroundSubtractorMOG2
例如顾客统计,使用一个静态摄像头来记录进入和离开房间的人数;或者是交通摄像头,需要提取交通工具的信息等。
wust小吴
2019/07/08
6.8K0
基于计算机视觉和OpenCV:创建一个能够计算道路交通流量的应用
本文将介绍如何在不需要大量的深度学习算法的情况下,基于计算机视觉来计算道路交通流量。本教程只使用Python和OpenCV,在背景差分算法的帮助下,实现非常简单的运动检测方法。 本项目所需要的代码: https://github.com/creotiv/object_detection_projects/tree/master/opencv_traffic_counting 主要内容 1.了解用于前景检测的背景差分算法的主旨 2.OpenCV图像滤波器 3.物体轮廓的检测 4.为进一步的数据操作构建处理
AiTechYun
2018/03/05
9800
基于计算机视觉和OpenCV:创建一个能够计算道路交通流量的应用
OpenCV源码系列|背景分割
应用场景:静态摄像头统计路过的行人数量,交通摄像头提取路过的交通车辆等。 技术核心:从静态的背景中把动态的物体提取并分割。 输入视频:打开摄像头,没有物体进入(仅仅做的截图) 输出视频:手机突然进入摄像头范围内 代码实现: #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/video.hpp" #include "opencv2/videoio.hpp" #include "opencv2
用户9831583
2022/06/16
2980
OpenCV源码系列|背景分割
基于OpenCV的区域分割、轮廓检测和阈值处理
OpenCV是一个巨大的开源库,广泛用于计算机视觉,人工智能和图像处理领域。它在现实世界中的典型应用是人脸识别,物体检测,人类活动识别,物体跟踪等。
小白学视觉
2020/09/29
2.6K0
基于OpenCV的区域分割、轮廓检测和阈值处理
Python3 OpenCV4 计算机视觉学习手册:6~11
与人眼和大脑相似,OpenCV 可以检测图像的主要特征并将其提取到所谓的图像描述符中。 然后可以将这些特征用作数据库,从而启用基于图像的搜索。 此外,我们可以使用关键点将图像拼接在一起并组成更大的图像。 (请考虑将许多图片组合在一起以形成 360° 全景图。)
ApacheCN_飞龙
2023/04/27
4.4K0
Python3 OpenCV4 计算机视觉学习手册:6~11
使用OpenCV和Python构建运动热图视频
OpenCV(或称为“ 开源计算机视觉”)是英特尔于1999年开发的一个库,主要针对计算机视觉和实时视频操作,它使用C ++编写,但受不同语言(包括Python)的支持。
代码医生工作室
2020/01/16
1.4K0
使用OpenCV和Python构建运动热图视频
OpenCV学习+常用函数记录④:形态学、模板匹配和运动检测
形态学变化是基于图像形状的一些简单操作。操作对象一般是二值图像,需要两个输入,一个是输入图像,另一个是3x3的结构元素(内核),决定了膨胀操作的本质。常见的操作是图像的膨胀和腐蚀。以及他们的进阶操作注入Opening、Closing、Gradient等等。
小黑鸭
2020/11/24
1K0
OpenCV学习:物体跟踪
HSV是一种将RGB色彩模型中的点在圆柱坐标系中的表示法。这种表示法试图做到比RGB基于笛卡尔坐标系的几何结构更加直观。HSV即色相、饱和度、明度(英语:Hue, Saturation, Value),又称HSB,其中B即英语:Brightness。[1]
烤粽子
2021/07/07
9140
OpenCV学习:物体跟踪
Python 数据科学入门教程:OpenCV
欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定。 OpenCV 用于各种图像和视频分析,如面部识别和检测,车牌阅读,照片编辑,高级机器人视觉,光学字符识别等等。
ApacheCN_飞龙
2022/12/01
1.4K0
Python 数据科学入门教程:OpenCV
实战 | 粘连物体分割与计数应用(二)--基于距离变换+分水岭算法 Halcon/OpenCV实现比较
本文主要介绍基于基于距离变换+分水岭算法实现粘连物体的分割与计数方法,并对比Halcon与OpenCV实现差异。
Color Space
2021/11/15
8K0
Python OpenCV3 计算机视觉秘籍:1~5
计算机视觉算法消耗并产生数据-它们通常将图像作为输入并生成输入的特征,例如轮廓,感兴趣的点或区域,对象的边界框或其他图像。 因此,处理图形信息的输入和输出是任何计算机视觉算法的重要组成部分。 这不仅意味着要读取和保存图像,还要显示有关其功能的其他信息。
ApacheCN_飞龙
2023/04/27
2K0
推荐阅读
相关推荐
计算机视觉 | Python OpenCV 3 使用背景减除进行目标检测
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档