快速数组比较和替换最接近值的元素的算法.(跟踪点)

Algorithm for fast array comparison and replacing elements with closest value. (Tracking Points)

本文关键字:算法 元素 跟踪 数组 比较 最接近 替换      更新时间:2023-10-16

我有两个数组currPoints和prevPoints。两者的大小不一定相同。我想将currPoints中的每个元素与prevPoints进行比较,并替换prevPoints中最接近currPoints中的值。

的例子:

prevPoints{2,5,10,13,84,22}
currPoints{1,15,9,99}

应用算法后

prevPoints{1,5,9,15,99,22}

那么最好的算法/方法是什么?它需要快。

Context:如果它有帮助,我正在尝试研究一种跟踪算法,该算法从视频中的两个连续帧中获取点,并试图找出第一帧中的哪些点对应于第二帧中的点。我希望用这种方式来追踪物体并给它们贴上ID标签。速度是至关重要的,因为处理是实时完成的。

首先需要对这两个数组进行排序。但是请记住prevPoints数组的原始方向,因为您需要在最后再次获得原始数组。

那么排序后:

prevPoints{2,5,10,13,22,84}
currPoints{1,9,15,99}

现在你基本上需要弄清楚哪些currPoints应该进入prevPoints。该算法将类似于合并2个排序数组,只是您不会合并,而是替换值。

最初两个指针都位于相应数组的开头。currpoints中的1应该取代prevPoints中的2,因为currpoints中的值小于prevPoints,并且您知道prevPoints中的下一个点只会高于2(排序数组,记住)。替换指针并在指针上移动

现在当前指针是在9和prevpointer是在5。计算绝对差,并存储到目前为止遇到的最小绝对差,以及导致遇到的最小绝对差的数字的值。(在这种情况下是4)。当当前指针指向更高的值时,向前移动预览指针。

现在预览指针为10,当前指针为9。9比10小,所以必须更换。由于这个最小的绝对差小于之前的(1 <4)所以10将被9取代。

现在prevpointer在13,current pointer在15。

按相同的方式进行。

重新排列prevPoints数组到原来的方向

希望这有帮助!!

我们按x位置对第一个列表排序,按y位置对第二个列表排序。每个点在每个列表中都有一个位置。对于最近邻搜索(至少我是这么想的)的方法是通过二分查找来找到每个列表中点的位置。然后我们知道4个方向,+-1 x或+-y,基本上我们沿着这些方向旅行,直到目前为止的最佳长度大于那个坐标的距离。

所以我们在每个方向上搜索。假设最近点的距离是25,那么如果+X方向上的下一个坐标超过+X方向上的25我们就可以停止,因为即使Y的变化量是0,它也不可能更近。

这使得找到单个点的n(log(n))最近点算法非常有效和快速。但是,由于我们只需要在n(log(n))时间内得到这两个排序列表我们可以在log(n)时间内找到所有剩余点的最近点。找到在x排序列表中的位置,找到在y排序列表中的位置。然后向外螺旋,直到你截断并找到最近的点。但是,由于脚手架在每种情况下都是相同的,它应该很快结束。

尽管给定您的实际测试用例,您可能想要提出一些简单的非常有效的启发式。


简单地追踪这些点似乎很幼稚,如果我们从一帧到另一帧追踪同样的东西,那么在F2中从F0到F1的点实际上应该等于它在F0到F1的距离。如果我们假设所有这些点都大致沿直线运动,我们就能比简单地求出最近的点要好得多。我们可以找出这些点所经过的曲线。如果我们通过插入F0和F1来猜测它们的位置应该是F2看,这里有一个点的位置非常非常接近。那么我们就可以确定我们已经搞定了。

同样地,人们会假设物体的所有点都大致沿着相同的方向运动。就像每个点从F0到F1移动+5,+5,我们不仅可以猜出它们在F2的位置,而且我们可以知道这些物体相当有效地组成了同一个物体。