使用Python,OpenCV从静态背景中提取移动前景
使用Python,OpenCV从静态背景中提取移动前景
- 1. 效果图
- 2. 原理
- 3. 源码
- 参考
这篇博客将介绍OpenCV中的背景减法方法——即从静态背景中提取移动前景。在许多基于视觉的应用中,背景减法是一个主要的预处理步骤。
例如考虑像访客柜台这样的情况,其中静态摄像头记录进出房间的访客数量,或者交通摄像头提取有关车辆的信息等。在所有这些情况下,首先需要单独提取人或车辆。从技术上讲需要从静态背景中提取移动前景。
OpenCV3.0开始提供了1、2、3个方法,OpenCV4.0后减少了1、3方法,增加了4,只支持2、4俩个方法:cv2.createBackgroundSubtractorMOG2()、cv2.createBackgroundSubtractorKNN();
- BackgroundSubtractorMOG
- BackgroundSubtractorMOG2
- BackgroundSubtractorGMG
- BackgroundSubtractorKNN
1. 效果图
以OpenCV 4.1. 2.30为例
效果图分4块,分别为 法2 不检测阴影 VS 检测阴影 VS 法4 不检测阴影 VS 检测阴影:
可以看出 不检测阴影与检测阴影,基本无差别;
KNN检测到的背景要比MOG检测到的阴影更清晰一些
噪音少一些,效果图2如下:
2. 原理
OpenCV3.0开始提供了1、2、3个方法,OpenCV4.0后减少了1、3方法,增加了4,只支持2、4;
1. BackgroundSubtractorMOG
它是一种基于高斯混合的背景/前景分割算法。它使用一种方法通过混合 K 高斯分布对每个背景像素进行建模( K = 3 到 5)。混合物的权重表示这些颜色留在场景中的时间比例。可能的背景颜色是那些保持更长时间和更静态的颜色。
首先使用函数 cv2.createBackgroundSubtractorMOG() 创建一个背景对象。它有一些可选参数,如历史长度、高斯混合数、阈值等。它们都设置为一些默认值。然后在视频循环中,使用 backgroundsubtractor.apply() 方法获取前景蒙版。
2. BackgroundSubtractorMOG2
它也是一种基于高斯混合的背景/前景分割算法。该算法的一个重要特点是它为每个像素选择适当数量的高斯分布。由于光照变化等,它可以更好地适应不同的场景。
首先使用函数 cv2.createBackgroundSubtractorMOG2() 创建一个背景减法器对象,可以选择是否检测阴影(默认为false,设置detectShadows = True),它会检测并标记阴影,但会降低速度。阴影将以灰色标记。
3. BackgroundSubtractorGMG
该算法结合了统计背景图像估计和逐像素贝叶斯分割。它使用前几个(默认120)帧进行背景建模。它采用概率前景分割算法,使用贝叶斯推理识别可能的前景对象。估计是自适应的;较新的观察比旧的观察具有更大的权重以适应可变照明。完成了几个形态过滤操作,如关闭和打开,以去除不需要的噪声。在前几帧中,您将看到一个黑色窗口。最好对结果应用形态学开运算以去除噪声。
4. BackgroundSubtractorKNN
3. 源码
# 背景减法
import numpy as np
import cv2cap = cv2.VideoCapture('images/slow_traffic_small.mp4')# 1. BackgroundSubtractorMOG2, 3. BackgroundSubtractorGMG OpenCV4不支持;
# 2. BackgroundSubtractorMOG2
# 4. BackgroundSubtractorKNN
fgbg = cv2.createBackgroundSubtractorMOG2()
fgbg_shadow = cv2.createBackgroundSubtractorMOG2(detectShadows=True)
fgbgKnn = cv2.createBackgroundSubtractorKNN()
fgbgKnn_shadow = cv2.createBackgroundSubtractorKNN(detectShadows=True)while (1):ret, frame = cap.read()if not ret:breakfgmask = fgbg.apply(frame)fgmask_shadow = fgbg_shadow.apply(frame)fgmaskKnn = fgbgKnn.apply(frame)fgmaskKnn_shadow = fgbgKnn_shadow.apply(frame)cv2.imshow('frame VS frame_shadow \n frameKnn VS frameKnn_shadow',np.vstack([np.hstack([fgmask, fgmask_shadow]), np.hstack([fgmaskKnn, fgmaskKnn_shadow])]))cv2.waitKey(0)k = cv2.waitKey(30) & 0xffif k == 27:breakcap.release()
cv2.destroyAllWindows()
参考
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_video/py_bg_subtraction/py_bg_subtraction.html#py-background-subtraction
使用Python,OpenCV从静态背景中提取移动前景相关推荐
- Python+OpenCV利用KNN背景分割器进行静态场景行人检测与轨迹跟踪
前言 视频图像中的目标检测与跟踪,是计算机视觉的基础课题,同时具有广泛的应用价值.视觉目标(单目标)跟踪任务就是在给定某视频序列初始帧的目标大小与位置的情况下,预测后续帧中该目标的大小与位置.本篇文章 ...
- Python OpenCV分水岭算法分割和提取重叠或有衔接的图像中的对象
本文将介绍如何使用分水岭算法对触摸和重叠的图像中的对象进行分割和提取. 参考:https://www.pyimagesearch.com/2015/11/02/watershed-opencv/ 分水 ...
- [转载] 使用Python+OpenCV实现在视频中某对象后添加图像
参考链接: Python Opencv 基础3 : resize 调整图像大小 概述 在运动物体后面添加图像是一个典型的计算机视觉项目了解如何使用传统的计算机视觉技术在视频中添加logo 介绍 我的一 ...
- 使用Python+OpenCV实现在视频中某对象后添加图像
概述 在运动物体后面添加图像是一个典型的计算机视觉项目 了解如何使用传统的计算机视觉技术在视频中添加logo 介绍 我的一位同事向我提出了一个挑战--建立一个计算机视觉模型,可以在视频中插入任何图像, ...
- 使用 PyTesseract 和 OpenCV 从表格图像中提取文本
Text Extraction from a Table Image, using PyTesseract and OpenCV – Fazlur Rahmanhttps://fazlurnu.com ...
- 生物信息中的Python 05 | 从 Genbank 文件中提取 CDS 等其他特征序列
1 介绍 在基因结构分析或其他生物功能分析中会时常用到 CDS 序列,以及其他诸如 mRNA 序列,misc RNA序列等具有生物意义的序列片段.而NCBI 的基因库中已经包含有这些的信息,但是只有一 ...
- python提取excel表中的数据_用python从excel工作表中提取和操作数据
场景:我正在尝试编写一个python代码,它读取给定文件夹中的所有工作簿,获取每个工作簿的数据并将其放入单个数据帧中(每个工作簿都成为一个数据框,因此我可以单独操作它们).在 问题1:对于此代码,即使 ...
- python显示dgn_在 Workbench中提取和使用日志信息
原标题:在 Workbench中提取和使用日志信息 ·FailTruncated.fmw ·GetAffineParameters.fmwt ·DGNMetadata.fmwt 二.使用Python ...
- Python:如何从字符串中提取字母或数字?
从字符串中提取字母 s = 'cn中国520' print(''.join([i for i in s if i.encode('UTF-8').isalpha()]))# 输出:cn 注意:中文的汉 ...
最新文章
- binlog关闭事务记录_Mysql 数据库 InnoDB引擎对binlog_format的限制
- “机器换人”没什么可抱怨
- 使用layui框架时,在input文本框中显示当前页面时间的方法
- 在Java中避免NullPointerException
- [翻译]当jQuery遭遇CoffeeScript的时候——妙,不可言
- primefaces_Primefaces AccordionPanel组件示例
- Spring使用经验之Listener综述
- 还原氧化石墨烯(RGO)的结构电极-供应三维石墨烯结构体/高质量石墨烯/石墨烯铜基复合材料/基于碳化硅生长高质量石墨烯/片层厚度可调控高质量石墨烯定制
- 共享电动车风云再起,市场如何才能有序?
- 【PAT】敲笨钟 (20 分)
- 第十篇:React 中的“栈调和”(Stack Reconciler)过程是怎样的?
- 在TPU上运行PyTorch的技巧总结
- HDU 1069 DP
- div布局三栏-左中右
- 如何使用Zend Expressive建立NASA照片库
- JavaScript正则表达式分组模式:捕获性分组与非捕获性分组及前瞻后顾(断言)
- 降噪蓝牙耳机推荐什么牌子好?入耳式降噪蓝牙耳机推荐
- .MMAP是什么格式?
- 关于type_info与typeid
- Rayland-FDM打印机C200介绍
热门文章
- 用gogs搭建属于自己的git网站
- DCN-cs6200 ipv6 6to4隧道
- CSS grid 的用法
- android.content.res.Resources$NotFoundException: String resource ID #0x1
- Linux批量查找与替换
- 宜家通信- 会员管理 表结构搭建
- 【转载】Linux 软件安装到 /usr,/usr/local/ 还是 /opt 目录?
- Appium的Java封装
- centos7+ansible自动化工具使用
- 2022-2028年中国肉制品行业市场调查研究及前瞻分析报告