我在聚类云后使用PCL中的Axis Aligned边界框。我用它车辆检测和跟踪应用程序。有没有办法根据云旋转轴对齐框,因为我需要框中的偏航信息。
谢谢
using an OOB doesn't generate a box representative of the vehicle click here for ref. image
答案 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);
注意,为了获得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
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轴上限制旋转,因此不考虑其他两轴旋转