我有一个场景的点云,其中一个感兴趣的对象与其他一些点一起存在。我还知道恰好是一个长方体的 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_translation
并inverse_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];
}
}
我还将点云转换为相机坐标系并使用边界框将其可视化,边界框不再围绕对象。此外,我看到边界框的大小略有变化。
我怀疑我在进行逆变换时做错了什么。关于如何完成这项工作的任何想法?