我正在使用Python中的OpenCV中的标准方法计算两个图像img1
和img2
之间的单应性(图像中大部分包含一个平面对象,因此单应性在它们之间运行良好)。也就是说,我使用sift计算图像之间的点匹配,然后调用cv2.findHomography
。
为了使计算更快,我将两个图像缩小为small1
和small2
并对这些较小的副本执行计算,因此我计算了单应矩阵H
,其映射{ {1}}进入small1
。
但是,最后,我想使用计算单应矩阵将一个全尺寸图像small2
投影到另一个全尺寸图像img1
上。
我认为我可以通过以下方式img2
简单地转换单应矩阵H
,其中H_full_size = A * H * A_inverse
是表示从A
到img1
的缩放的矩阵和small1
是相反的。
但是,这不起作用。如果我将A_inverse
应用于带有cv2.warpPerspective
的缩小图像small1
,则一切都按预期进行,结果(很大程度上)与H
重叠。如果我将small2
应用于包含cv2.warpPerspective
的完整尺寸图片img1
,则结果不会映射到H_full_size
。
但是,如果我使用img2
投影点匹配(在缩小的图像上检测到)(使用A
之类的东西),然后我从这些中计算projected_pts = cv2.perspectiveTransform(pts, A)
,一切正常。
知道我在这里做错了什么吗?
答案 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
所以问题变成了:您确定从img1
到small1
的比例矩阵是否等于从img2
到small2
的比例矩阵? (或者至少它们与恒定的比例因子值不同)?
如果是你的情况,请记住,在你写作时,同形作品在平面图像之间(或在纯旋转的情况下)只能 。假设你在一个平面上有80%的SIFT点,并且在这个平面上有20%的点,那么同形异义者会考虑所有这些点,因为它们在一个平面上并找到最小化误差的变换H(而不仅仅是飞机上80%的分数)。 另外,在320p分辨率图像中明显出现的错误在320p分辨率图像中可能不那么明显(您没有指定多少减少图像!)