目录
- 一、概述
- 二、代码
- 三、结果
一、概述
PCL中的 pcl::MarchingCubes<pcl::PointXYZRGBNormal>:
函数实现移动立方体重建的代码示例。
二、代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/surface/marching_cubes_HOPPE.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>// 可视化点云和mesh模型
void PointCloudandMeshViewer(pcl::PointCloud<pcl::PointXYZRGB>::Ptr& cloud, pcl::PolygonMesh& triangles)
{// 输出结果到可视化窗口boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D PointCloud Viewer"));// 设置视口1,显示原始点云int v1;viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1); // 左侧窗口viewer->setBackgroundColor(0.0, 0.0, 0.0, v1); // 黑色背景viewer->addText("Original PointCloud", 10, 10, "vp1_text", v1); // 标题pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> cloud_color_handler(cloud, 0, 255, 0); // 绿色viewer->addPointCloud(cloud, cloud_color_handler, "original_cloud", v1);// 设置视口2,显示重建点云int v2;viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2); // 右侧窗口viewer->setBackgroundColor(1.0, 1.0, 1.0, v2); // 白色背景viewer->addText("mesh", 10, 10, "vp2_text", v2);viewer->addPolygonMesh(triangles, "triangles", v2);viewer->setRepresentationToWireframeForAllActors(); // 网格模型以线框图模式显示// 添加坐标系/* viewer->addCoordinateSystem(0.1);viewer->initCameraParameters();*/// 可视化循环while (!viewer->wasStopped()){viewer->spinOnce(100);}}int main()
{// 读取点云数据pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);if (pcl::io::loadPCDFile("lamp.pcd", *cloud)){PCL_ERROR("Couldn't read the PCD files!\n");return -1;}// 计算法线pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> n;pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>);n.setInputCloud(cloud);n.setSearchMethod(tree);n.setKSearch(20); // k邻域搜索范围pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);n.compute(*normals);// 连接点坐标及法向量pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloudNormals(new pcl::PointCloud<pcl::PointXYZRGBNormal>); pcl::concatenateFields(*cloud, *normals, *cloudNormals);// HOPPE移动立方体重建pcl::MarchingCubes<pcl::PointXYZRGBNormal>::Ptr hp(new pcl::MarchingCubesHoppe<pcl::PointXYZRGBNormal>);pcl::search::KdTree<pcl::PointXYZRGBNormal>::Ptr tree1(new pcl::search::KdTree<pcl::PointXYZRGBNormal>);tree1->setInputCloud(cloudNormals);hp->setInputCloud(cloudNormals);hp->setIsoLevel(0.0f); // 等值面的iso_levelhp->setGridResolution(50, 50, 50); // 移动立方体网格分辨率hp->setPercentageExtendGrid(0.0f); // 定义在点云的边框和网格限制之间的网格内应该保留多少自由空间,不影响网格的分辨率,只是相应地改变体素大小。pcl::PolygonMesh triangles; // 存储最终三角化的网格模型hp->reconstruct(triangles);pcl::io::savePLYFile("lamp.ply", triangles);// 输出可视化结果到渲染窗口PointCloudandMeshViewer(cloud, triangles);return (0);
}