1

我有相机校准内在和外在(包括旋转和平移,即rvecs 和 tvecs,用于一组 N 相机姿势,相对于固定的 ChArUco 目标。

此外,对于每个相机姿势,我都有一组在标准OpenCV 相机坐标系中定义的 3D 坐标(“点云”) 。

经过大量阅读,我会认为我需要首先计算每个相机相对于 ChArUCo 板的姿势,方法是在 python 中构建一个齐次变换矩阵:

    # initialize 4x4 transform
    inverted_homogeneous_transform_matrix = np.zeros(shape=(4,4))
    inverted_homogeneous_transform_matrix[3,3] = 1.0

    # convert Rodrigues vector into Rodrigues matrix, and then invert it
    rotation_matrix = np.zeros(shape=(3,3))
    cv2.Rodrigues(rvecs, rotation_matrix)
    inverted_rotation = rotation_matrix.transpose()

    # add inverted rotation to transform
    inverted_homogeneous_transform_matrix[:3,:3] = inverted_rotation

    # compute inverted translation, e.g. see http://ksimek.github.io/2012/08/22/extrinsic/
    inverted_translation_vector = -inverted_rotation * tvecs
    inverted_transform_matrix[:3,3] = np.asarray(inverted_translation_vector).flatten()

    # x_coords, y_coords, z_coords are defined in camera coordinate system
    x_coords=np.asarray([1,2,3,4,5])
    y_coords=np.asarray([2,4,6,8,10])
    z_coords=np.asarray([3,6,9,12,15])

    homogeneous_ones = np.ones(len(x_coords))
    homogeneous_points = np.matrix([x_coords, y_coords, z_coords, homogeneous_ones])

    # perform the transformation
    transformed_points = inverted_transform_matrix * homogeneous_points

    # clean up to extract x,y,z values from matrix and save as 1D array
    x_coords = np.asarray(transformed_points[0,:]).flatten()
    y_coords = np.asarray(transformed_points[1,:]).flatten()
    z_coords = np.asarray(transformed_points[1,:]).flatten()

基本上,上面的代码可以工作,但是当我从不同的相机角度在多个点云上运行它时,它们并没有像我预期的那样神奇地排列。我可以确认我的逆齐次变换确实是直接从 rvecs 和 tvecs 构造的齐次变换的逆;曾尝试将其分解为先平移然后旋转,反之亦然;并且已经看到非逆变换使所有东西几乎从一个角度排列(但从其他角度都奇怪地旋转)......

任何帮助表示赞赏!

4

0 回答 0