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

问题描述

我对单应性的想法很感兴趣,并尝试使其在使用 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。我们可以看到,实际上应该是变换点的绿色点,甚至不接近单应变换点的橙色点。

也许有人能看出我思路中的错误。 非常感谢您的帮助。 编辑:我交换了几次点数组,因为我认为我犯了一个错误,但仍然是错误的转换。

解决方法

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

pt = [x,y,1]

代替

pt = [x,0]

变换后,齐次坐标被变换回来

pt' = pt'/pt'[2]

感谢您的帮助。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...