`cv.findHomography` 的解释
Explanation of `cv.findHomography`
我正在尝试使用 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
然而,如果我仔细看看这两个数组,下面就是我所拥有的。
两组值之间有明显的对应关系。如果不是最后一行,我几乎可以很自在地说它们只是一个比例因子。显然,零比例因子没有意义。我在这里错过了什么?
因为 3x3 单应矩阵计算两个空间之间的二维点集之间的变换,所以 dst
的最后一个分量为 0 将是一个问题。
这是因为 src
和 dst
必须是一组均匀表示的二维点。因此,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
我正在尝试使用 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
然而,如果我仔细看看这两个数组,下面就是我所拥有的。
两组值之间有明显的对应关系。如果不是最后一行,我几乎可以很自在地说它们只是一个比例因子。显然,零比例因子没有意义。我在这里错过了什么?
因为 3x3 单应矩阵计算两个空间之间的二维点集之间的变换,所以 dst
的最后一个分量为 0 将是一个问题。
这是因为 src
和 dst
必须是一组均匀表示的二维点。因此,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