我有两个标定相机:(R1,T1,K1)和(R2,T2,K2),其中R:3x3旋转矩阵到世界坐标,T:3x1平移矩阵到世界坐标,K: 3x3本征矩阵。我想要计算基本矩阵F,它将Camera1中的一个点转换为Camera2中的一条线(结语)。以下是我所做的:
import numpy as np
def get_fundamental_matrix(R1, T1, K1, R2, T2, K2):
# compute transformation matrix from world coordinate to camera system
P1 = np.eye(4)
P1[:3,:3] = R1
P1[:3, 3] = T1
P2 = np.eye(4)
P2[:3,:3] = R2
P2[:3, 3] = T2
# compute transformation matrix from camera2 to camera1
P = P1 @ np.linalg.inv(P2)
R = P[:3,:3]
T = P[:3, 3]
def skew(x):
x = x.flatten()
return np.array([[ 0,-x[2], x[1]],
[ x[2], 0, -x[0]],
[-x[1], x[0], 0]])
# essensial matrix
E = skew(T) @ R
F = np.linalg.inv(K1).T @ E @ np.linalg.inv(K2)
F = F/F[2, 2]
return F然而,F与使用8点法从OpenCV得到的F不相似。我做错什么了?
发布于 2022-04-28 08:02:21
实际上,这个代码没有问题。这里唯一需要补充的是考虑相机的失真。如果增加失真,爱马仕就会变得更精确。
较好的解决方法是从两个投影矩阵中求出基本矩阵。有关此函数,可以参考opencv库。
https://stackoverflow.com/questions/72037266
复制相似问题