【问题标题】:Background extraction背景提取
【发布时间】:2017-12-17 16:48:47
【问题描述】:

谁能给我一个快速获取前景图像的方法?

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

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

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

【问题讨论】:

  • 是在'Release'中编译程序之后吗?或者你在“调试”中测试这个?
  • 发布中.. 帧速率约为 6fps... 这正常吗?我正在使用笔记本电脑 4GB RAN i5 2.9GHz 第三代 CPU
  • 显卡呢?
  • 请注意,您的相机所拍摄图像的分辨率会显着影响计算。您可以先缩小图像,然后再将其发送到 OpenCV 进行处理。
  • 感谢各位的回复。我认为我的笔记本电脑有问题.. 我用我的台式机试了一下,640x480 尺寸的 gt abt 20fps

标签: c++ opencv computer-vision


【解决方案1】:

我建议这样做,简单的解决方案:

  1. 计算差分矩阵:

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

    这使得 absDiff 中的每个像素 (i,j) 设置为 |frame(i,j) - background(i.j)|。每个通道(例如 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 不支持 GPU 的情况下,这样的过程足以快速管理 640x480 RGB 图像,帧速率至少为 30 fps。


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

【讨论】:

  • 嗨!在我发布问题之前我也尝试过这种方法......但它根本没有成功。可能是因为自动光圈调整...我怎么能关掉它??
  • 在运行速度或给定结果方面不成功?
  • 关闭光圈调整直接取决于相机。你最好查一下摄像头的驱动程序有没有这种可能性。例如,如果您有外部网络摄像头,则网络摄像头控制面板中应该有这样的选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2013-12-25
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
相关资源
最近更新 更多