背景提取

问题描述 投票:0回答:1

谁能建议我快速获取前景图像?

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

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

我需要捕捉在相机前移动的物体的斑点。并且总会有一个对象。

c++ opencv computer-vision
1个回答
4
投票

我建议做如下,简单的解决方案:

  1. 计算差异矩阵: cv :: absdiff(frame,background,absDiff); 这使得absDiff中的每个像素(i,j)设置为| frame(i,j) - background(i.j)|。每个通道(例如R,G,B)独立地进行处理。
  2. 将结果转换为单通道monocolor图像: 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方法或手动编写的代码之一,用于查找值为255的像素位置(记住快速opencv像素检索操作)

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


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

© www.soinside.com 2019 - 2024. All rights reserved.