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

Posted

技术标签:

【中文标题】OpenCV中前景-背景分割方法的区别【英文标题】:Difference between foreground-background segmentation methods in OpenCV 【发布时间】:2013-04-22 21:47:18 【问题描述】:

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

在我的应用程序中,我想在移动对象进入场景后立即对其进行分割。我想避免诸如阴影之类的误报。这 4 种算法似乎都专注于同一个目标——它们通过创建一个随时间变化的背景模型来将背景与前景分开。如果有这些实现经验的人可以帮助我决定使用哪个(GPU)实现,我正在徘徊。这些算法——MOG、MOG2、GMG 和 FGDStatModel——彼此之间有何不同?使用其中一种算法有什么优势?这些实现如何在速度、配置参数的能力、准确性、阴影检测(误报)等方面进行比较?

【问题讨论】:

【参考方案1】:

我偶然发现了位于opencv_folder\samples\gpu 的演示源代码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

【讨论】:

@nkint 是的,准确度取决于您的应用程序以及为给定算法选择的参数。我没有进行广泛的研究。 @nkint 我没有进行广泛的研究,也没有对所有算法进行微调。我只是喜欢我的应用程序的 GMG_GPU 算法。这是我的主观意见。如果您知道这些 OpenCV 算法的更好更详细的比较,请告诉我。

以上是关于OpenCV中前景-背景分割方法的区别的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV4中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理和特点是什么。

详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorMOG

OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorLSBP的使用示例代码及运行效果

OpenCV3中有哪些视频背景/前景分割(背景建模/前景提取)算法的类,它们各自的算法原理和特点是什么。

OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::bgsegm::BackgroundSubtractorGSOC的使用示例代码及运行效果

详解OpenCV的视频背景/前景分割(背景建模/前景提取)类cv::BackgroundSubtractorMOG2,并利用它实现对道路监控视频前景/背景的提取