• pcl 点云网络 化 vtk Delaunay 点云网络化


    网格主要用于计算机图形学中,有三角、四角网格等很多种。
    计算机图形学中的网格处理绝大部分都是基于三角网格的,三角网格在图形学和三维建模中使用的非常广泛,用来模拟复杂物体的表面,如建筑、车辆、动物等,你看下图中的兔子、球等模型都是基于三角网格的

    三角形表示网格也叫三角剖分。它有如下几个优点:

        三角网格稳定性强。

        三角网格比较简单(主要原因),实际上三角网格是最简单的网格类型之一,可以非常方便并且快速生成,在非结构化网格中最常见。而且相对于一般多边形网格,许多操作对三角网格更容易。
     

    目前点云进行网格生成一般分为两大类方法:

    • 插值法。顾名思义,也就是重建的曲面都是通过原始的数据点得到的

    • 逼近法。用分片线性曲面或其他曲面来逼近原始数据点,得到的重建曲面是原始点集的一个逼近。

    点云贪心三角化

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. #include
    16. #include
    17. #include
    18. #include
    19. #include
    20. #include
    21. #include
    22. #include
    23. #include
    24. #include
    25. #include
    26. #include
    27. #include
    28. #include
    29. #include
    30. #include
    31. #include
    32. #include
    33. #include
    34. #include
    35. #include
    36. #include
    37. #include
    38. #include
    39. #include
    40. #include
    41. #include
    42. #include
    43. #include
    44. using namespace std;
    45. //#define FILE_PATH "xiaomianpian.XYZN"
    46. //#define FILE_PATH "2DpointDatas.txt"
    47. #include
    48. #include
    49. #include
    50. #include
    51. #include
    52. #include
    53. #include
    54. #include
    55. #include
    56. #include
    57. using namespace std;
    58. #define FILE_PATH "sxiaomianpian.XYZN"
    59. /
    60. ---------------读取txt文件-------------------
    61. void CreateCloudFromTxt(const std::string& file_path, pcl::PointCloud::Ptr cloud, pcl::PointCloud::Ptr normals)
    62. {
    63. std::ifstream file(file_path.c_str());//c_str():生成一个const char*指针,指向以空字符终止的数组。
    64. std::string line;
    65. pcl::PointXYZ point;
    66. pcl::Normal nPoint;
    67. int index = 0;
    68. while (getline(file, line)) {
    69. std::stringstream ss(line);
    70. ss >> point.x;
    71. ss >> point.y;
    72. ss >> point.z;
    73. ss >> nPoint.normal_x;
    74. ss >> nPoint.normal_y;
    75. ss >> nPoint.normal_z;
    76. cloud->push_back(point);
    77. normals->push_back(nPoint);
    78. //printf("%f,%f,%f\n", point.x, point.y, point.z);
    79. }
    80. file.close();
    81. printf("size %ld\n", cloud->size());
    82. }
    1. int main(int argc, char** argv)
    2. {
    3. pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
    4. //pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
    5. //pcl::io::loadPCDFile(FILE_PATH, *cloud);
    6. pcl::PointCloud::Ptr normals(new pcl::PointCloud); //存储估计的法线
    7. CreateCloudFromTxt(FILE_PATH, cloud, normals);
    8. //CreateCloudFromTxt(FILE_PATH, cloud);
    9. // printf("size %d\n", cloud->size());
    10. //pcl::visualization::PCLVisualizer viewer("viewer");
    11. //viewer.addPointCloud(cloud);
    12. //viewer.spin();
    13. // Normal estimation*
    14. //pcl::NormalEstimation n; //法线估计对象
    15. //pcl::PointCloud::Ptr normals(new pcl::PointCloud); //存储估计的法线
    16. //pcl::search::KdTree::Ptr tree(new pcl::search::KdTree); //定义kd树指针
    17. //tree->setInputCloud(cloud); ///用cloud构建tree对象
    18. //n.setInputCloud(cloud);
    19. //n.setSearchMethod(tree);
    20. //n.setKSearch(20);
    21. //n.compute(*normals); 估计法线存储到其中
    22. //* normals should not contain the point normals + surface curvatures
    23. printf("normals=========\n");
    24. // Concatenate the XYZ and normal fields*
    25. pcl::PointCloud::Ptr cloud_with_normals(new pcl::PointCloud);
    26. pcl::concatenateFields(*cloud, *normals, *cloud_with_normals); //连接字段
    27. //* cloud_with_normals = cloud + normals
    28. printf("111normals=========\n");
    29. //定义搜索树对象
    30. pcl::search::KdTree::Ptr tree2(new pcl::search::KdTree);
    31. tree2->setInputCloud(cloud_with_normals); //点云构建搜索树
    32. printf("22 normals=========\n");
    33. // Initialize objects
    34. pcl::GreedyProjectionTriangulation gp3; //定义三角化对象
    35. pcl::PolygonMesh triangles; //存储最终三角化的网络模型
    36. 附加顶点信息
    37. //std::vector parts = gp3.getPartIDs();
    38. //std::vector states = gp3.getPointStates();
    39. std::cout << "Triangling..." << std::endl;
    40. gp3.setSearchRadius(10);//设置连接点之间的最大距离(即为三角形最大边长)为0.025
    41. std::cout << "1" << std::endl;
    42. gp3.setMu(1);//设置被样本点搜索其邻近点的最远距离为2.5,为了适应点云密度的变化
    43. std::cout << "2" << std::endl;
    44. gp3.setMaximumNearestNeighbors(100);//设置样本点可搜索的邻域个数
    45. std::cout << "3" << std::endl;
    46. gp3.setMaximumSurfaceAngle(M_PI / 12);//45,180/4,设置某点法线方向偏离样本点法线方向的最大角度为45度
    47. std::cout << "4" << std::endl;
    48. gp3.setMinimumAngle(M_PI / 18);//10,180/18,设置三角化后得到三角形内角最小角度为10度
    49. std::cout << "5" << std::endl;
    50. gp3.setMaximumAngle(2 * M_PI / 12);//120,2*180/3,设置三角化后得到三角形内角最大角度为120度
    51. std::cout << "6" << std::endl;
    52. gp3.setNormalConsistency(true); //设置该参数保证法线朝向一致
    53. std::cout << "7" << std::endl;
    54. gp3.setInputCloud(cloud_with_normals);
    55. std::cout << "8" << std::endl;
    56. gp3.setSearchMethod(tree2);//设置搜索方式tree2
    57. std::cout << "Triangling..." << std::endl;
    58. gp3.reconstruct(triangles);//重建提取三角化
    59. std::cout << "Finshed..." << std::endl;
    60. pcl::io::saveVTKFile("wenwu_result.vtk", triangles);
    61. //std::cout << "Done..." << std::endl;
    62. std::cout << "Saved..." << std::endl;
    63. pcl::io::savePolygonFile("wenwu_result.stl", triangles);
    64. //std::vector parts = gp3.getPartIDs();//附加定点信息
    65. //std::vector states = gp3.getPointStates();
    66. boost::shared_ptr viewer(new pcl::visualization::PCLVisualizer("可视化"));//三维可视化窗口
    67. viewer->setBackgroundColor(0, 0, 0);
    68. viewer->addPolygonMesh(triangles, "my");
    69. viewer->addCoordinateSystem(50.0);
    70. viewer->initCameraParameters();
    71. while (!viewer->wasStopped()) {
    72. viewer->spinOnce(100);
    73. boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    74. }
    75. std::cout << "Done..." << std::endl;
    76. //pcl::io::saveVTKFile("mianpian.vtk", triangles);
    77. //pcl::io::loadPolygonFile(const std::string &file_name, pcl::PolygonMesh& mesh);
    78. printf("saveVTKFile=========\n");
    79. system("pause");
    80. return 0;
    81. }

    Delaunay

    1. void saveSTL(vtkPolyData* StlPolyData)
    2. {
    3. vtkNew stlWriter;
    4. stlWriter->SetFileName("./db-out.stl");
    5. stlWriter->SetInputData((vtkDataObject *)StlPolyData );
    6. stlWriter->Update();
    7. stlWriter->Write();
    8. }
    9. int main()
    10. {
    11. //vtkSmartPointer vertices = vtkSmartPointer::New(); //_存放细胞顶点,用于渲染(显示点云所必须的)
    12. vtkSmartPointer polyData = vtkSmartPointer::New();
    13. //vtkSmartPointer pointMapper = vtkSmartPointer::New();
    14. //vtkSmartPointer pointActor = vtkSmartPointer::New();
    15. //vtkSmartPointer ren1 = vtkSmartPointer< vtkRenderer>::New();
    16. //vtkSmartPointer renWin = vtkSmartPointer::New();
    17. //vtkSmartPointer iren = vtkSmartPointer::New();
    18. //vtkSmartPointer istyle = vtkSmartPointer::New();
    19. vtkSmartPointer m_Points = vtkSmartPointer::New();
    20. //_读进点云数据信息
    21. ifstream infile(FILE_PATH, ios::in);
    22. double x, y, z;
    23. char line[128];
    24. int i = 0;
    25. while (infile.getline(line, sizeof(line)))
    26. {
    27. stringstream ss(line);
    28. ss >> x;
    29. ss >> y;
    30. ss >> z;
    31. m_Points->InsertPoint(i, x, y, z); //_加入点信息
    32. ///vertices->InsertNextCell(1); //_加入细胞顶点信息----用于渲染点集
    33. //vertices->InsertCellPoint(i);
    34. i++;
    35. }
    36. infile.close();
    37. //_创建待显示数据源
    38. polyData->SetPoints(m_Points); //_设置点集
    39. // Triangulate the grid points
    40. vtkSmartPointer delaunay =
    41. vtkSmartPointer::New();
    42. delaunay->SetInputData(polyData);
    43. delaunay->SetAlpha(10);
    44. //delaunay->SetTolerance(0.1);
    45. delaunay->Update();
    46. saveSTL(delaunay->GetOutput());
    47. // Visualize
    48. vtkSmartPointer colors =
    49. vtkSmartPointer::New();
    50. vtkSmartPointer meshMapper =
    51. vtkSmartPointer::New();
    52. meshMapper->SetInputConnection(delaunay->GetOutputPort());
    53. vtkSmartPointer meshActor =
    54. vtkSmartPointer::New();
    55. meshActor->SetMapper(meshMapper);
    56. //meshActor->GetProperty()->SetColor(colors->GetColor3d("Banana").GetData());
    57. meshActor->GetProperty()->EdgeVisibilityOn();
    58. vtkSmartPointer glyphFilter =
    59. vtkSmartPointer::New();
    60. glyphFilter->SetInputData(polyData);
    61. vtkSmartPointer pointMapper =
    62. vtkSmartPointer::New();
    63. pointMapper->SetInputConnection(glyphFilter->GetOutputPort());
    64. vtkSmartPointer pointActor =
    65. vtkSmartPointer::New();
    66. //pointActor->GetProperty()->SetColor(colors->GetColor3d("Tomato").GetData());
    67. pointActor->GetProperty()->SetPointSize(5);
    68. pointActor->SetMapper(pointMapper);
    69. vtkSmartPointer renderer =
    70. vtkSmartPointer::New();
    71. vtkSmartPointer renderWindow =
    72. vtkSmartPointer::New();
    73. renderWindow->AddRenderer(renderer);
    74. vtkSmartPointer renderWindowInteractor =
    75. vtkSmartPointer::New();
    76. renderWindowInteractor->SetRenderWindow(renderWindow);
    77. renderer->AddActor(meshActor);
    78. renderer->AddActor(pointActor);
    79. //renderer->SetBackground(colors->GetColor3d("Mint").GetData());
    80. renderWindow->Render();
    81. renderWindowInteractor->Start();
    82. }

  • 相关阅读:
    c++访问修饰符与继承关系
    农产品直销平台/农场品销售系统
    【C++】C / C++ 内存管理
    WPF —— Calendar日历控件详解
    Linux+qt:创建动态库so,以及如何使用(详细步骤)
    【知识网络分析】 一模网络(one node)
    Ubuntu 20.04 LTS配置JDK、Git
    自旋锁和读写锁
    长连接的原理
    软件架构生态化-多角色交付的探索实践
  • 原文地址:https://blog.csdn.net/q610098308/article/details/126167603