点云库旋转轴对齐边界框
Point Cloud Library Rotation of Axis Alligned Bounding Box
在对云进行聚类后,我在 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);
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 在 64 位边界上对齐C++结构数组?
- C++11:16 字节原子<>变量是否在 16 字节边界上自动对齐,从而允许CMPXCHG16B指令?
- 点云库旋转轴对齐边界框
- 将缓冲区与 N 字节边界对齐,而不是 2N 字节边界?
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 浮点数组是否始终与16字节边界对齐
- 由于 FPU 或缓存而与 8 字节边界对齐的双精度
- 为什么长长值与 8 字节边界对齐
- 为什么 Dalvik 监视器在 8 字节边界上对齐
- 为什么缓冲区应该在 64 字节边界上对齐以获得最佳性能
- 在未对齐的字节边界上高效打包 10 位数据
- Qt4 QTableWidget使列根据内容调整大小、交互式并与表边界对齐
- 轴对齐边界框碰撞检测问题
- 为什么128位变量应该对齐到16字节边界
- 为什么Malloc()关心边界对齐
- 关于指针对齐,有没有一种方法可以使指针与给定的内存边界对齐
- 如何在平移/旋转后重新计算轴对齐的边界框