以最少的点数理解 OpenCV 单应性
Understanding OpenCV homography at a minimum of points
我对单应性的想法很感兴趣,并尝试让它在 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。我们可以看到,实际上应该是变换点的绿色点甚至不接近单应性变换点到的橙色点。
也许有人能看出我思路的错误。
非常感谢您的帮助。
编辑:我交换了几次点数组,因为我以为我犯了一个错误,但仍然是错误的转换。
如评论中Micka所述,问题是测试点的表示。
pt = [x,y,1]
而不是
pt = [x,y,0]
变换后,齐次坐标由
变换回来
pt' = pt'/pt'[2]
感谢您的帮助。
我对单应性的想法很感兴趣,并尝试让它在 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。我们可以看到,实际上应该是变换点的绿色点甚至不接近单应性变换点到的橙色点。
也许有人能看出我思路的错误。 非常感谢您的帮助。 编辑:我交换了几次点数组,因为我以为我犯了一个错误,但仍然是错误的转换。
如评论中Micka所述,问题是测试点的表示。
pt = [x,y,1]
而不是
pt = [x,y,0]
变换后,齐次坐标由
变换回来pt' = pt'/pt'[2]
感谢您的帮助。