摄像机校准改变轴的方向

2024-04-26 10:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过对相应的三维激光雷达点和二维相机点进行直接线性变换来解决这些非本征问题。我已经有内在的东西了。你知道吗

问题是,相机后面的点也会被重新投影(见下图)。你知道吗

enter image description here

所以我只约束到“摄影机前面”的点,即z>;0。问题是,在使用不同点集的不同试验中,产生的外部矩阵产生不同的轴。有时,约束z>;0会得到正确的结果(图像的中心部分),而有时我需要z<;0,我认为它是进入相机的z轴。所以问题是,如何约束相机的Z轴,使其伸出相机?你知道吗

def with_intrinsic(points2d, points3d, intrinsic):
    cam1_K_inverse = np.linalg.inv(intrinsic)

    #direct linear transformation calibration, assumes no intrinsic matrix
    assert points2d.shape[0] >= 3
    assert points3d.shape[0] == points2d.shape[0]

    A = []

    points2d_homo = []
    for u,v in points2d:
        points2d_homo.append([u, v, 1])

    points2d_homo = np.array(points2d_homo).T #columns to be data points


    points2d_inv = np.dot(cam1_K_inverse, points2d_homo).T
    assert points2d_inv.shape == (points2d.shape[0], 3)
    assert points2d_inv[0, 2] == 1

    for idx in range(points2d.shape[0]):
        x3d, y3d, z3d = points3d[idx]
        u, v, _ = points2d_inv[idx]

        A.append([x3d, y3d, z3d, 1, 0, 0, 0, 0, -u * x3d, -u * y3d, -u * z3d, -u])
        A.append([0, 0, 0, 0, x3d, y3d, z3d, 1, -v * x3d, -v * y3d, -v * z3d, -v])

    A = np.array(A)

    U, D, VT = np.linalg.svd(A)
    M = VT.T[:, -1].reshape((3, 4))

    error = get_reprojection_error(points2d, points3d, intrinsic, M)
    logging.debug("error with_intrinsic: %s", error)

    return M

更新:我试图检查是否重新投影1个“训练”点将产生z<;0。如果是这样的话,我做一个np.dot(R, extrinsic)来围绕轴的1围绕π弧度旋转点。我试过所有3轴,但似乎仍然没有产生正确的结果。你知道吗

R1 = np.array([
        [1, 0, 0],
        [0, np.cos(pi), -np.sin(pi)],
        [0, np.sin(pi), np.cos(pi)],
    ])

R2 = np.array([
        [np.cos(pi), 0, np.sin(pi)],
        [0, 1, 0],
        [-np.sin(pi), 0, np.cos(pi)],
    ])

R3 = np.array([
        [np.cos(pi), -np.sin(pi), 0],
        [np.sin(pi), np.cos(pi), 0],
        [0, 0, 1],
])  

Tags: nppisinassertcosarrayshapehomo