算法:从已知点的星座中找到2d方向?

时间:2010-11-10 00:54:53

标签: algorithm geometry

问题

给定一组已知的笛卡尔点(集合A),以及这些点的某些子集(集合B)的2d变换(旋转,平移,缩放),找到子集的方向(旋转,平移,缩放)相对于原来的一组点。

即。假设我在墙上拍摄了一组已知的2d点的“图片”。我想知道拍摄照片时相机相对于“直立和居中”的位置。某些点可能在图片中不可见(它们可能被遮挡)。 (在这个比喻中,假设相机是正交的,并且总是直接指向墙的平面,因此您不需要考虑失真或透视)。


提议的方法:

步骤1:将B缩放到与A

相同的“范围”

不知道怎么样;愿意接受建议。也许在B的所有点周围采用凸包的面积,并将其缩放到接近A的凸包的位置。这很棘手,因为B可能缺少点。

步骤2:将“B”中的某些任意点与“A”中的双胞胎匹配

在集合B中选择一些随机点。调用此点K.以某种方式取K的“指纹”相对于B中的所有其他点(仅使用距离)。通过指纹识别A中的所有点并使用最相似的K指纹点来找到它在A中的匹配。

步骤3:旋转B(大约K)直到B中的所有点与A中的点对齐

可以使用多种解决方案,因此请通过360d继续旋转寻找解决方案。


那只是从臀部射击,我可能会离开基地。有人有什么想法吗?

3 个答案:

答案 0 :(得分:2)

假设您实际上并不知道两个云中各点之间的对应关系,您可以尝试统计方法。

首先,计算原始云的平均值x0,然后计算子集云的平均值x1。平均向量x1-x0的差异是对所需翻译的良好估计。

现在,从每个集合中减去相关的均值向量,得到两个以原点为中心的云。计算每个云的协方差矩阵并找到其特征值和特征向量。可以从特征向量找到所需的旋转,而缩放对应于特征值。

撰写所有这些,你应该对所需的变换有一个很好的统计估计。显然,它的质量将取决于子集跨越原始集合的程度。

答案 1 :(得分:1)

“给我一个站立的地方,我将移动地球”阿基米德

我认为我们应该遵循阿基米德的步骤

Arpi的算法: 我们必须选择坐标为(0,0)的集合A的点(X1)。 (这将是站立的地方)

选择另一个点(X2)并将其放在OX矢量上(以简化操作)

来自集合A的所有其他点坐标将基于X1(0,0)和X2(some_Coordinate,0)的坐标计算。

现在,从集合B(Y1)中选择一个点,它将是B集的中心。从集合B(Y2)中选择另一个点并将其置于B集的OX中。现在,我们有一个比例标量和一个旋转角度。如果这是一个解决方案,则B组中的Y1表示来自A组的X1,而来自B组的Y2表示来自A组的X2。如果我们可以基于此在B组和A组之间找到映射,则使用B组的所有点和Yi<>。是的,如果我<> j,其中i和j是我们表示中的点的索引,而不是我们有可能的解决方案,我们存储它。 Arpi的算法结束

要找到所有可能的解决方案,您必须执行以下操作:

foreach point in A as X1 do
    foreach point in A as X2 do
        arpi's algoritm(X1, X2)

当然,您可以对此进行优化,但为了简单起见,我在没有优化(并发症)的情况下对其进行了描述,只有在您需要时才会优化此功能。

答案 2 :(得分:0)

我会尽量减少目标点与找到的点之间的偏差。含义我将每个目标点与找到的点配对,并对所有目标点应用任何变换(旋转,缩放或倾斜),从而减少偏差的总和。我会对所有潜在的对重复这一点,最终将匹配作为对的集合和必要的变换,总偏差最小。

真正的问题是如何优化它,使性能优于O(n ^ 2)。我想某种启发式匹配,可能是缓存中间结果,或者找到一种在过程早期消除一些对的方法。