在最少的点上理解OpenCV单应性

gojuced7  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(117)

我对单应性的概念很感兴趣,并试图用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。我们可以看到,变换点实际上应该在的绿点甚至不接近单应变换点到的橙子点。
也许有人能看出我的思路中的错误。您的帮助非常感谢。编辑:我交换了几次点数组,因为我认为我犯了一个错误,但仍然转换错误。

wkyowqbh

wkyowqbh1#

正如评论中提到的Micka,问题在于测试点的表示。

pt = [x,y,1]

代替

pt = [x,y,0]

变换后,齐次坐标将通过以下方式转换回来

pt' = pt'/pt'[2]

谢谢你的帮助。

相关问题