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).
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