OpenCV C++ 轮廓 - 使结果在帧上保持连续

OpenCV C++ contours - keeping results contiguous over frames

我在 OpenCV 中有一个实时应用程序,我需要获取当前视频帧,分析它的轮廓,然后处理这些轮廓的质心。到目前为止,基础知识都很好并且可以正常工作。

我预见到的问题是我的输入帧 'noisy' 在一定程度上我可能会看到每个帧的质心数量不同,我感兴趣的是如何处理这个问题。

我感兴趣的对象在每一帧中都给出正命中,例如,如果我期望 14,那么我将得到 至少 每帧 14 .我也先验地意识到框架中对象之间的空间关系(例如,它们永远不会交叉,存在对称性,例如在其他规则中,左上角的规则就是这样:左上角 - always) 所以我可以相信 openCV findContours 函数找到它们的顺序将保持不变(例如,它可能会发现找到的第三个轮廓总是左上角的)。

问题出在误报上,因为它们对排序感到反感,以至于我刚才概述的 'logic' 不友好地分崩离析。误报可能出现在任何地方,我最终可能有 15 个质心,因此“3”现在可能是误报,“4”是左上角,依此类推。

问题:它看起来只是一个一次性函数 - 清除你的向量并重新开始之类的事情 - 但是 OpenCV 有解决这个内置问题的方法吗?

如果我必须自己动手 - 他们通常采用什么策略?

由于帧中的对象在连续帧之间是连续的 'within a bound' 我猜我可以玩这个 - 而且,结合上述已知的空间关系(再次,'within a bound') - 我可以用煤气做饭 :) - 事情是,我会在每一帧之间这样做......

在循环执行时间方面,我遇到了一个非常短的时间来玩的墙 - 如果我可以依靠已经解决的具有最佳算法复杂性的问题而不是我自己的笨拙,我完全赞成.

有人教我吗? (我说得有道理吗?)

SO 的建议 'Questions that may already have your answer' - 当然相关 - 但更具体,我的可能更笼统 (?)

同时进行了更多研究...

只需要 google 的关键词,然后就可以了 - 'multi-object tracking' 和 'data-association'

看起来该方法适用于每一帧:

  1. 使用卡尔曼滤波器预测质心的下一个位置

  2. 使用匈牙利算法'best'拟合预测的质心 候选人进入 14 个可用名额 - 如果有误报 他们将是这一步后剩下的

  3. 质心不再是候选质心,但现在是质心,所以 update/correction 计算卡尔曼滤波器的步骤

  4. Rinse/repeat ...

这是非常有统计意义的——你永远不知道它是否是 'correct'(即误报可能会导致正确的候选人出现),但相信这是在它提供的复杂性范围内可以完成的最好的结果。如果卡尔曼滤波器调整得好,那么人类可能会犯同样的错误...

事后看来 不是 20/20 :)

仍然需要实施它,也许我会在看到结果时编辑我的答案。


更新> 实施 成功 - 这是一些写自: