• 背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术。

  • 顾名思义,BS计算前景掩码,在当前帧与背景模型之间执行减法运算,其中包含场景的静态部分,或者更一般而言,考虑到所观察场景的特征,可以将其视为背景的所有内容。

背景建模包括两个主要步骤:

1.背景初始化;

2.背景更新。

第一步,计算背景的初始模型,而在第二步中,更新模型以适应场景中可能的变化。

在本教程中,我们将学习如何使用OpenCV中的BS。

目标

在本教程中,您将学习如何:

1.使用cv::VideoCapture从视频或图像序列中读取数据;

2.通过使用cv::BackgroundSubtractor类创建和更新背景类;

3.通过使用cv::imshow获取并显示前景蒙版。

代码

在下面,您可以找到源代码。我们将让用户选择处理视频文件或图像序列。在此示例中,我们将使用cv::BackgroundSubtractorMOG2生成前景掩码。

结果和输入数据将显示在屏幕上。

from __future__ import print_function
import cv2 as cv
import argparse
parser = argparse.ArgumentParser(description='This program shows how to use background subtraction methods provided by \OpenCV. You can process both videos and images.')
parser.add_argument('--input', type=str, help='Path to a video or a sequence of image.', default='vtest.avi')
parser.add_argument('--algo', type=str, help='Background subtraction method (KNN, MOG2).', default='MOG2')
args = parser.parse_args()
if args.algo == 'MOG2':backSub = cv.createBackgroundSubtractorMOG2()
else:backSub = cv.createBackgroundSubtractorKNN()
capture = cv.VideoCapture(cv.samples.findFileOrKeep(args.input))
if not capture.isOpened:print('Unable to open: ' + args.input)exit(0)
while True:ret, frame = capture.read()if frame is None:breakfgMask = backSub.apply(frame)cv.rectangle(frame, (10, 2), (100,20), (255,255,255), -1)cv.putText(frame, str(capture.get(cv.CAP_PROP_POS_FRAMES)), (15, 15),cv.FONT_HERSHEY_SIMPLEX, 0.5 , (0,0,0))cv.imshow('Frame', frame)cv.imshow('FG Mask', fgMask)keyboard = cv.waitKey(30)if keyboard == 'q' or keyboard == 27:break

解释

我们讨论上面代码的主要部分:

  • 一个cv::BackgroundSubtractor对象将用于生成前景掩码。在此示例中,使用了默认参数,但是也可以在create函数中声明特定的参数。

#创建背景分离对象
if args.algo == 'MOG2':backSub = cv.createBackgroundSubtractorMOG2()
else:backSub = cv.createBackgroundSubtractorKNN()
  • 一个cv::VideoCapture对象用于读取输入视频或输入图像序列。

capture = cv.VideoCapture(cv.samples.findFileOrKeep(args.input))
if not capture.isOpened:     print('Unable to open: ' + args.input)exit(0)
  • 每帧都用于计算前景掩码和更新背景。如果要更改用于更新背景模型的学习率,可以通过将参数传递给apply方法来设置特定的学习率。

    #更新背景模型fgMask = backSub.apply(frame)
  • 当前帧号可以从cv::VideoCapture对象中提取,并标记在当前帧的左上角。白色矩形用于突出显示黑色的帧编号。

    #获取帧号并将其写入当前帧cv.rectangle(frame, (10, 2), (100,20), (255,255,255), -1)cv.putText(frame, str(capture.get(cv.CAP_PROP_POS_FRAMES)), (15, 15),cv.FONT_HERSHEY_SIMPLEX, 0.5 , (0,0,0))
  • 我们准备显示当前的输入框和结果。

    #展示当前帧和背景掩码cv.imshow('Frame', frame)cv.imshow('FG Mask', fgMask)

结果

  • 对于vtest.avi视频,适用以下框架:

MOG2方法的程序输出如下所示(检测到灰色区域有阴影):

对于KNN方法,程序的输出将如下所示(检测到灰色区域的阴影):

参考

  • Background Models Challenge (BMC) website

  • A Benchmark Dataset for Foreground/Background Extraction

☆☆☆为方便大家查阅,小编已将OpenCV-Python专栏文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“文章”,如图:或点击下方“阅读原文”,进入OpenCV-Python专栏,即可查看系列文章。

不断更新资源

获取更多精彩

长按二维码扫码关注

OpenCV系列之如何使用背景分离方法 | 四十六相关推荐

  1. “约见”面试官系列之常见面试题之第四十六篇web标准理解和认识(建议收藏)

    web标准简单来说可以分为结构.表现和行为.其中结构主要是有HTML标签组成.或许通俗点说,在页面body里面我们写入的标签都是为了页面的结构.表现即指css样式表,通过css可以是页面的结构标签更具 ...

  2. 【OCR】图像预处理-文字背景分离方法

    1. 摘要 在OCR处理文档时,经常会遇到自然拍照场景中由于光照强度不一.拍摄角度不同.相机成像元件差异,因此会导致拍摄的图片与扫描文档存在较大区别.为使文档文字内容更加鲜明,便于后续特征提取,本文目 ...

  3. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

  4. [系统安全] 四十六.Powershell恶意代码检测系列 (1)Powershell基础入门及管道和变量的用法

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  5. Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十六(商品排序,Thymeleaf快速入门,商品详情页的展示)

    Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十六(商品详情页的展示) 一.商品排序 1.完善页面信息 这是用来做排序的,默认按照综合排序 ...

  6. Opencv实战(一) 视频人数统计(C++ Opencv)前后背景分离方法

    在博客<视频人数统计(opencv)>中,作者使用的Absdiff帧差法降低背景影响,进而通过二值化,边缘化,滤波器,形态学变化,查找轮廓,轮廓面积控制,绘制轮廓等一系列方法完成了对样例图 ...

  7. OpenCV40:使用背景分离方法

    目标 在本章中,将学习: 背景分离(Background Subtraction) OpenCv函数cv2.VideoCapture, cv2.BackgroundSubtractor 理论 背景分离 ...

  8. 前景背景分离方法(二)高斯混合模型法GMM(Gaussian Mixture Model)

    int main() {VideoCapture capture("D:/videos/shadow/use3.MPG");if( !capture.isOpened() ){co ...

  9. OpenCV系列之直方图4:直方图反投影 | 二十九

    目标 在本章中,我们将学习直方图反投影. 理论 这是由Michael J. Swain和Dana H. Ballard在他们的论文<通过颜色直方图索引>中提出的. 用简单的话说是什么意思? ...

最新文章

  1. Elasticsearch 参考指南(重要的系统配置)
  2. 后端码农谈前端(HTML篇)第三课:常见属性
  3. 信息学奥赛一本通 1006:A+B问题 | OpenJudge NOI 1.3 01
  4. 网站 html 中英文切换 - API 总结篇
  5. php dirname(_FILE_)
  6. 2012年参加油田象棋比赛的几盘棋
  7. SuperMap许可驱动安装流程详解
  8. 南航计算机学院院长黄志球简历,南航计算机科学与技术学院导师介绍:沈国华...
  9. 解密产品经理兼职做猎头,3个月赚十万
  10. c++运行时报Floating point exception错误
  11. 去掉WebView中的白色背景
  12. 自学python能干什么知乎_自学python能干什么
  13. 任意椭圆和直线求交点方程组解析
  14. Altium Designer制作原理图库不显示Comment和Designator
  15. iOS safeAreaInsets安全区域相关知识
  16. 【Proteus8+keil5的仿真使用】
  17. 从 PC 解锁 Android 手机的 6 种有效方法
  18. 12个降维技术的终极指南(使用Python代码)
  19. 地产“罗生门”:是世茂“不讲武德”,还是福晟“谎话连篇”?
  20. C语言编译全过程【转】

热门文章

  1. 三星SAMSUNG SL-M2676N 驱动
  2. Vue2中插槽使用——默认插槽、具名插槽、作用域插槽
  3. Java23种设计模式总结-学而不习则罔
  4. 解决Vedio标签视频禁止下载方法
  5. linux 4412 adc字符设备,迅为4412开发板Linux字符设备控制(二)
  6. Arduino与Proteus仿真实例-GP2D12红外测距传感器驱动仿真
  7. batch size 代码
  8. ijkplayer源码分析 音频解码流程
  9. Linux内核调度子系统之EAS
  10. 如何玩转私域?裂变是关键丨巨准SCRM分享裂变粉丝破万玩法