点云库旋转轴对齐边界框

Point Cloud Library Rotation of Axis Alligned Bounding Box

本文关键字:对齐 边界 旋转      更新时间:2023-10-16

在对云进行聚类后,我在 PCL 中使用轴对齐边界框。我使用它车辆检测和跟踪应用程序。有没有办法根据云旋转轴对齐框,因为我需要框中的偏航信息。

谢谢

使用 OOB 不会生成代表车辆的框 单击此处查看参考图像

Using pcl::MomentOfInertiaEstimation

官方 PCL 教程:基于转动惯量和偏心率的描述符。

如果你对偏航感兴趣,那么你需要使用OBB(定向边界框),而不是AABB(轴对齐边界框)。顾名思义,AABB与轴对齐,基本上相当于取每个坐标的最小/最大值。PCL 中的 OBB 基于主成分分析的特征向量 (最大方差方向).

用于提取 OBB 的代码(来自教程):

pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;
feature_extractor.setInputCloud (cloud);
feature_extractor.compute ();
pcl::PointXYZ min_point_OBB;
pcl::PointXYZ max_point_OBB;
pcl::PointXYZ position_OBB;
Eigen::Matrix3f rotational_matrix_OBB;
Eigen::Vector3f major_vector, middle_vector, minor_vector;
Eigen::Vector3f mass_center;
feature_extractor.getOBB (min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);
feature_extractor.getEigenVectors (major_vector, middle_vector, minor_vector);
feature_extractor.getMassCenter (mass_center);

从文档中:

注意,为了得到OBB的,给定AABB的每个顶点 (用 min_point 和 max_point 指定)必须与 给定旋转矩阵(旋转变换)然后定位。

所以要得到最后的OBB - 坐标:

Eigen::Vector3f p1 (min_point_OBB.x, min_point_OBB.y, min_point_OBB.z);
Eigen::Vector3f p2 (min_point_OBB.x, min_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p3 (max_point_OBB.x, min_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p4 (max_point_OBB.x, min_point_OBB.y, min_point_OBB.z);
Eigen::Vector3f p5 (min_point_OBB.x, max_point_OBB.y, min_point_OBB.z);
Eigen::Vector3f p6 (min_point_OBB.x, max_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p7 (max_point_OBB.x, max_point_OBB.y, max_point_OBB.z);
Eigen::Vector3f p8 (max_point_OBB.x, max_point_OBB.y, min_point_OBB.z);
p1 = rotational_matrix_OBB * p1 + position;
p2 = rotational_matrix_OBB * p2 + position;
p3 = rotational_matrix_OBB * p3 + position;
p4 = rotational_matrix_OBB * p4 + position;
p5 = rotational_matrix_OBB * p5 + position;
p6 = rotational_matrix_OBB * p6 + position;
p7 = rotational_matrix_OBB * p7 + position;
p8 = rotational_matrix_OBB * p8 + position;

使用 pcl::p ca

PCL 文档

教程在 codextechnicanum.blogspot.co.il

如果您只对车辆的方向矢量感兴趣,则假设它沿着主要特征矢量:

pcl::PCA<pcl::PointXYZ> pca(cloud, true);
Eigen::Matrix3f eigen_vector = pca.getEigenVectors(); // returns a matrix where the columns are the axis of your bounding box    
Eigen::Vector3f direction = eigen_vector.col(0);

为此找到了解决方案。我使用 OOBB 来限制仅在 z 轴上的旋转,因此不考虑其他两个轴的旋转

Eigen::Vector3f ea = rotational_matrix_OBB.eulerAngles(0, 0, yaw);