C++ 用于快速数组比较和用最近值替换元素的算法。(追踪点)

C++ 用于快速数组比较和用最近值替换元素的算法。(追踪点),c++,arrays,algorithm,stl,tracking,C++,Arrays,Algorithm,Stl,Tracking,我有两点和两点。两者不一定大小相同。我想将currPoints中的每个元素与prevPoints进行比较,并替换prevPoints中与currPoints中的值最接近的值 例如: prevPoints{2,5,10,13,84,22} currPoints{1,15,9,99} 应用该算法后 prevPoints{1,5,9,15,99,22} 那么,这方面的最佳算法/方法是什么?它需要快一点 上下文:如果有帮助的话,我正在尝试一种跟踪算法,该算法从视频中的两个连续帧中提取点,并试图找出第

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

例如:

prevPoints{2,5,10,13,84,22}
currPoints{1,15,9,99}
应用该算法后

prevPoints{1,5,9,15,99,22}
那么,这方面的最佳算法/方法是什么?它需要快一点


上下文:如果有帮助的话,我正在尝试一种跟踪算法,该算法从视频中的两个连续帧中提取点,并试图找出第一帧中的哪些点对应于第二帧中的点。我希望通过这种方式跟踪对象并用ID标记它们。速度至关重要,因为处理需要实时完成。

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

所以在分类之后:

prevPoints{2,5,10,13,22,84}
currPoints{1,9,15,99}
现在您基本上需要弄清楚哪些currPoints应该进入prevPoints。该算法类似于合并2个排序数组,只是不合并,而是替换值

最初,两个指针都位于相应数组的开头。1 from currpoints应替换prevPoints中的2,因为currpoints中的值小于prevPoints,并且您知道prevPoints中的下一个点将仅高于2个排序arry,记住。更换并移动指针

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

现在,指针指向10,指针指向9。9小于10,因此必须进行更换。由于该最小绝对差小于之前的1<4,因此将用9代替10

现在,prevpointer位于13,currpointer位于15

以同样的方式进行

将prevPoints数组重新排列为原始方向


希望这有帮助

我们将第一个列表按x位置排序,第二个列表按y位置排序。因此,每个点在每个列表中都有一个位置。对于最近邻搜索,你可以这样做,至少我想到的是,你可以通过二进制搜索找到每个列表中点的位置。然后我们知道4个方向,要么是+-1x,要么是+-y,基本上我们沿着每个方向移动,直到目前为止的最佳长度大于一个坐标的距离

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

这使得一种高效、快速的nlogn最近点算法能够找到单个点。但是,由于我们只需要两个排序的列表,一旦我们在nlogn-time中有了这些列表,我们就可以在logn-time中找到所有剩余点的最近点。在x排序列表中查找位置,在y排序列表中查找位置。然后向外螺旋,直到截断,并找到最近的点。但是,由于脚手架在每种情况下都是相同的,因此最终应该是相当快的

尽管考虑到您的实际测试用例,您可能想提出一些非常有效的启发式方法

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


同样地,我们假设物体的所有点的移动方向大致相同。就像每个点从F0到F1移动+5、+5一样,我们不仅可以猜测它们在F2的位置,而且可以非常有效地知道这些对象构成了同一个对象。

点排序了吗?二进制搜索速度够快吗?如果前面的两个点都离同一个currentPoint最近,它们是各自变形到同一个点还是仅变形到最近的一个点?另一个只是停下来,还是在这些东西之外找到了最近的另一个点?@Tatarize另一个必须被忽略。我希望每个斑点一个点,如果斑点合并,他们应该变成一个。聪明的伙伴!我会试试这个,如果我卡住了就回来!v
ideo在一个会议室里,人们很长一段时间都不会离开这个框架。只要他们还在,我就要一直盯着他们。我要算一下入住率。简单的斑点计数的问题是,当人们长时间静止不动时,我用于BG减法的BG MOG技术会将他们从前景中移除。如果我能追踪这些斑点并记住最后一个已知的位置,我仍会继续数数它们,直到它们离开房间。要求它们都在额头上戴上绿色的大球。问题解决了是的,如果你能认出他们是人,找到他们的大致位置,就很容易找到从最后一帧到这一帧最近的点。我在上面的方法肯定会起作用,如果它们移动不多,你可以很好地将排序列表从一帧保留到另一帧,然后当你改变这些点的位置时,它应该每次交换大约0个点,并且对于算法有大量的最佳情况排序。-我个人用它来表示每次迭代都离最近的点更近的点,但是你当然可以只跟踪这些点。