# 将发根点数据进行配准(成功)
# affine——2D
# 输入的第一个量X不变,将第二个量Y往第一个量上做偏移
from functools import partial
import matplotlib.pyplot as plt
from pycpd import AffineRegistration
import numpy as np
import cv2
def apply_affine_transformation(B, t, points, image_shape):
# 创建一个空白图片
transformed_image = np.zeros((*image_shape, 3), dtype=np.uint8)
# 应用仿射变换
transformed_points = np.dot(points, B.T) + t
print(transformed_points)
# 将变换后的点绘制在图片上
for point in transformed_points:
x, y = map(int, point)
cv2.circle(transformed_image, (x, y), 3, (255, 255, 255), -1)
return transformed_image
def visualize(iteration, error, X, Y, ax):
plt.cla()
ax.scatter(X[:, 0], X[:, 1], color='red', label='Target')
ax.scatter(Y[:, 0], Y[:, 1], color='blue', label='Source')
plt.text(0.87, 0.92, 'Iteration: {:d}\nQ: {:06.4f}'.format(
iteration, error), horizontalalignment='center', verticalalignment='center', transform=ax.transAxes,
fontsize='x-large')
ax.legend(loc='upper left', fontsize='x-large')
ax.invert_yaxis() # 反转 y 轴方向
plt.draw()
plt.pause(0.001)
def main():
X = np.loadtxt('../data/1.txt', delimiter=',')
Y = np.loadtxt('../data/2.txt', delimiter=',')
fig = plt.figure()
ax = fig.add_subplot(111)
# 创建了一个新的函数,其只需要提供iteration, error, X, Y这些参数,而ax参数已经固定为ax变量所代表的对象。
callback = partial(visualize, ax=ax)
reg = AffineRegistration(**{'X': X, 'Y': Y})
reg.register(callback)
plt.show()
# 获取最终的仿射变换矩阵和平移向量
final_B, final_t = reg.get_registration_parameters()
print("Final affine transformation matrix:")
print(final_B)
print("Final translation vector:")
print(final_t)
# 创建一个空白图片,大小为 (height, width)
height, width = 1944, 2596
# 将目标点集 Y 应用仿射变换,并绘制在空白图片上
transformed_image = apply_affine_transformation(final_B, final_t, X, (height, width))
# 显示绘制好的图片
plt.imshow(transformed_image)
plt.axis('off')
plt.show()
if __name__ == '__main__':
main()
在可视化界面中,发现两组二维点可以较好的重合在一起,但是使用final_B, final_t对点集进行仿射变换,变换后的点集坐标与需要匹配的点集坐标出现很大的误差,有没有大佬可以解释下