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

标签 c++ opencv computer-vision image-segmentation

OpenCV 2.4.5 版提供了几种不同的实现方式,可用于跟踪使用统计方法估计背景的移动对象。 OpenCV 具有在 CPU 上实现的 BackgroundSubtractorMOGBackgroundSubtractorMOG2 类。此外,它还有BackgroundSubtractorMOGBackgroundSubtractorMOG2的GPU实现,即gpu::MOG_GPUgpu::MOG2_GPU分别。还有另外两个算法 gpu::GMG_GPUgpu::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/

相关文章:

C++ 有没有办法获取模板类型?

c++ - 微软CNTK强化学习C++实例

c++ - OpenCV 4.3.0 在 GPU 上计算积分图像>

c++ - 图片显示时改变形状

c++ - 给定相机矩阵,如何使用 OpenCV 找到点对应关系?

c++ - 为什么类成员函数是内联的?

c++ - 如何在 winapi 标准对话框中处理键盘事件?

node.js - Node opencv模块安装报错

c++ - 是否可以使用opencv的imshow在没有工具栏的情况下显示图像?

opencv - 使用 Opencv 进行广角镜头校准