【问题标题】:homography and image scaling in opencvopencv中的单应性和图像缩放
【发布时间】:2017-02-01 18:01:35
【问题描述】:

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

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

我想我可以通过以下方式简单地转换单应矩阵HH_full_size = A * H * A_inverse,其中A 是表示从img1small1 的缩放矩阵,A_inverse 是它的逆矩阵。 但是,这不起作用。如果我用Hcv2.warpPerspective 应用于缩小的图像small1,一切都会按预期进行,结果(大部分)与small2 重叠。如果我将cv2.warpPerspective 应用于带有H_full_size 的完整尺寸图像img1,则结果不会映射到img2

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

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

【问题讨论】:

    标签: python opencv coordinate-transformation homography


    【解决方案1】:

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

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

    S = [1,1,比例; 1,1,比例; 1/比例,1/比例,1]

    H_full_size = S * H

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

    【讨论】:

    【解决方案2】:

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

    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% 的点)。 此外,1080p 分辨率图像中明显的错误在 320p 分辨率图像中可能不那么明显(您没有指定 多少 减少图像!)

    【讨论】:

    • 感谢您的回答。是的,img1 和 img2 大小相同,并且按相同的因子按比例缩小 - 抱歉,我应该在原始帖子中更清楚地说明这一点。所以用你的话说 A 和 B 一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2017-03-09
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多