利用opencv进行移动物体检测
进行运动物体检测就是将动态的前景从静态的背景中分离出来。将当前画面与假设是静态背景进行比较发现有明显的变化的区域,就可以认为该区域出现移动的物体。在实际情况中由于光照阴影等因素干扰比较大,通过像素直接进行比较往往很容易造成误检。因此有不少算法被开发出来在进行前后景分离的时候对运动和其他因素造成的变动进行区分。opencv中提供了多种背景减除的算法,其中基于高斯混合模型(GMM)的cv2.BackgroundSubtractorMOG()
和cv2.BackgroundSubtractorMOG2()
已经基于贝叶斯模型的cv2.bgsegm.createBackgroundSubtractorGMG()
最为常用。
1) GMM法
GMM进行前后景分离最早是在2001年的文章An improved adaptive background mixture model for real-time tracking with shadow detection
中提出的。其设计思路为:
- 在不知道图像历史的时候,假设每个像素点的值都是可以分解为一组adaptive Gaussian。adaptive是由于需要跟随光照条件的变化而变化。
- 像素值的历史由一组高斯分布进行建模,包括每个分布的权重。
- 每次新图像输入的时候都会用这一组高斯分布进行评估,如果像素匹配上其中一个分布就会认为这个像素属于背景,而高斯分布的均值和方差等参数会用当前像素的值进行更新。
- 标记为前景的像素通过connected component analysis进行分组。
opencv的cv2.BackgroundSubtractorMOG()
的函数就是对次方法的实现。
基于2004年提出的Improved adaptive Gausian mixture model for background subtractio
和2006年提出的Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction
算法对上述GMM算法进行改良的就是opencv的cv2.BackgroundSubtractorMOG2()
的函数。主要的提升是对每个像素都选择合适数量的高斯分布而非原来的全部相同的个数。此外,这个函数还允许是否检测阴影。
使用方法(以MOG2为例)
import cv2cam = cv2.VideoCapture(0)fgbg = cv2.createBackgroundSubtractorMOG()
while cam.isOpened():ret, frame = cam.read()if ret:fgmask = fgbg.apply(frame)# 通过腐蚀和膨胀过滤一些噪声erode = cv2.erode(fgmask, (21, 21), iterations=1)dilate = cv2.dilate(fgmask, (21, 21), iterations=1)(_, cnts, _) = cv2.findContours(dilate.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in cnts:c_area = cv2.contourArea(c)if c_area < 1600 or c_area > 16000: # 过滤太小或太大的运动物体,这类误检概率比较高continue(x, y, w, h) = cv2.boundingRect(c)cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)cv2.imshow("origin", frame)if cv2.waitKey(1) == ord('q'):break
cv2.destroyAllWindows()
2)GMG法
根据2012年的文章Visual Tracking of Human Visitors under Variable-Lighting Conditions for a Responsive Audio Art Installation
, opencv开发了相应的函数cv2.bgsegm.createBackgroundSubtractorGMG()
(好像在3.2中被放到了contrib中,在之前可以直接用cv2.createBackgroundSubtractorGMG()
进行调用)。这个方法默认使用前120张图片进行背景的建模,并使用概率前景分割算法找到可能的前景(基于贝叶斯推测)。为了更好适应不同光照变化的影响,新的图片的权重比旧图片要高。
使用方法
cam = cv2.VideoCapture(0)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (8, 8))
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG(initializationFrames=10)
while cam.isOpened():ret, frame = cam.read()if ret:fgmask = fgbg.apply(frame)fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel) # 过滤噪声(_, cnts, _) = cv2.findContours(dilate.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in cnts:c_area = cv2.contourArea(c)if c_area < 1600 or c_area > 16000: # 过滤太小或太大的运动物体,这类误检概率比较高continue(x, y, w, h) = cv2.boundingRect(c)cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)cv2.imshow("origin", frame)if cv2.waitKey(1) == ord('q'):break
cv2.destroyAllWindows()
参考:
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_video/py_bg_subtraction/py_bg_subtraction.html
- http://android4arduino.com/computer-vision/motion-detection/
- https://www.pyimagesearch.com/2015/05/25/basic-motion-detection-and-tracking-with-python-and-opencv/
- https://docs.opencv.org/3.0-beta/modules/video/doc/motion_analysis_and_object_tracking.html?highlight=createbackgroundsubtractormog
转载于:https://www.cnblogs.com/arkenstone/p/8560846.html
利用opencv进行移动物体检测相关推荐
- IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测
IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测 环境配置 Python3.5 既然是windows下用python,那就不要作死自己弄环境了,直接用ana ...
- 利用OpenCV实现人眼的检测与跟踪
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 本篇博文的基础是 利用OpenCV的级联分类器 ...
- 利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解
为了更好地看懂本文,大家可以先看下我写的另一篇博文,链接如下: https://blog.csdn.net/wenhao_ir/article/details/51774444 OpenCV的霍夫变换 ...
- Python中利用Opencv进行车牌号检测
初学Python.Opencv,想用它做个实例解决车牌号检测. 车牌号检测需要分为四个部分:1.车辆图像获取.2.车牌定位.3.车牌字符分割和4.车牌字符识别 在百度查到了车牌识别部分车牌定位和车牌字 ...
- 利用opencv霍夫变检测中国象棋的外形——圆
今天将opencv的霍夫变换修改并优化了一下,就是先预处理,切割.二值化.去噪之后进行霍夫变换,效果还不错,从识别70多个圆,慢慢修改到识别32个圆. 效果如下: 原理毛星云写的就很好,他的文章链接: ...
- 利用opencv对图像和检测框做任意角度的旋转
一.钢筋比赛中的数据扩充 #coding:utf-8 #数据集扩增 import cv2 import math import numpy as np import xml.etree.Elemen ...
- opencv 手选roi区域_利用opencv进行眼动检测
- JAVA物体运动检测_基于OpenCv的运动物体检测算法
#include #include #include #include int main( int argc, char** argv ) //声明IplImage指针 IplImage* pFram ...
- opencv快速入门人脸检测与人脸识别
让"它"认得你 --利用opencv快速入门人脸检测与人脸识别 opencv,顾名思义"开源,计算机视觉".OpenCV就是这样的一个特殊的框架,一群大牛然绕自 ...
最新文章
- Observer Pattern分析
- hdu 6185 Covering 矩阵快速幂
- easyui js解析字符串_EasyUI Dialog弹出框+JS执行字符串
- 在linux上使用cvs命令
- 网络推广软文之文章更新对网站排名的影响!
- PHP的composer dump-autoload
- 《数据管理能力成熟度模型》标准宣贯会在上海召开
- Sentinel介绍和Windows下安装Sentinel-dashboard
- Diango博客--18.使用 Fabric 自动化部署 Django 项目
- 计算机组成原理双端口存储器实验,计算机组成原理双端口存储器实验报告.doc...
- NYOJ-独木舟上的旅行(贪心)
- 2020计算机二级office高级应用,2020计算机二级ms-office高级应用试题.docx
- gba徽章机器人_《徽章机器人》倒计时网站开启 20周年纪念插画欣赏
- Swift3数组编辑
- 步进电机正反转实验_电机正反转控制电路图原理图解
- 高中生如何结合生物思维导图做好知识点整理?
- asp代码加密方法及破解
- MAXON宣布任命高级领导人员
- 关于计算机的英语手抄报简单,英语手抄报简单又好看图片
- 基于exif信息进行图片方向旋转修正