运动背景分割法Background Segment主要是指通过不同方法拟合模型建立背景图像,将当前帧与背景图像进行相减比较获得运动区域。下图所示为检测图像:
通过前面的检测帧建立背景模型,获得背景图像。然后检测图像与背景图像相减即为运动图像,黑色区域为背景,白色区域为运动目标,如下图所示:
在OpenCV标注库中有两种背景分割器:KNN,MOG2。但是实际上OpenCV_contrib库的bgsegm模块中还有其他几种背景分割器。本文主要介绍OpenCV_contrib中的运动背景分割模型及其用法,并对不同检测模型的性能和效果进行对比。
文章目录
- 1 方法介绍
- 2 代码与方法评估
- 2.1 代码
- 2.2 评价
- 2.3 方法选择
- 3 参考
1 方法介绍
OpenCV_contrib中bgsegm模块主要有GMG, CNT, KNN, MOG, MOG2, GSOC, LSBP等7种背景分割器,其中KNN,MOG2可以在OpenCV标准库中直接使用,其他需要在OpenCV_contrib库中使用。具体各个方法介绍如下:
- GMG:基于像素颜色进行背景建模
- CNT:基于像素点计数进行背景建模
- KNN:基于K最近邻进行背景建模
- MOG:基于混合高斯进行背景建模
- MOG2:基于混合高斯进行背景建模,MOG的升级版本
- GSOC:类似LSBP
- LSBP:基于LBP进行背景建模
各个方法提出时间、相关论文和OpenCV函数接口介绍如下表所示:
方法 | 提出时间 | OpenCV函数接口介绍 |
GMG | 2012 | |
CNT | 2016 | |
KNN | 2006 | |
MOG | 2001 | |
MOG2 | 2004 | |
GSOC | 2016 | |
LSBP | 2016 |
OpenCV contrib库的编译安装见:
OpenCV_contrib库在windows下编译使用指南
2 代码与方法评估
2.1 代码
下述代码介绍了OpenCV_contrib的bgsegm模块中不同背景分割方法C++和Python的调用。对比了不同背景分割方法在示例视频下,单线程和多线程的效果。
代码和示例视频下载地址:
https://github.com/luohenyueji/OpenCV-Practical-Exercise
完整代码如下:
C++
Python
2.2 评价
在i5六代CPU(太渣就不具体介绍),12G内存,VS2017 C++ Release平台下,各种方法处理速度如下表所示。
方法 | 单线程单帧处理平均时间/ms | 四线程单帧处理平均时间/ms |
GMG | 38.6 | 31.3 |
CNT | 4.6 | 2.9 |
KNN | 19.8 | 9.3 |
MOG | 16.3 | 15.6 |
MOG2 | 15.3 | 7.7 |
GSOC | 66.3 | 49.4 |
LSBP | 193.8 | 94.9 |
各个方法,个人评价如下:
- GMG 初始建模帧会快速变化,导致全屏运动,对邻近运动目标检测效果一般,GMG需要自行设定参数(所以新的OpenCV标准库移除了GMG)总体效果一般。效果如图所示:
- CNT 初始建模帧在一段时间持续变化导致全屏运动,运动目标过快可能会出现鬼影,低端设备速度很快,高端硬件速度和MOG2相近,总体效果不错。效果如图所示:
- KNN 初始建模在一段时间持续变化导致全屏运动,运动目标都能较好检测出来,速度也还不错,总体效果不错。效果如图所示:
- MOG 建模会丢失运动目标,速度不错,总体效果不错。效果如图所示:
- MOG2 运动区域过大,容易出现细微变化区域,总体效果最好,MOG的升级版本,运动区域基本能检测出来,不过需要自行设定参数。效果如图所示:
- GSOC 建模时间过短出现鬼影,随着建模时间越来越长,检测效果会变好,会逐渐消除鬼影,LSBP的升级版本,相对还行。效果如图所示:
- LSBP 极易出现鬼影,建模次数越多,建模消耗时间有所减少,但是鬼影会偶尔出现。效果如图所示:
2.3 方法选择
追求速度 CNT or MOG2 or KNN
如果是低端设备或者并行任务多毫无疑问是CNT最好,高端设备还是MOG2更好,毕竟MOG2检测效果优于CNT,KNN也是不错的选择。追求质量 MOG2 or KNN or GSOC
检测质量MOG2和KNN差不多,GSOC建模时间长会很不错,但是GSOC太慢了。如果不在意速度GSOC很好,其他还是MOG2和KNN。平衡质量和速度 MOG2 or KNN
质量和速度均衡MOG2和KNN最不错,不然为什么MOG2和KNN放在标准库,其他在contrib库。MOG2需要调整参数,不过速度和质量优于KNN。如果图省心,不想调整参数,选KNN最好。
总的来说实际应用中,MOG2用的最多,KNN其次,CNT一般用于树莓派和多检测任务中。
3 参考OpenCV_contrib库在windows下编译使用指南
背景减除(Background Segment)