简介

本篇博文将实现基于python的运动物体检测。

依赖库

opencv-python

基本动作检测

在计算机视觉中,我们把运动看作是环境的变化。为了计算转换,我们必须有一个背景图像来比较。所以,我们在程序的开头保存第一个图像。


# Converting the image to GrayScale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray,(21,21),0)
# Saving the First Frame
if first_frame is None:first_frame = graycontinue

然后,我们将后续帧与保存的第一帧进行比较,以观察差异。计算完差异后,我们可以应用阈值将其转换为黑白图像。

#Calculates difference to detect motion
delta_frame = cv2.absdiff(first_frame, gray)
#Applies Threshold and converts it to black & white image
thresh_delta = cv2.threshold(delta_frame, 30, 255, cv2.THRESH_BINARY)[1]
thresh_delta = cv2.dilate(thresh_delta, None, iterations=0)
#finding contours on the white portion(made by the threshold)
cnts,_ = cv2.findContours(thresh_delta.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

最后一个命令在该黑白图像中查找轮廓,并给出用于创建边界框的坐标,如上面的视频所示。使用运动检测的好处:

  • 它不会保存无用的空闲镜头。因此,减少了其他算法的工作量,因为不会保存空闲帧进行处理。

  • 它需要较少的计算,并且适合实时实施。

加强版

定期更新参照帧

给定的因素导致轮廓检测不理想,运动检测的幼稚方法会在执行开始时为所有比较保存第一帧。不好有几个原因:

  • 白天的照明条件可能会改变。

  • 天气变化。

  • 执行时相机被遮挡。

解决方案:在没有运动的情况下,可以通过定期定期更新保存的帧来轻松解决此问题。

# Number of idle frames to pass before changing the saved frame
# for further comparisions
FRAMES_TO_PERSIST = 1000

然后将其放在while循环中:

#increment delay counter for every idle frame
delay_counter += 1
#Update the saved first frame
if delay_counter > FRAMES_TO_PERSIST:delay_counter = 0first_frame = next_frame

过滤微小物体

当检测到运动时,将delay_counter设置为零,微小的物体(例如蜜蜂和昆虫)和通常不必要的轻微不必要的运动被存储起来。解决方案:如片段所示,我们应该在该区域设置一个阈值。

# Minimum boxed area(in pixels) for a detected motion to count as actual motion
# Use to filter out noise or small objects
MIN_SIZE_FOR_MOVEMENT = 2000

然后在while循环中放置一个if语句:

#Checks if the area is big enough to be considered as motion.
if cv2.contourArea(c) > MIN_SIZE_FOR_MOVEMENT:#Your code

完整代码

import cv2
import numpy as np
import timeclass VideoReader(object):def __init__(self, file_name):self.file_name = file_nametry:  # OpenCV needs int to read from webcamself.file_name = int(file_name)except ValueError:passdef __iter__(self):self.cap = cv2.VideoCapture(self.file_name)if not self.cap.isOpened():raise IOError('Video {} cannot be opened'.format(self.file_name))return selfdef __next__(self):was_read, img = self.cap.read()if not was_read:raise StopIterationreturn imgif __name__ == '__main__':frame_provider = VideoReader(0)FRAMES_TO_PERSIST = 50MIN_SIZE_FOR_MOVEMENT = 200delay_counter = 0first_frame = Nonedelay = 1for frame in frame_provider:start = time.time()# Converting the image to GrayScalegray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)gray = cv2.GaussianBlur(gray, (21, 21), 0)# Saving the First Frameif first_frame is None:first_frame = graycontinue# Calculates difference to detect motiondelta_frame = cv2.absdiff(first_frame, gray)# Applies Threshold and converts it to black & white imagethresh_delta = cv2.threshold(delta_frame, 30, 255, cv2.THRESH_BINARY)[1]thresh_delta = cv2.dilate(thresh_delta, None, iterations=0)# finding contours on the white portion(made by the threshold)cnts, _ = cv2.findContours(thresh_delta.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)if np.sum(np.where(thresh_delta > 0, 1, 0)) < MIN_SIZE_FOR_MOVEMENT:thresh_delta = np.zeros_like(gray)end = time.time()seconds = end - start# Calculate frames per secondprint(f"seconds: {seconds}")fps = 1 / secondsimgVis = np.dstack([thresh_delta for _ in range(3)])cv2.putText(imgVis, f"FPS: {int(fps)}", (50, 50),cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 255))cv2.imshow('Lightweight Human Pose Estimation Python Demo', imgVis)key = cv2.waitKey(delay)if key == 27:  # esccontinueelif key == 112:  # 'p'if delay == 1:delay = 0else:delay = 1# increment delay counter for every idle framedelay_counter += 1# Update the saved first frameif delay_counter > FRAMES_TO_PERSIST:delay_counter = 0first_frame = gray

动态物体检测(python)相关推荐

  1. (202103更新)海康威视网络摄像头sdk python版 (报错排查) 移动物体检测 多通道海康威视网洛摄像头后台检测 海康威视网络摄像头Python SDK

    海康威视网络摄像头Python SDK+移动物体位置检测 文末附 海康威视网络摄像头Python SDK 下载链接 本文参考博客 https://blog.csdn.net/c20081052/art ...

  2. DynaSLAM源码笔记-检测动态物体部分梳理

    按照main函数向下细分的顺序大概记录一下rgbd情况下,动态物体去除(inpaint的部分本篇不涉及)的源码的写法,并对应一下论文, 关于ORB-SLAM2本身的部分不会太涉及到. 安装方法见:关于 ...

  3. 机器视觉实用工具集NO.10——使用深度学习模型(yolo3)实现物体检测工具

    目录 前言 opencv+YOLO3实现物体检测 python源码 前言 OpenCV 3.3版本之后提供了对主流深度学习主干网络框架的加载支持.opencv给我们提供了一个应用成熟深度学习模型的便捷 ...

  4. 教你在Python中构建物体检测系统(附代码、学习资料)

    作者:FAIZANSHAIKH 翻译:闫晓雨 校对:张玲 本文约3200字,建议阅读10分钟. 本文介绍物体检测技术以及解决此领域问题的几种不同方法,带你深入研究在Python中如何构建我们自己的对象 ...

  5. python 提取最小外接矩形_放弃机器学习框架,如何用 Python 做物体检测?

    每当我们听说"物体检测"时,就会想到机器学习和各种不同的框架.但实际上,我们可以在不使用机器学习或任何其他框架的情况下进行物体检测.在本文中,我将向你展示如何仅使用Python进行 ...

  6. 基于python的移动物体检测_感兴趣区域的移动物体检测,框出移动物体的轮廓 (固定摄像头, opencv-python)...

    感兴趣区域.特定区域.框出移动物体的轮廓.越界检测.入侵物体检测.使用 opencv-python库的函数cv2.findContours.cv2.approxPolyDP.cv2.arcLength ...

  7. 放弃机器学习,Python 如何进行物体检测?

    学习在不使用机器学习或任何框架的情况下,如何在Python中进行物体检测. 作者 | Ravindu Senaratne 译者 | 弯月,责编 | 屠敏 头图 | CSDN 下载自视觉中国 出品 | ...

  8. (Python)从零开始,简单快速学机器仿人视觉Opencv---运用二:物体检测

    教程: 博主之前写了22节关于使用OpenCV的教程,欢迎大家阅读: (Python)从零开始,简单快速学机器仿人视觉Opencv-第一节:OpenCV的图像读取显示及保存 (Python)从零开始, ...

  9. 传统运动物体检测方法的Python实现

    传统运动物体检测方法的Python实现 文章目录 传统运动物体检测方法的Python实现 一.目标跟踪算法综述 1. 传统方法:特征提取+滤波类搜索算法 2. 深度学习方法: 目标检测和相似度匹配 二 ...

  10. 用python做视觉检测系统_教你用 Python 做一个物体检测系统

    在本文中,我们将了解物体检测技术是什么以及可以用来解决此领域问题的几种不同方法,接着深入研究在Python中如何构建我们自己的对象检测系统.在本文结束时,您将拥有足够的知识来独自迎接不同的物体检测挑战 ...

最新文章

  1. python安装cv2模块_pythonimportcv2importError:DLLloadfailed:找不到指定模块
  2. 如何接受上级指令_向上级领导汇报工作是经常的,想得赏识,了解如何接受上级的命令...
  3. ensp小实验走起来(路由下发、MSTP、VRRP、DHCP、DHCP中继、NAT、链路聚合)之配置
  4. javascript --- 从数组中,找出比给定元素大一丁点的元素
  5. C++:vs2017编写代码时的光标变成了黑块,选中字时替换掉了黑块选中的字【解决办法】
  6. Windows下FFmpeg各版本库文件下载
  7. jQuery EasyUI 下拉菜单获取日期,最高年份为当前年份,最低年份为当前年份向前推10年...
  8. C#多线程池演示例程--下载图片
  9. C# Dictionary 的几种遍历方法
  10. 用c 语言写21点游戏,求一c语言程序 :21点游戏代码
  11. vm14卡顿及安装linux黑屏问题
  12. windowns server 2008 R2激活工具(含win7、vista)
  13. typora mac快捷键
  14. WSO2 ESB 5.0.0 配置 MySQL 数据源
  15. Android Gradle Build Error:Some file crunching failed, see logs for details解决办法
  16. 2022CTFSHOW菜狗杯部分MISC(二)
  17. Scoks5 一键搭建脚本,解决nolanjdc被限制IP
  18. 神经网络系列之四 -- 线性回归方法与原理
  19. 服务器系统和操作系统有什么区别
  20. 白盒测试方法的简单理解(通俗易懂)

热门文章

  1. NI-9253 C系列电流输入模块-9253
  2. 【web前端HTML5+CSS3】01HTML--基础知识
  3. 软件开发UI设计流程
  4. 传送带计数器c语言程序,脉搏计数器的程序(用C语言编写程序)
  5. 创客集结号:3D打印技术的FDM技术与SLA技术
  6. mysql创建数据库_MySQL创建数据库的两种方法
  7. 窗口大小不规范,教你怎么写默认窗口
  8. 研究生预备军:论文选题与写作
  9. c语言求余的方法,c语言求余的实现方法_后端开发
  10. 如何快速集成短信验证码API[图文教程]