[英]homography and image scaling in opencv
我正在计算两个图像img1
和img2
之间的单应性(图像主要包含一个平面对象,因此单应性在它们之间运行良好)在 python 中使用 OpenCV 中的标准方法。 即,我使用 sift 计算图像之间的点匹配,然后调用cv2.findHomography
。
为了使计算更快的I缩小两个图像到small1
和small2
并在这些较小的副本进行计算,所以计算单应矩阵H
,它映射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)
类的东西) projected_pts = cv2.perspectiveTransform(pts, A)
点匹配(在缩小的图像上检测到),然后我H_full_size
计算H_full_size
,一切正常。
知道我在这里做错了什么吗?
在我看来,问题是单应性应用透视投影,这是一种非线性变换(仅在使用齐次坐标时才为线性),不能表示为正常变换矩阵。 因此,将这种透视投影矩阵与一些其他变换相乘会产生不良结果。
您可以尝试将原始矩阵 H 元素与以下元素相乘:
S = [1,1,scale ; 1,1,规模; 1/比例,1/比例,1]
H_full_size = S * H
其中 scale 是例如 2,如果您将原始图像的大小减小 2。
我认为你在这段话中的错误假设
H_full_size = A * H * A_inverse
其中A
是表示从 img1 到H_full_size = A * H * A_inverse
缩放的矩阵
源于人类的“爱”源于对称。 开个玩笑,在引入我将要揭露的假设之后,你的公式是正确的。 如果我从这个考虑开始(这与 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% 的完美变换)平面上的点)。 此外,在一个1080p分辨率的图像很明显的错误可能是在320P分辨率的图像不那么明显(你不指定减少多少图片!)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.