如何解决`cv.findHomography` 的解释
我正在尝试使用 opencv 找到两组点之间的单应性。我有源 src
和目标 dst
,我正在计算单应 H
如下。
import numpy as np
import cv2
src = np.array([[-47.59,-57.43,139.59,149.43,46.],[141.43,31.03,-1.43,108.97,70.],[579.23,412.75,422.55,589.03,500.89]])
dst = np.array([[-100,-100,100,0],[-100,[0,0]])
H,_ = cv2.findHomography(src.T,dst.T)
print(np.allclose(H@src,dst))
OpenCV 正在计算单应性,但是当我尝试使用计算出的 dst
恢复原始 H
时,它不起作用。 np.allclose(H@src,dst)
给 False
但是,如果我仔细观察这两个数组,就会发现以下是我所拥有的。
两组值之间有明确的对应关系。如果不是最后一行,我几乎可以说它们只是按比例因子关闭。显然,比例因子为零是没有意义的。我在这里错过了什么?
解决方法
由于 3x3 单应矩阵计算两个空间之间的 2D 点集之间的变换,因此在 dst
的最后一个组件中具有 0 将是一个问题。
这是因为 src
和 dst
必须是齐次表示的一组 2D 点。因此,具有 0 将使这些点处于无穷大。
也许您正在寻找这样的东西:
import cv2
import numpy as np
if __name__ == '__main__':
src = np.array([[-47.59,-57.43,139.59,149.43,46.],[141.43,31.03,-1.43,108.97,70.],[579.23,412.75,422.55,589.03,500.89]])
dst = np.array([[-100,-100,100,0],[-100,[1,1,1]]) # converting to homogeneous coordinates
H,_ = cv2.findHomography(src.T,dst.T)
dst_est = H @ src
print(np.allclose(dst_est / (dst_est[2,:]),dst / dst[2,:],atol=1e-2)) # dividing by last component to fix the scaling and adjusting the tolerance
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。