给定一组已知的笛卡尔点(集合A),以及这些点的某些子集(集合B)的2d变换(旋转,平移,缩放),找到子集的方向(旋转,平移,缩放)相对于原来的一组点。
即。假设我在墙上拍摄了一组已知的2d点的“图片”。我想知道拍摄照片时相机相对于“直立和居中”的位置。某些点可能在图片中不可见(它们可能被遮挡)。 (在这个比喻中,假设相机是正交的,并且总是直接指向墙的平面,因此您不需要考虑失真或透视)。
不知道怎么样;愿意接受建议。也许在B的所有点周围采用凸包的面积,并将其缩放到接近A的凸包的位置。这很棘手,因为B可能缺少点。
在集合B中选择一些随机点。调用此点K.以某种方式取K的“指纹”相对于B中的所有其他点(仅使用距离)。通过指纹识别A中的所有点并使用最相似的K指纹点来找到它在A中的匹配。
可以使用多种解决方案,因此请通过360d继续旋转寻找解决方案。
那只是从臀部射击,我可能会离开基地。有人有什么想法吗?
答案 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)。我想某种启发式匹配,可能是缓存中间结果,或者找到一种在过程早期消除一些对的方法。