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日

相关文章

  • ASP.NET页面在IE缓存的清除办法

    ASP.NET页面在IE缓存的清除办法是解决页面更新后在IE浏览器中出现缓存问题的一种方法。通常情况下,我们可以通过在服务器端设置缓存的过期时间或版本号来避免这个问题,但是有时候我们需要手动清除IE浏览器的缓存,以确保最新的页面被加载。 以下是ASP.NET页面在IE缓存的清除办法的完整攻略: 1. 使用 meta 标签设置缓存 在 HTML 的 head …

    人工智能概览 2023年5月25日
    00
  • Shell实现多级菜单系统安装维护脚本实例分享

    关于“Shell实现多级菜单系统安装维护脚本实例分享”的攻略,我将从以下几个方面进行详细讲述: 安装Shell 首先,要实现多级菜单系统安装维护脚本,需要安装Shell,Shell操作系统提供了很多有用的指令和功能,而安装Shell有很多种方式,因此前置条件应是你已经成功安装了Shell。如果你尚未安装Shell,请通过相关渠道进行安装。 编写Shell脚本…

    人工智能概览 2023年5月25日
    00
  • 独立部署小程序基于nodejs的服务器过程详解

    下面我来详细解释一下“独立部署小程序基于nodejs的服务器过程详解”的完整攻略,包含以下几个部分: 前提条件 安装Node.js和MongoDB 使用Express框架和Mongoose模块创建基于Node.js的服务端 部署服务端到云服务器上(以阿里云为例) 1. 前提条件 在开始独立部署小程序的服务器之前,需要具备以下技能: 熟悉Node.js和Exp…

    人工智能概论 2023年5月25日
    00
  • 递归删除二叉树中以x为根的子树

    递归删除二叉树中以x为根的子树是常见的二叉树操作之一,其核心是通过递归方式实现对二叉树节点的删除操作。下面是删除操作的完整攻略: 完整攻略 1. 确定要删除的节点 在删除二叉树中以x为根的子树时,需要先确定要删除的节点,即确定以x为根节点的子树。在实现过程中,可以通过先序遍历或后序遍历来获取子树的节点。 2. 递归删除节点 在确认了要删除的节点之后,需要实现…

    人工智能概览 2023年5月25日
    00
  • Python工程师必考的6个经典面试题

    下面我会详细讲解“Python工程师必考的6个经典面试题”的完整攻略。 1. 实现单例模式 单例模式指的是一个类只能创建一个实例。在Python中,实现单例模式有多种方法,包括使用装饰器、使用元类等。以下是使用装饰器的实现代码示例: def singleton(cls): instances = {} def wrapper(*args, **kwargs)…

    人工智能概览 2023年5月25日
    00
  • nginx,apache的alias和认证功能

    下面我将详细讲解 nginx 和 apache 的 alias 和认证功能的完整攻略。 nginx 的 alias 概述 alias 是 nginx 中的一个指令,作用是将 URI 中的一部分替换为另一路径。它的语法格式如下: location /path/ { alias /path/to/folder/; } 其中 /path/ 是代表了该位置的 URL…

    人工智能概览 2023年5月25日
    00
  • 阿里云CentOS7安装Mongodb教程

    阿里云CentOS7安装Mongodb教程 1. 安装Mongodb 首先,使用yum安装mongodb sudo yum install mongodb-org 安装完成后,启动mongodb服务,并将服务设置为开机自启动 sudo systemctl start mongod sudo systemctl enable mongod 最后,设置mongo…

    人工智能概览 2023年5月25日
    00
  • Vs2019+Qt+Opencv环境配置心得(图文)

    我的回答将包含以下内容: 环境准备 安装Qt 安装OpenCV 配置Qt和OpenCV的集成 示例说明 1. 环境准备 在开始配置Vs2019+Qt+OpenCV环境之前,我们需要确保以下环境已经搭建好: Visual Studio 2019 Qt 5.12 或以上版本 OpenCV 3.4.1 或以上版本 CMake 2. 安装Qt 首先,我们需要从Qt官…

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