3D坐标系转换

时间:2018-10-19 11:52:28

标签: 3d rotation computer-vision coordinate-transformation homogenous-transformation

我有一个场景的点云,其中一个感兴趣的对象与其他一些点同时存在。我也知道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];
    }
}

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

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

0 个答案:

没有答案