繁体   English   中英

opencv中的单应性和图像缩放

[英]homography and image scaling in opencv

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

为了使计算更快的I缩小两个图像到small1small2并在这些较小的副本进行计算,所以计算单应矩阵H ,它映射small1small2 但是,最后,我想使用计算单应矩阵将一个全尺寸图像img1投影到另一个全尺寸图像img2

以为可以简单地变换单应矩阵H以下列方式H_full_size = A * H * A_inverse其中A是表示从缩放的矩阵img1small1A_inverse是它的逆矩阵。 但是,这是行不通的。 如果我申请cv2.warpPerspective的按比例缩小图像small1H ,一切都如预期的结果(主要)与重叠small2 如果我申请cv2.warpPerspective到全尺寸的图像img1H_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

所以问题变成了:你确定从img1small1的尺度矩阵等于从img2small2的尺度矩阵吗? (或至少它们具有恒定的比例因子值不同)?

如果是您的情况,请记住,在您编写时,同形异义词仅适用于平面图像之间(或在纯旋转的情况下)。 假设您在平面上有 80% 的 SIFT 点,在该平面外有 20% 的点,单应性将所有这些点视为在平面内并找到最小化误差的变换 H(而不是仅适用于 80% 的完美变换)平面上的点)。 此外,在一个1080p分辨率的图像很明显的错误可能是在320P分辨率的图像不那么明显(你不指定减少多少图片!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM