OpenCV中前景-背景分割方法的区别

Difference between foreground-background segmentation methods in OpenCV

本文关键字:分割 方法 区别 背景 OpenCV      更新时间:2023-10-16

OpenCV 2.4.5版本提供了几种不同的实现,可用于跟踪使用统计方法估计背景的移动对象。OpenCV在CPU上实现了BackgroundSubtractorMOG, BackgroundSubtractorMOG2类。此外,它还具有BackgroundSubtractorMOGBackgroundSubtractorMOG2的GPU实现,分别是gpu::MOG_GPUgpu::MOG2_GPU。还有另外两个算法gpu::GMG_GPUgpu::FGDStatModel

在我的应用程序中,我想分割出运动的物体,一旦他们进入场景。我想避免误报,比如阴影。这4种算法似乎专注于同一个目标——它们通过创建背景随时间变化的模型来区分背景和前景。我在想是否有人有这些实现的经验可以帮助我决定使用哪个(GPU)实现。MOG、MOG2、GMG和FGDStatModel这些算法有何不同?使用其中一种算法或另一种算法的优点是什么?这些实现在速度、配置参数的能力、准确性、阴影检测(误报)等方面比较如何?

我偶然发现了一个位于{opencv_folder}samplesgpu中的演示源代码bgfg_segm.cpp。该演示展示了以下背景前景分割类

的用法和输出
FGDStatModel
MOG_GPU 
MOG2_GPU
VIBE_GPU  <- listed under `non-free functionality` in OpenCV documentation 
GMG_GPU 

这正是我需要比较的算法。显然,需要调整算法的参数,以找到适合给定应用程序的一个算法(以及一组参数)。

速度比较:

FGDStatModel  ~60 frames per second (fps) <-slowest 
MOG_GPU       ~650 fps
MOG2_GPU      ~650 fps
VIBE_GPU      ~1000 fps <- fastest
GMG_GPU       ~190 fps