开放环境下的单应性和图像缩放

2024-10-01 19:15:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python中OpenCV中的标准方法计算两个图像img1和{}(图像大多包含一个平面对象,因此单应关系在它们之间很好地工作)。也就是说,我使用sift计算图像之间的点匹配,然后调用cv2.findHomography。在

为了加快计算速度,我将两幅图像缩小为small1和{},并对这些较小的副本执行计算,因此我计算了单应矩阵H,它将small1映射为small2。 然而,在最后,我想使用计算单应矩阵将一个全尺寸图像img1投影到另一个全尺寸图像{}上。在

我想我可以简单地将单应矩阵H转换成H_full_size = A * H * A_inverse,其中A是表示从img1到{}的矩阵,A_inverse是它的逆矩阵。 然而,这并不奏效。如果我将cv2.warpPerspective应用于按比例缩小的图像small1,则一切如预期,结果(很大程度上)与small2重叠。如果我将cv2.warpPerspective应用于带有H_full_size的全尺寸图像img1,则结果不会映射到img2。在

但是,如果我使用A(使用类似projected_pts = cv2.perspectiveTransform(pts, A))投影点匹配(在缩小的图像上检测到),然后我从中计算H_full_size,一切都很好。在

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


Tags: 图像size尺寸矩阵cv2opencvfullpts
2条回答

我认为你在这篇文章中的假设是错误的

H_full_size = A * H * A_inverse where A is the matrix representing the scaling from img1 to small1

源于人类“爱”的对称性。开玩笑吧,你的公式是正确的,在我将要揭露的一种低血压。 如果我从这个角度出发(这相当于cv2函数cv2,warpPerspective-对于比例因子,公式是正确的)

img2 = H_fullsize*img1

你可以推导出你自己的公式。在

^{pr2}$

这是相当等价的(如果B是可逆的)

img2 = B_inverse*H*A*img1

问题变成了

H_fullsize = B_inverse*H*A

所以问题变成了:你确定从img1到{}的比例矩阵等于从img2到{}的比例矩阵吗?(或至少它们与恒定比例因子值不同)?在

如果是你的情况,请记住,在你写的时候,同音图只在平面图像之间起作用(或者在纯旋转的情况下)。假设在一个平面上有80%的SIFT点,在这个平面上有20%的点,同应法将所有这些点都视为在一个平面上,并找到使误差最小化的变换H(,而不是平面上80%点的完美变换)。 另外,1080p分辨率图像中明显的错误在320p分辨率图像中可能不那么明显(您没有指定图像减少的程度!)在

在我看来,问题是单应性应用的透视投影是一种非线性变换(只有在使用齐次坐标时才是线性的),不能用法向变换矩阵表示。因此,将这种透视投影矩阵与其他一些变换相乘会产生不理想的结果。在

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

S=[1,1,标度;1,1,标度;1/标度,1/标度,1]

全尺寸=S*H

其中scale为例2,如果将原始图像的大小减小了2。在

相关问题 更多 >

    热门问题