将第i帧的blob与第i + 1帧相关联?

时间:2012-11-11 12:34:19

标签: visual-c++ image-processing opencv computer-vision

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

欢迎文章/示例。 THX

2 个答案:

答案 0 :(得分:2)

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

如果斑点从一帧到另一帧的移动非常小,那么您可以在第一帧中保存斑点的中心位置,并通过获取最接近这些中心的斑点来识别第二帧中的相应斑点。 (正如先前提到的那样)

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

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

OpenCV中的Lucas Kanade跟踪算法只能跟踪小的平移位移。如果你也有大的旋转,你需要一个模板跟踪算法,它也可以优化旋转。在这里,您可以找到一个很好的tutorial关于此问题和here关于此问题的更高级研究。

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

答案 1 :(得分:1)

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

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

希望这些帮助。