0

我有两组无序的 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()

这是运行严格注册后的结果点

知道我可能做错了什么吗?你能为我指出正确的方向吗?

谢谢

4

0 回答 0