1.说明
AABB——轴对齐包围盒:包围盒与坐标轴对齐
OBB——有向包围盒:根据目标本身几何形状设定包围盒的大小、方向
2.代码
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ> min_pt, max_pt;
pcl::getMinMax3D(*cloud, min_pt, max_pt);
/*OBB有向包围盒*/
pcl::MomentOfInertiaEstimation <pcl::PointXYZRGBA> feature_extractor;
feature_extractor.setInputCloud(cloud);
feature_extractor.compute();
std::vector <float> moment_of_inertia;
std::vector <float> eccentricity;
pcl::PointCloud<pcl::PointXYZ> OBB_min_pt;
pcl::PointCloud<pcl::PointXYZ> OBB_max_pt;
pcl::PointCloud<pcl::PointXYZ> OBB_cen_pt;
Eigen::Matrix3f OBB_matrix_r;
float major_value, middle_value, minor_value;
Eigen::Vector3f major_vector, middle_vector, minor_vector;
Eigen::Vector3f mass_center;
feature_extractor.getMomentOfInertia(moment_of_inertia);
feature_extractor.getEccentricity(eccentricity);
feature_extractor.getOBB(OBB_min_pt, OBB_max_pt, OBB_cen_pt, OBB_matrix_r);
feature_extractor.getEigenValues(major_value, middle_value, minor_value);
feature_extractor.getEigenVectors(major_vector, middle_vector, minor_vector);
feature_extractor.getMassCenter(mass_center);
Eigen::Vector3f position(OBB_cen_pt.x, OBB_cen_pt.y, OBB_cen_pt.z);
Eigen::Quaternionf quat(OBB_matrix_r);
Eigen::Vector3f p1(OBB_min_pt.x, OBB_min_pt.y, OBB_min_pt.z);
Eigen::Vector3f p2(OBB_min_pt.x, OBB_min_pt.y, max_pt.z - OBB_max_pt.z - OBB_cen_pt.z);
Eigen::Vector3f p3(OBB_max_pt.x, OBB_min_pt.y, max_pt.z - OBB_max_pt.z - OBB_cen_pt.z);
Eigen::Vector3f p4(OBB_max_pt.x, OBB_min_pt.y, OBB_min_pt.z);
Eigen::Vector3f p5(OBB_min_pt.x, OBB_max_pt.y, OBB_min_pt.z);
Eigen::Vector3f p6(OBB_min_pt.x, OBB_max_pt.y, max_pt.z - OBB_max_pt.z - OBB_cen_pt.z);
Eigen::Vector3f p7(OBB_max_pt.x, OBB_max_pt.y, max_pt.z - OBB_max_pt.z - OBB_cen_pt.z);
Eigen::Vector3f p8(OBB_max_pt.x, OBB_max_pt.y, OBB_min_pt.z);
p1 = OBB_matrix_r * p1 + position;
p2 = OBB_matrix_r * p2 + position;
p3 = OBB_matrix_r * p3 + position;
p4 = OBB_matrix_r * p4 + position;
p5 = OBB_matrix_r * p5 + position;
p6 = OBB_matrix_r * p6 + position;
p7 = OBB_matrix_r * p7 + position;
p8 = OBB_matrix_r * p8 + position;
/*外包六面体顶点*/
pcl::PointXYZ pt1(p1(0), p1(1), p1(2));
pcl::PointXYZ pt2(p2(0), p2(1), p2(2));
pcl::PointXYZ pt3(p3(0), p3(1), p3(2));
pcl::PointXYZ pt4(p4(0), p4(1), p4(2));
pcl::PointXYZ pt5(p5(0), p5(1), p5(2));
pcl::PointXYZ pt6(p6(0), p6(1), p6(2));
pcl::PointXYZ pt7(p7(0), p7(1), p7(2));
pcl::PointXYZ pt8(p8(0), p8(1), p8(2));
/*显示*/
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("cloud show"));
int v1 = 0;
viewer->createViewPort(0, 0, 1.0, 1.0, v1);
viewer->setBackgroundColor(255,255, 255, v1);
viewer->setBackgroundColor(255,255, 255);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> raw(cloud, 0, 0, 0);
viewer->addPointCloud(cloud, raw, "source cloud", v1);
viewer->addLine<pcl::PointXYZ> (pt1, pt2, "line1");
viewer->addLine<pcl::PointXYZ> (pt1, pt3, "line2");
viewer->addLine<pcl::PointXYZ> (pt1, pt5, "line3");
viewer->addLine<pcl::PointXYZ> (pt2, pt4, "line4");
viewer->addLine<pcl::PointXYZ> (pt2, pt8, "line5");
viewer->addLine<pcl::PointXYZ> (pt3, pt4, "line6");
viewer->addLine<pcl::PointXYZ> (pt3, pt6, "line7");
viewer->addLine<pcl::PointXYZ> (pt4, pt7, "line8");
viewer->addLine<pcl::PointXYZ> (pt5, pt6, "line9");
viewer->addLine<pcl::PointXYZ> (pt5, pt8, "line10");
viewer->addLine<pcl::PointXYZ> (pt6, pt7, "line11");
viewer->addLine<pcl::PointXYZ> (pt7, pt8, "line12");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(10000));
}
system("pause");
return 0;
}