1

我有一个场景的点云,其中一个感兴趣的对象与其他一些点一起存在。我还知道恰好是一个长方体的 3D 边界框的八个角的坐标。

现在我有一个用例,我需要将此点云转换为相机坐标系,其中每个 3D 点都将获得一个新的 XYZ 坐标。同理,3D包围盒的八个角点应该转化为相机坐标系。

现在我有了外在矩阵;(旋转矩阵和平移)将列向量从相机坐标系转换为世界坐标系。为简单起见,我将旋转矩阵转换为四元数。

我想将点云和边界框坐标从世界坐标系转换为相机坐标系。所以我通过简单的逆旋转和负平移来获得逆变换,如下所示:

void get_inverse_transform( const Eigen::Quaternionf& orientation,
                            const Eigen::Vector3f& translation,
                            Eigen::Quaternionf& inverse_orientation,
                            Eigen::Vector3f& inverse_traslation)
{

    inverse_orientation = orientation.normalize().inverse().normalise();
    inverse_translation = -1*inverse_orientation._transformVector(position);
}

现在,inverse_translationinverse_orientation持有将世界坐标系中的点转换为相机坐标系的变换。

因此,我通过以下方式使用此转换将边界框的八个角转换为相机坐标:

void project2CS( const Eigen::Quaternionf& inverse_orientation,
                 const Eigen::Vector3f& inverse_position,
                 std::vector<Eigen::Vector3f>& bbox3d_corners)
{

    for( auto& corner: bbox3d_corners )
    {
        auto transformed_vec = inverse_orientation._transformVector(corner) + inverse_translation;
        corner[0] = transformed_vec[0];
        corner[1] = transformed_vec[1];
        corner[2] = transformed_vec[2];
    }
}

我还将点云转换为相机坐标系并使用边界框将其可视化,边界框不再围绕对象。此外,我看到边界框的大小略有变化。

我怀疑我在进行逆变换时做错了什么。关于如何完成这项工作的任何想法?

4

0 回答 0