Point Cloud Library轴旋转轴对齐边界框

时间:2018-04-06 08:50:52

标签: c++ point-cloud-library point-clouds

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

谢谢

using an OOB doesn't generate a box representative of the vehicle click here for ref. image

2 个答案:

答案 0 :(得分:1)

使用pcl :: MomentOfInertiaEstimation

官方PCL tutorial:基于描述符的惯性矩和偏心率。

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

用于提取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);

来自documentation

  

注意,为了获得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 :: pca

PCL Documentation

Tutorial at 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);

答案 1 :(得分:0)

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