我想计算一个相似性对齐,该对齐覆盖两组对应的点(旋转、缩放、平移)。 OpenCV 有一个可爱的函数可以做到这一点,estimateAffine3D()。尽管还有其他一些关于它的堆栈溢出问题,但没有人提出如何使用此函数来执行其宣传的功能的实际示例(即使函数文档是不透明的)。用代码示例提出并回答我自己的问题,只是为了记录下来并节省您一些时间。
def similarity_align(v_src, v_target, v_transform=None):
"""find a similarity transformation that best maps v_src to vs_target
(points are in correspondence by index).
v_src and v_target are numpy arrays of 3d points by row.
Returns transformed v_transform if given, else transformed v_src
"""
xform, scale = cv2.estimateAffine3D(v_src, v_target, force_rotation=True)
src = v_src if v_transform is None else v_transform
aligned = src.dot(xform[:, :3].T) * scale + xform[:, 3]
return aligned