我看了又看。有人知道如何从 Aforge 跟踪 blob 吗?我知道他们没有实现它,但我真的需要使用 Aforge,因为我正在使用其他代码。我看到了一些对卡尔曼滤波的参考,但我需要一些实现而不是理论。
德克萨斯州,诉
AForge.NET BlobCounter 将提供 blob 查找,尽管它相当简单并且不支持“损坏”的 blob。如果您想实现一些简单的 Blob 跟踪,您可能会考虑以下几点:
如果您的 blob 偶尔会出现碎片,您可能需要执行一些聚类(查找质心位置组以组合小片段)以获得对位置的良好估计。在分析多个帧时,这会增加遇到边界条件(例如破碎的斑点)的机会,因此考虑这一点很重要。或者,如果您对条件(例如照明)有很好的控制,那可能就足够了。在找到 blob 之前,可以通过重复的膨胀/腐蚀操作来解决较小的(只有几个像素)中断,尽管这也会放大噪声并降低位置精度。
对于实际跟踪,您有几种方法。卡尔曼滤波可以为您提供非常好的精度(亚像素),因为它集成了来自多个帧的信息。如果您不需要该级别的准确度,则可以考虑使用非常简单的算法,例如始终选择最接近最近位置的足够大的 blob。如果对象移动速度不是很快,并且您没有在被跟踪对象附近弹出其他斑点,则此方法有效。如果您需要更好的分析性能,您还可以估计最后两帧的速度,并使用它来限制搜索 blob 时必须考虑的区域。
如果您需要跟踪高速物体,那将变得更具挑战性。在这种情况下,您可能会尝试将 blob 查找与模板匹配结合起来。您可以基于 blob-find 创建模板,并将模板与后续 blob 匹配,以根据它们的模式对它们进行评分,而不仅仅是它们的大小/位置。这要求斑点随着时间的推移看起来相当一致,这意味着模型的物理形状和照明条件必须保持固定。
更新以回应您的问题:
今天早上只有几分钟,所以没有实际的代码,但基本思想是这样的:
只考虑大于可配置大小的 blob(您可能必须凭经验确定这一点。)
保留有关发现的最后两个 blob 位置和采样时间的信息。让我们在时间 t1 和 t0 将这些向量称为 R2、p1 和 p0。
如果假设速度变化缓慢,则在时间 t2 的新位置初步估计 p2 = p1 + (t2-t1)*(p1-p0)/(t1-t0)。这可能是一个好的假设,也可能不是一个好的假设,因此您需要通过在所需的运动范围内捕获您的对象来验证这一点。
您可以选择使用此估计来将您的 blob 搜索区域限制为以估计位置为中心的子图像。执行 blob 查找后,将最接近估计位置的 blob 作为新的位置测量值。
One side effect of the above is that you can work with the estimate if, for some reason, the blob find fails during one frame. It's dangerous to allow this extrapolation for too long, but it can give you some tolerance for minor noise spikes.
You can probably see how this could progress further to include an estimate of acceleration from recent frames or integrate velocity/acceleration from multiple frames to better extrapolate a likely location for the next sample. You could also start to trust that the estimate (with accumulated data from the current and previous frames) is more precise (and perhaps accurate) than the actual measurement. Eventually you wind up with something like the Kalman filter.