我有这个棘手的任务,将第i帧中的blob与第i + 1帧中的blob相关联。我没有找到足够的文章/例子来解决这个问题,或者那些我能理解得很好的文章/例子。我想做的就是将第i帧中的blob与第i + 1帧中的blob联系起来。目标不是在下一帧中再次检测到相同的blob(或忽略旧的blob)。
欢迎文章/示例。 THX
答案 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帧中找到它周围最相似的一个。
希望这些帮助。