我对单应性的概念很感兴趣,并试图用python和OpenCV以最小的示例实现它。然而,我的测试没有通过,我不太确定原因。我根据This将一组对应的点传递到 findHomography 函数中,然后乘以单应性矩阵以接收新的点。
所以它背后的思想是找到平面坐标变换,然后用
X' = H@X
其中X ′是新坐标,X是新坐标系中的坐标。
下面是一些最小的代码示例:
import cv2
import numpy as np
import matplotlib.pyplot as plt
points = np.array([
[675, 585],
[675, 1722],
[3155, 580],
[3162, 1722],
])
t_points = np.array([
[0,0],
[0, 8.23],
[23.77, 0],
[23.77, 8.23]
])
pt = np.array([675, 580+(1722-580)/2, 0])
pt_test = np.array([0,8.23/2, 0])
def get_h_matrix(src_list, dst_list):
src_pts = np.array(src_list).reshape(-1,1,2)
dst_pts = np.array(dst_list).reshape(-1,1,2)
H, mask = cv2.findHomography(src_pts, dst_pts)
return H
H = get_h_matrix(points, t_points)
transformed = H@pt
plt.scatter(t_points[:,0], t_points[:,1], color = 'blue')
plt.scatter(transformed[0], transformed[1], color = 'orange')
plt.scatter(pt_test[0], pt_test[1], color = 'green')
plt.show()
plt.scatter(points[:,0], points[:,1], color = 'blue')
plt.scatter(pt[0],pt[1], color = 'orange')
plt.show()
其中输出对应于下面的曲线Plot of the coordinate Transformation。我们可以看到,变换点实际上应该在的绿点甚至不接近单应变换点到的橙子点。
也许有人能看出我的思路中的错误。您的帮助非常感谢。编辑:我交换了几次点数组,因为我认为我犯了一个错误,但仍然转换错误。
1条答案
按热度按时间wkyowqbh1#
正如评论中提到的Micka,问题在于测试点的表示。
代替
变换后,齐次坐标将通过以下方式转换回来
谢谢你的帮助。