点云外包矩形框(六面体)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值