我试图用这种方法来检测移动物体。有人可以告诉我这件事吗?

时间:2015-03-11 14:18:46

标签: c++ opencv

如果我使用这种方法来提取前景,我想问一下有什么样的问题。

使用此方法之前的条件是它在固定摄像机上运行,​​因此相机位置不会有任何移动。

我想要做的就是下面。

  1. 从相机读取一帧并将此帧设置为背景图像。这是定期完成的。
  2. 定期将上面读取的帧减去上面的背景图像。然后只有与其他区域不同的移动物体 与背景图片相同。
  3. 然后使用灰度,二值化,阈值处理来隔离移动物体。
  4. 迭代4个以上的过程。
  5. 如果我这样做,成功检测到移动物体的概率会高吗?如果没有......你能告诉我为什么吗?

3 个答案:

答案 0 :(得分:1)

如果您考虑场景中的光照变化(逐渐或突然),您将看到您的方法不起作用。

针对这些问题,有更强大的解决方案。其中一个(可能是最好的)是高斯混合模型应用于背景减法。

您可以在OpenCV库中使用BackgroundSubtractorMOG2(GMM的实施)。

答案 1 :(得分:0)

有很多方法可以解决这个问题,并且它实际上取决于输入图像,哪种方法最合适。可能值得在topic

上阅读一些内容

您建议的方法可能有效,但这是解决此问题的一种略微非标准的方法。我主要担心的是从背景中减去几个图像可能会导致饱和,然后您可能会丢失一些运动细节。最好在连续图像之间取差异,然后对这些图像应用二值化/阈值处理。

过去对我有用的另一种(更复杂的)方法是拍摄图像的子区域,然后与新图像进行交叉关联。这种相关性的峰值可以用来识别运动的方向 - 如果有一件事在移动,它就是一种有用的方法。

例如,也可以使用上述两种方法的组合。

  1. 从第一个背景中减去第二个图像。
  2. 阈值等,以找到正在发生移动的ROI
  3. 使用模式匹配方法跟踪以上检测到的ROI为中心的后续移动。
  4. 最好的方法取决于你的申请,但有很多关于这个主题的论文

答案 2 :(得分:0)

您的方案非常适合相机固定且背景静止的情况。室内和人工控制的场景比户外和自然场景更适合这种方法。我已经为一个基本上与你建议的相同原理工作的检测系统做出了贡献。但当然细节至关重要。根据我的经验做一些评论

  1. 您的初始化步骤可能会导致非常慢的收敛到正常状态。您将背景设置为第一帧,然后将移动对象后面的背景片段视为对象。更好的方法是取N个第一帧的中位数。
  2. 在光线条件等变化的情况下,简单的减法可能不够。您可以找到更适合您应用的相似性标准。
  3. 对差异图像进行简单的阈值处理可能还不够。一种简单的方法是扩展前景,以便不更新意外识别的像素背景。
  4. 您的第4步不清楚,我认为您的意思是仅在最后一帧上标识为背景的那些地方更新前景。请注意,通过这种简单的方法,实际背景的像素可能会永远停留在"前景"标记,因为您不更新它们下面的背景。有很多可能的解决方案。