我有两组无序的 3D 点(A 和 B),我想对齐它们。如果匹配正确,这两组非常相似:除了一个点移动剧烈外,其他点基本处于同一位置。我想要得到的是允许我将 A 匹配到 B 的转换矩阵。
我研究了CPD(相干点漂移)算法并尝试使用pycpd python 模块编写解决方案,但它似乎没有按预期工作。当使用两个相同的点集进行测试时,只有一个点的一个坐标(在示例中B[0][1]
)发生了变化,这两个点集没有正确对齐......
这是我的输入代码:
from functools import partial
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from pycpd import RigidRegistration
def visualize(iteration, error, X, Y, ax):
plt.cla()
ax.scatter(X[:, 0], X[:, 1], X[:, 2], color='red', label='B')
ax.scatter(Y[:, 0], Y[:, 1], Y[:, 2], color='blue', label='A')
ax.legend(loc='upper left', fontsize='x-large')
plt.draw()
plt.pause(1)
A = np.array([[ 233.75321882, 80.8999887, 191.02015154],
[ 161.74399384, 97.85766357, 166.16504879],
[ 247.64107351, -49.8844893, 165.82278204],
[ 170.09968881, -121.22031994, 225.38403046],
[ 231.55268473, -38.23184623, 266.80948112],
[ 211.29510888, 80.34622857, 358.87705386]])
B = np.array([[ 233.75321882, 200.8999887, 191.02015154],
[ 161.74399384, 97.85766357, 166.16504879],
[ 247.64107351, -49.8844893, 165.82278204],
[ 170.09968881, -121.22031994, 225.38403046],
[ 231.55268473, -38.23184623, 266.80948112],
[ 211.29510888, 80.34622857, 358.87705386]])
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
callback = partial(visualize, ax=ax)
reg = RigidRegistration(**{'X': B, 'Y': A, 'tolerance': 0.00001, 'max_iterations': 1000})
reg.register(callback)
plt.show()
这是运行严格注册后的结果点
知道我可能做错了什么吗?你能为我指出正确的方向吗?
谢谢