`cv.findHomography` 的解释

Posted

技术标签:

【中文标题】`cv.findHomography` 的解释【英文标题】:Explanation of `cv.findHomography` 【发布时间】:2021-05-10 15:33:46 【问题描述】:

我正在尝试使用 opencv 查找两组点之间的单应性。我有源src 和目标dst,我正在计算单应性H 如下。

import numpy as np
import cv2

src = np.array([[-47.59, -57.43, 139.59, 149.43, 46.],
       [141.43, 31.03, -1.43, 108.97, 70.],
       [579.23, 412.75, 422.55, 589.03, 500.89]])


dst = np.array([[-100, -100, 100, 100, 0],
       [-100, 100, 100, -100, 0],
       [0, 0, 0, 0, 0]])


H, _ = cv2.findHomography(src.T, dst.T)

print(np.allclose(H@src, dst))

OpenCV 正在计算单应性,但是当我尝试使用计算出的 H 恢复原始 dst 时,它不起作用。 np.allclose(H@src, dst)False

但是,如果我仔细看一下这两个数组,我所拥有的如下。

两组值之间有明确的对应关系。如果不是最后一行,我几乎可以很自在地说它们只是按比例因子缩小了。显然,比例因子为零是没有意义的。我在这里错过了什么?

【问题讨论】:

【参考方案1】:

由于 3x3 单应矩阵计算两个空间之间的 2D 点集之间的转换,因此 dst 的最后一个分量中的 0 将是一个问题。 这是因为srcdst 必须是齐次表示中的一组二维点。因此,具有 0 将使这些点在无穷大。

也许你正在寻找这样的东西:

import cv2
import numpy as np

if __name__ == '__main__':
    src = np.array([[-47.59, -57.43, 139.59, 149.43, 46.],
                    [141.43, 31.03, -1.43, 108.97, 70.],
                    [579.23, 412.75, 422.55, 589.03, 500.89]])

    dst = np.array([[-100, -100, 100, 100, 0],
                    [-100, 100, 100, -100, 0],
                    [1, 1, 1, 1, 1]])  # converting to homogeneous coordinates

    H, _ = cv2.findHomography(src.T, dst.T)
    dst_est = H @ src
    print(np.allclose(dst_est / (dst_est[2, :]), dst / dst[2, :], atol=1e-2))  # dividing by last component to fix the scaling and adjusting the tolerance

【讨论】:

谢谢,但问题是我试图在这里找到两组 3D 点之间的单应性,实际上。我确实尝试通过将一行添加到两个数组来将其转换为齐次坐标,但随后 cv 抱怨 4D 输入无效。那么这是否意味着opencv单应性根本不能与3D点一起使用? 如果 4D 输入无效,并且函数总是期望坐标系的同质表示,那么我猜 3D 点对函数无效? :(

以上是关于`cv.findHomography` 的解释的主要内容,如果未能解决你的问题,请参考以下文章

opencv cv2.findHomography sift、surf特征匹配 单应性矩阵理解

Python:OpenCV findHomography输入

OpenCV RANSAC 每次都返回相同的转换

名词解释: Wi-Fi

有个问题想明确的人出来解释一下WiFi有没有关于4G和5G的区分?

急求ansys命令流解释,非常感谢!