Python使用背景差分器实现运动物体检测

下面是详细讲解“Python使用背景差分器实现运动物体检测”的完整攻略:

1. 背景差分器简介

背景差分器是指为了找出视频中动态目标而对连续的视频图像序列进行比较的算法。在背景差分器中,将连续帧之间的差异转换成二进制图像。通过二值图像来确定运动像素,从而检测可以被视为“运动”的物体。

2. Python背景差分器实现运动物体检测步骤

在Python中,可以通过使用OpenCV库函数BackgroundSubtractorMOG2来实现背景差分器实现运动物体检测。下面是实现步骤:

  1. 导入需要的库:
import cv2
import numpy as np
  1. 定义BackgroundSubtractorMOG2对象:
fgbg = cv2.createBackgroundSubtractorMOG2(history=50, varThreshold=50, detectShadows=False)
  1. 读入视频流:
cap = cv2.VideoCapture('test.mp4')
  1. 循环处理每一帧图像:
while(1):
    ret, frame = cap.read() # 获取读取状态和图像帧
  1. 对每帧图像进行预处理:
    # 转化为灰色图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    # 高斯模糊处理 
    gray = cv2.GaussianBlur(gray, (3,3), 0) 
  1. 使用createBackgroundSubtractorMOG2进行背景差分计算,并得到运动物体的图像:
    fgmask = fgbg.apply(gray) 
  1. 对运动物体的图像进行二值化处理:
    ret, binary = cv2.threshold(fgmask, 127, 255, cv2.THRESH_BINARY) 
  1. 将检测到的运动物体用矩形框圈出来,并显示图像:
    contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 
    for c in contours: 
        rect = cv2.boundingRect(c) 
        if rect[2] < 100 or rect[3] < 100: # 忽略太小的矩形框 
            continue
        cv2.rectangle(frame, rect, (0, 255, 0), 2) 
    cv2.imshow('frame', frame) 
  1. 进行如下的清理工作,避免内存不足:
    k = cv2.waitKey(30) & 0xff 
    if k == 27: 
        break 
cap.release() 
cv2.destroyAllWindows()

3. 示例说明

下面提供两个示例,说明如何使用Python背景差分器实现运动物体检测。

示例1:检测视频中的自行车

假设我们有一个视频文件bike.mp4,它记录了一个骑自行车的人。现在,我们想要检测自行车在视频中的运动,并标出运动物体的方框。

import cv2
import numpy as np

# 定义BackgroundSubtractorMOG2对象
fgbg = cv2.createBackgroundSubtractorMOG2(history = 50, varThreshold = 50, detectShadows = False)

# 读入视频流
cap = cv2.VideoCapture('bike.mp4')

while(1):

    ret, frame = cap.read() # 获取读取状态和图像帧

    # 转化为灰色图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 高斯模糊处理
    gray = cv2.GaussianBlur(gray, (3,3), 0)

    # 使用createBackgroundSubtractorMOG2进行背景差分计算,并得到运动物体的图像
    fgmask = fgbg.apply(gray)

    # 对运动物体的图像进行二值化处理
    ret, binary = cv2.threshold(fgmask, 127, 255, cv2.THRESH_BINARY)

    # 将检测到的运动物体用矩形框圈出来,并显示图像
    contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
        rect = cv2.boundingRect(c)
        if rect[2] < 100 or rect[3] < 100: # 忽略太小的矩形框
            continue
        cv2.rectangle(frame, rect, (0, 255, 0), 2)

    # 显示视频流
    cv2.imshow('frame', frame)

    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

示例2:检测实时摄像头中的运动物体

假设我们有一个开启的摄像头或视频流,想要进行实时的运动物体检测。下面给出示例代码:

import cv2
import numpy as np

# 定义BackgroundSubtractorMOG2对象
fgbg = cv2.createBackgroundSubtractorMOG2(history = 50, varThreshold = 50, detectShadows = False)

# 读入视频流
cap = cv2.VideoCapture(0)

while(1):

    ret, frame = cap.read() # 获取读取状态和图像帧

    # 转化为灰色图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 高斯模糊处理
    gray = cv2.GaussianBlur(gray, (3,3), 0)

    # 使用createBackgroundSubtractorMOG2进行背景差分计算,并得到运动物体的图像
    fgmask = fgbg.apply(gray)

    # 对运动物体的图像进行二值化处理
    ret, binary = cv2.threshold(fgmask, 127, 255, cv2.THRESH_BINARY)

    # 将检测到的运动物体用矩形框圈出来,并显示图像
    contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for c in contours:
        rect = cv2.boundingRect(c)
        if rect[2] < 100 or rect[3] < 100: # 忽略太小的矩形框
            continue
        cv2.rectangle(frame, rect, (0, 255, 0), 2)

    # 显示视频流
    cv2.imshow('frame', frame)

    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

通过以上的示例说明,可以看出如何使用Python和OpenCV实现背景差分器的运动物体检测。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python使用背景差分器实现运动物体检测 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 修改Nginx与Apache上传文件大小限制

    针对修改Nginx和Apache上传文件大小限制的问题,我将为您分享以下完整攻略。 修改Nginx上传文件大小限制 Nginx的上传文件大小限制包括两个参数,分别为client_max_body_size和client_body_buffer_size。 1. 修改client_max_body_size 第一步,修改Nginx配置文件中的client_ma…

    人工智能概览 2023年5月25日
    00
  • 联想拯救者Y9000P 2022款值得入手吗 联想拯救者Y9000P 2022游戏本深度评测

    联想拯救者Y9000P 2022款的评测 一、外观设计 联想拯救者Y9000P 2022款采用了与上一代相同的黑色金属机身,看起来非常稳重、沉稳。机身采用了镜面印花技术和雾面工艺,让整体外观更加细腻,而且不容易留下指纹和污渍。键盘背光也经过了升级,按下键盘之后的反馈更加顺畅,手感更加舒适。 另外,拯救者Y9000P 2022款还加入了最新的2.5K OLED…

    人工智能概览 2023年5月25日
    00
  • Python的shutil模块中文件的复制操作函数详解

    Python的shutil模块中文件的复制操作函数详解 shutil模块是Python标准库中的一个文件操作模块,其提供了一系列功能强大的文件操作函数,其中就包括文件复制操作。 shutil模块中常用的文件复制函数 shutil.copy(src, dst, *, follow_symlinks=True) 函数描述:将文件从src复制到dst。 参数说明:…

    人工智能概览 2023年5月25日
    00
  • dpn网络的pytorch实现方式

    下面是关于“dpn网络的pytorch实现方式”的完整攻略: DPN网络简介 DPN(Dual Path Network)网络是一种深度卷积神经网络。与传统的卷积神经网络不同,DPN网络引入了双向路径机制,以提高网络的性能和稳定性。其核心思想是将特征图分成两个路径,分别进行特征提取和特征融合。 DPN网络的pytorch实现方式 下面是DPN网络的pytor…

    人工智能概论 2023年5月25日
    00
  • Tomcat用户管理的优化配置详解

    Tomcat用户管理的优化配置详解 Tomcat用户管理是管理Tomcat应用程序访问和授权的重要组成部分。通过优化Tomcat用户管理配置,可以提高应用程序的安全性和可用性。 1. HTTPS协议配置 使用HTTPS协议可以增强应用程序的安全性,防止密码、用户数据等敏感信息被黑客窃取。使用以下步骤在Tomcat中配置HTTPS协议: 按照 Tomcat官方…

    人工智能概览 2023年5月25日
    00
  • python 常用的异步框架汇总整理

    Python 常用的异步框架汇总整理 什么是异步编程? 在传统的同步编程中,代码按照从上至下的顺序依次执行,当前执行的代码需要等待上一个代码执行完后才能进行。但是在异步编程中,代码的执行顺序是非连续的,当前代码的执行不会等待之前的代码执行完毕。 异步编程的目的是为了提高程序的效率和响应速度,特别是在涉及到网络等I/O操作时,异步编程可以有效地减少等待时间,提…

    人工智能概论 2023年5月25日
    00
  • 对Pytorch 中的contiguous理解说明

    PyTorch中的contiguous是很常见的一个方法,并且在使用PyTorch进行深度学习时很重要。 什么是contiguous contiguous方法用来判断张量是否是内存上连续存储的,即张量的每个元素在内存中是按照连续顺序存储的,并且元素之间没有空隙。如果张量是内存上连续存储的,那么对于一些操作如transpose或reshape等操作,就可以直接…

    人工智能概论 2023年5月25日
    00
  • Python实现计算AUC的示例代码

    当我们需要度量一个分类模型的性能时,我们经常会使用一些指标,比如准确率,召回率和F1-Score等。其中,AUC (Area Under the ROC Curve) 指标比较适合用于分类器在非平衡(不同类别样本数量有差别)数据集上进行评价。本文将会提供一个Python示例,展示如何使用一些常用的Python库来计算模型的AUC。 实现AUC的计算 要计算A…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部