OpenCV 2.4.5 版提供了几种不同的实现方式,可用于跟踪使用统计方法估计背景的移动对象。 OpenCV 具有在 CPU 上实现的 BackgroundSubtractorMOG
、BackgroundSubtractorMOG2
类。此外,它还有BackgroundSubtractorMOG
和BackgroundSubtractorMOG2
的GPU实现,即gpu::MOG_GPU
和gpu::MOG2_GPU
分别。还有另外两个算法 gpu::GMG_GPU
和 gpu::FGDStatModel
。
在我的应用程序中,我想在移动物体进入场景时立即将它们分割出来。我想避免误报,例如阴影。这 4 种算法似乎专注于同一个目标——它们通过随着时间的推移创建背景模型来将背景与前景分开。我在徘徊,如果有这些实现经验的人可以帮助我决定使用哪个(GPU)实现。这些算法——MOG、MOG2、GMG 和 FGDStatModel——彼此有何不同?使用一种或另一种算法的优点是什么?这些实现在速度、配置参数的能力、准确性、阴影检测(误报)等方面如何比较?
最佳答案
我偶然发现了位于 {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
关于c++ - OpenCV中前景-背景分割方法的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16157326/