跟踪Aforge中的blob

时间:2010-08-23 14:32:16

标签: c# tracking aforge blobs

我看了看。有人知道如何跟踪Aforge的blob吗?我知道他们没有实现它,但我真的需要使用Aforge因为我正在使用的其余代码。我看到了一些卡尔曼滤波的参考,但我需要一些实现而不是理论。

TNX, 诉

1 个答案:

答案 0 :(得分:2)

AForge.NET BlobCounter将提供blob发现,虽然它相当简单并且不支持'破碎'blob。如果您想实现一些简单的blob跟踪,可以考虑以下几点:

  1. 如果您的斑点偶尔会碎片化,您可能需要执行一些聚类(找到质心位置组以组合小碎片)以获得对位置的良好估计。在分析多个帧时,这会增加遇到诸如破碎斑点等边界条件的机会,因此需要考虑这一点。或者,如果您可以很好地控制条件(例如照明),那么这可能就足够了。在blob找到之前,可以通过重复的扩张/侵蚀操作来解决次要(仅几个像素)中断,但这也会放大噪声并降低位置精度。

  2. 对于实际跟踪,您有几种方法。卡尔曼滤波可以为您提供非常好的精度(子像素),因为它集成了来自多个帧的信息。如果您不需要那么高的准确度,您可以考虑一个非常简单的算法,例如总是选择最接近最近位置的足够大的blob。如果对象没有快速移动并且您没有在被跟踪对象附近弹出其他blob,则此方法有效。如果您需要更好的分析性能,您也可以估计最后两帧的速度,并使用它来限制搜索blob时必须考虑的区域。

  3. 如果您需要跟踪高速物体,则会变得更具挑战性。在这种情况下,您可能会尝试将blob-finding与模板匹配相结合。您可以基于blob-find创建模板,并将模板与后续blob匹配,以根据模式而不仅仅是其大小/位置对其进行评分。这要求斑点随着时间的推移看起来相当一致,这意味着模型的物理形状和光照条件必须保持固定。


  4. 更新以回应您的问题:

    今天早上只有几分钟,所以没有实际的代码,但基本的想法是:

    1. 只考虑大于可配置大小的blob(您可能需要凭经验确定这一点。)

    2. 保留有关找到的最后两个blob位置及其采样时间的信息。我们在时间t1和t0将这些向量称为R2,p1和p0。

    3. 如果假设速度缓​​慢变化,则在新位置的时间t2初步估计p2 = p1 +(t2-t1)*(p1-p0)/(t1-t0)。这可能是也可能不是一个好的假设,所以你需要通过在所需的运动范围内捕捉你的物体来验证这一点。

    4. 您可以选择使用此估算值将blob搜索区域限制为以估计位置为中心的子图像。执行blob查找后,将最接近估计位置的blob作为新的位置测量值。

    5. 上述的一个副作用是,如果由于某种原因,blob在一帧中发现失败,则可以使用估计值。允许这种推断太长时间是危险的,但它可以让你对轻微的噪声尖峰有一定的容忍度。

      你可能会看到这可以进一步发展,包括从最近的帧估计加速度或整合多帧的速度/加速度,以更好地推断下一个样本的可能位置。您也可以开始相信估计(使用来自当前帧和先前帧的累积数据)比实际测量更精确(并且可能准确)。最终你最终会得到类似卡尔曼滤波器的东西。