pcl曲面重建模块-贪婪三角形投影算法实例

贪婪三角形投影算法
在pcl-1.8测试

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char** argv)
{
    // 点云模型读入,此处读入为PCD格式点云文件.数据类型为PointXYZ.
    pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
    if (pcl::io::loadPCDFile(argv[1], *cloud) == -1)
    {
        PCL_ERROR("Couldn't read file mypointcloud.pcd\n");  //若读取失败将提示
        return -1;
    }
    std::cerr << "点云读入   完成" << std::endl;
    //sensor_msgs::PointCloud2 cloud_blob;
    //pcl::io::loadPCDFile ("bun0.pcd", cloud_blob);
    //pcl::fromROSMsg (cloud_blob, *cloud);
    //* the data should be available in cloud

    // Normal estimation(法向量估计)

    pcl::NormalEstimation n;//创建法向估计对象
    pcl::PointCloud::Ptr normals(new pcl::PointCloud);//创建法向数据指针
    pcl::search::KdTree::Ptr tree(new pcl::search::KdTree);//创建kdtree用于法向计算时近邻搜索
    tree->setInputCloud(cloud);//为kdtree输入点云
    n.setInputCloud(cloud);//为法向估计对象输入点云
    n.setSearchMethod(tree);//设置法向估计时采用的搜索方式为kdtree
    n.setKSearch(20);//设置法向估计时,k近邻搜索的点数
    n.compute(*normals);  //进行法向估计
    
    std::cerr << "法线计算   完成" << std::endl;

    // 创建同时包含点和法向的数据结构的指针
    pcl::PointCloud::Ptr cloud_with_normals(new pcl::PointCloud);
    //将已获得的点数据和法向数据拼接
    pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);


    // 创建另一个kdtree用于重建
    pcl::search::KdTree::Ptr tree2(new pcl::search::KdTree);
    //为kdtree输入点云数据,该点云数据类型为点和法向
    tree2->setInputCloud(cloud_with_normals);

    // 创建贪婪三角形投影重建对象
    pcl::GreedyProjectionTriangulation gp3;
    //创建多边形网格对象,用来存储重建结果
    pcl::PolygonMesh triangles; 

    //设置参数
    gp3.setSearchRadius(25);  // 设置连接点之间的最大距离(最大边长)用于确定k近邻的球半径(默认为0)
    gp3.setMu(2.5);  // 设置最近邻距离的乘子,已得到每个点的最终搜索半径(默认为0)
    gp3.setMaximumNearestNeighbors(100);  //设置搜索的最近邻点的最大数量
    gp3.setMaximumSurfaceAngle(M_PI / 2); // 45 degrees 最大平面角
    gp3.setMinimumAngle(M_PI / 18); // 10 degrees 每个三角的最大角度
    gp3.setMaximumAngle(2 * M_PI / 3); // 120 degrees
    gp3.setNormalConsistency(false);  //若法向量一致,设为true

    // 设置点云数据和搜索方式
    gp3.setInputCloud(cloud_with_normals);
    gp3.setSearchMethod(tree2);

    //开始重建
    gp3.reconstruct(triangles);

    std::cerr << "重建   完成" << std::endl;

    //将重建结果保存到硬盘文件中,重建结果以VTK格式存储
    pcl::io::saveVTKFile("mymesh.vtk", triangles); 

    // Additional vertex information
    std::vector parts = gp3.getPartIDs();
    std::vector states = gp3.getPointStates();
    fstream fs;
    fs.open("partsID.txt", ios::out);
    if (!fs)
    {
        return -2;
    }
    fs << "点云数量为:" << parts.size() << "\n";
    for (int i = 0; i < parts.size(); i++)
    {
        if (parts[i] != 0)
        {
            fs << parts[i] << "\n";   //这的fs对吗?
        }
    }

    std::cerr << "开始显示 ........" << std::endl;

    //图形显示模块
    //创建显示对象指针
    boost::shared_ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
    viewer->setBackgroundColor(0, 0, 0.6);  //设置窗口颜色
    viewer->addPolygonMesh(triangles, "my");  //设置所要显示的网格对象
    viewer->addCoordinateSystem(0.1);  //设置坐标系,参数为坐标显示尺寸
    viewer->initCameraParameters();
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }


    // Finish
    return 0;
}

转载于:https://www.cnblogs.com/bozhicheng/p/5799987.html

你可能感兴趣的:(pcl曲面重建模块-贪婪三角形投影算法实例)