opencv

时间:2016-09-23 19:24:26

标签: python opencv coordinate-transformation homography

我正在使用Python中的OpenCV中的标准方法计算两个图像img1img2之间的单应性(图像中大部分包含一个平面对象,因此单应性在它们之间运行良好)。也就是说,我使用sift计算图像之间的点匹配,然后调用cv2.findHomography

为了使计算更快,我将两个图像缩小为small1small2并对这些较小的副本执行计算,因此我计算了单应矩阵H,其映射{ {1}}进入small1。 但是,最后,我想使用计算单应矩阵将一个全尺寸图像small2投影到另一个全尺寸图像img1上。

我认为我可以通过以下方式img2简单地转换单应矩阵H,其中H_full_size = A * H * A_inverse是表示从Aimg1的缩放的矩阵和small1是相反的。 但是,这不起作用。如果我将A_inverse应用于带有cv2.warpPerspective的缩小图像small1,则一切都按预期进行,结果(很大程度上)与H重叠。如果我将small2应用于包含cv2.warpPerspective的完整尺寸图片img1,则结果不会映射到H_full_size

但是,如果我使用img2投影点匹配(在缩小的图像上检测到)(使用A之类的东西),然后我从这些中计算projected_pts = cv2.perspectiveTransform(pts, A),一切正常。

知道我在这里做错了什么吗?

2 个答案:

答案 0 :(得分:1)

我看到它的方式,问题是单应性应用了一个非线性变换的透视投影(它只是在使用齐次坐标时是线性的),不能表示为正常的变换矩阵。将这种透视投影矩阵与其他一些变换相乘会产生不希望的结果。

您可以尝试将原始矩阵H元素乘以:

S = [1,1,比例; 1,1,规模; 1 / scale,1 / scale,1]

H_full_size = S * H

如果您将原始图像的大小减小2,则缩放比例为2。

答案 1 :(得分:0)

我认为你在这段经文中的错误假设

  

H_full_size = A * H * A_inverse其中A是表示从img1到small1的缩放的矩阵

源于人类对称的“爱”。在开玩笑之后,你的公式是正确的,我将介绍一些我要揭露的假设。 如果我从这个考虑开始(这相当于cv2函数cv2,warpPerspective - 关于比例因子的公式是真的)

img2 = H_fullsize*img1

你可以得出你自己的公式。

small2 = B*img2
small1 = A*img1
small2 = H*small1
B*img2 = H*A*img1

这是完全相同的(如果B是可逆的)

img2 = B_inverse*H*A*img1

问题变成了

H_fullsize = B_inverse*H*A

所以问题变成了:您确定从img1small1的比例矩阵是否等于从img2small2的比例矩阵? (或者至少它们与恒定的比例因子值不同)?

如果是你的情况,请记住,在你写作时,同形作品在平面图像之间(或在纯旋转的情况下)只能 。假设你在一个平面上有80%的SIFT点,并且在这个平面上有20%的点,那么同形异义者会考虑所有这些点,因为它们在一个平面上并找到最小化误差的变换H(而不仅仅是飞机上80%的分数)。 另外,在320p分辨率图像中明显出现的错误在320p分辨率图像中可能不那么明显(您没有指定多少减少图像!)