2010-08-23 44 views
0

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

TNX, 诉

回答

2

的AForge.NET BlobCounter将提供BLOB发现,虽然这是相当简单的,不支持“破”的斑点。如果你想实现一些简单的团块跟踪,几件事情,你可能会考虑:

  1. 如果你的斑点是偶尔分散,您可能需要执行一些集群(发现的质量位置的中心,以小片段结合的组)以获得对该位置的良好估计。分析多个帧时,这会增加遇到边界条件(如斑点破碎)的机会,因此重要的是要考虑。或者,如果您对条件(如照明)具有良好的控制能力,那可能就足够了。在blob找到之前,可以使用重复的膨胀/腐蚀操作来解决小问题(只有几个像素点)的问题,但这也会放大噪声并降低定位精度。

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

  3. 如果您需要跟踪高速目标,即成为一个更具挑战。在这种情况下,您可能会尝试将blob发现与模板匹配相结合。您可以根据blob-find创建一个模板,并将模板与后续的blob进行匹配,以根据模板对它们进行评分,而不仅仅是它们的大小/位置。这要求斑点随着时间的推移显得合理一致,这意味着模型的物理形状和照明条件必须保持固定。


更新针对您的问题:

今天早上有一个几分钟,所以没有实际的代码,但基本的思路是这样的:

  1. 只考虑斑点比配置的尺寸更大的(你可能不得不凭经验确定这一点。)

  2. 保留找到的最后两个斑点位置的信息以及它们被采样的时间。在时间t1和t0,我们在R2中调用这些向量,p1和p0。如果你假设速度缓​​慢变化,那么在新位置的时间t2处的初步估计为p2 = p1 +(t2-t1)*(p1-p0)/(t1-t0)。这可能是也可能不是一个好的假设,所以您需要通过在所需的运动范围内捕捉对象来验证这一点。

  3. 您可以选择使用这个估计你的斑点搜索区域限制为中心的估计位置的子图像。在执行斑点查找之后,将距离估计位置最近的斑点作为新的位置测量。

上述的一个副作用是,如果出于某种原因,blob发现在一帧期间失败,则可以使用该估计。允许这种推断太长时间是危险的,但它可以给你一些容许小的噪音峰值。

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

+0

优秀的答案如何选择#2(大小和位置的组合)的一些参考代码 – tomato 2010-08-24 11:22:42

+0

哇你的演绎是伟大的,我现在去代码可能会添加一些过滤掉帧。非常感谢你@丹 – tomato 2010-08-24 15:38:19