以最少的点数理解 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]

感谢您的帮助。