0

谁能建议我一种快速获取前景图像的方法?

目前我正在使用 BackgroundSubtractorMOG2 类来执行此操作。它很慢。我的任务不需要那么复杂的算法。

我可以在 binging 中获得背景图像。相机位置不会改变。所以我相信有一种简单的方法可以做到这一点。

我需要捕捉在相机前移动的物体的一团。并且永远只有一个对象。

4

1 回答 1

4

我建议执行以下简单的解决方案:

  1. 计算差分矩阵:

    • cv::absdiff(帧,背景,absDiff);

    这使得 absDiff 中的每个像素 (i,j) 设置为 |frame(i,j) - background(ij)|。每个通道(例如 R、G、B)都是独立处理的。

  2. 将结果转换为单通道单色图像:

    • cv::cvtColor(absDiff, absDiffGray, cv::COLOR_BGR2GRAY);
  3. 应用二元过滤器:

    • cv::threshold(absDiffGray, absDiffGrayThres, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

    在这里,我们使用 Ots'u 方法来确定适当的阈值水平。如果第 2 步有任何噪音,二元滤波器会将其去除。

  4. 在 absDiffGrayThres 图像中应用斑点检测。这可以是内置的 opencv 方法之一,也可以是手动编写的代码,用于查找 vale 为 255 的像素位置(请记住关于快速 opencv 像素检索操作)

这样的过程足以在相当老的 Core 2 Duo 2.1 GHz、4 GB RAM 上管理 640x480 RGB 图像,帧速率至少为 30 fps,不支持 GPU。


硬件备注:请确保您的相机镜头光圈未设置为自动调整。想象以下情况:您在开始时计算了背景图像。然后,一些物体出现并覆盖了相机视图的更大部分。进入镜头的光线较少,并且由于自动调光,相机会增加光圈,背景颜色会发生变化,差异会在实际上没有任何物体的地方产生斑点。

于 2013-06-18T13:50:20.307 回答