1

我有一项棘手的任务是将第 i 帧中的 blob 与第 i+1 帧中的 blob 相关联。我还没有找到足够的文章/例子来处理这个问题,或者那些我能很好理解的文章/例子。我要做的就是将第 i 帧中的 blob 与第 i+1 帧中的 blob 关联起来。目标不是在下一帧中再次检测到相同的 blob(或忽略旧的 blob)。

欢迎发表文章/示例。谢谢

4

2 回答 2

2

如果 blob 逐帧更改其大小,则必须使用 blob 的比例不变描述符来比较两个 blob。cv::HuMomments 就是这样的描述符。您还可以使用函数 cv::matchShapes 直接比较您在后续图像中检测到的轮廓。

如果 blob 从帧到帧的移动非常小,则可以保存第一帧中 blob 的中心位置,并通过获取最接近这些中心的 blob 来识别第二帧中的相应 blob。(正如pppoe先生之前提到的)

另一种可能性是在每个斑点的轮廓内(如果它们有一些纹理)和边界上对点进行采样,并使用 Lucas Kanade Tracking (cv::calcOpticalFlowPyrLK)。中值光流可以告诉您斑点移动的位置。

您还可以单独为每个 blob 运行 Lucas Kanade Tracking。将 设置为prevPtsblob 的中心,并且winSize应该与 blob 的大小完全匹配。

OpenCV 中的 Lucas Kanade Tracking 算法只能跟踪小的平移位移。如果您也有较大的旋转,您将需要一个模板跟踪算法来优化旋转。在这里你可以找到一个很好的教程这里是关于这个的更高级的研究。

为了给你更多的想法,我们需要更多关于斑点的样子、它们如何移动、它们有多大等信息。发布一些图片!

于 2012-11-18T20:24:59.420 回答
1

我认为这是一个“多对象跟踪”问题。如果你的 blob 彼此相同,这可能很难,否则你可以首先定义两个 blob 之间的距离(这取决于你如何在数学上表示 blob),给定帧 i 中的 blob X,在帧中找到它i+1 就像在第 i+1 帧中寻找与 X 最相似的 blob。

理想情况下,blob 不会在两帧之间移动太多。因此,为了挽救您的生命,您可以将 X 放入帧 i+1 中与它在第 i 帧中的相同位置,并在第 i+1 帧中寻找它周围最相似的那个。

希望这些帮助。

于 2012-11-11T14:38:56.397 回答