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