问题描述
我对单应性的想法很感兴趣,并尝试使其在使用 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,])
t_points = np.array([
[0,0],[0,8.23],[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,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[:,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[:,points[:,color = 'blue')
plt.scatter(pt[0],pt[1],color = 'orange')
plt.show()
其中输出对应于下图 Plot of the coordinate Transformation。我们可以看到,实际上应该是变换点的绿色点,甚至不接近单应变换点的橙色点。
也许有人能看出我思路中的错误。 非常感谢您的帮助。 编辑:我交换了几次点数组,因为我认为我犯了一个错误,但仍然是错误的转换。