#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/gp3.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <fstream>
void main()
{ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>) ;
if (pcl::io::loadPCDFile("bun000.pcd" , *cloud) == -)
{ PCL_ERROR("Could not read pcd file!\n") ;
return -1;
}
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>) ;
pcl::NormalEstimation<pcl::PointXYZ , pcl::Normal> n ;//法線估計對象
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>) ;//存儲估計的法線
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>) ;
tree->setInputCloud(cloud) ;
n.setInputCloud(cloud) ;
n.setSearchMethod(tree) ;
n.setKSearch() ;
n.compute(*normals) ;
pcl::concatenateFields(*cloud , *normals , *cloud_with_normals) ;
pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>) ;
tree2->setInputCloud(cloud_with_normals) ;
pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3 ;
pcl::PolygonMesh mesh ; //存儲最終三角化的網格模型
gp3.setSearchRadius(.) ;
gp3.setMu() ;//設定樣本點搜尋其鄰近點的最遠距離為
gp3.setMaximumNearestNeighbors() ;//設定樣本點搜尋的鄰域個數為
gp3.setMaximumSurfaceAngle(M_PI/) ;//設定某點法線方向偏離樣本點法線方向的最大角度為度
gp3.setMinimumAngle(M_PI/) ;//設定三角化後得到的三角形内角最小角度為度
gp3.setMaximumAngle(*M_PI/) ;
gp3.setNormalConsistency(false) ;//設定該參數保證法線朝向一緻
gp3.setInputCloud(cloud_with_normals) ;//設定輸入點雲為有向點雲
gp3.setSearchMethod(tree2) ;//設定搜素方式為tree2
gp3.reconstruct(mesh) ;//重建提取三角化
std::vector<int> parts = gp3.getPartIDs() ;
std::vector<int> status = gp3.getPointStates() ;
fstream fs ;
fs.open("partsID.txt" , ios::out);
if (!fs)
{ return ; }
fs<<"點雲數量為:"<<parts.size()<<"\n" ;
for (int i = ; i < parts.size() ; i++)
{ if (parts[i] != )
{ fs<<parts[i]<<"\n" ;
}
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D viewer")) ;
viewer->setBackgroundColor( , , ) ;
viewer->addPolygonMesh(mesh , "my") ;
viewer->initCameraParameters() ;
while (!viewer->wasStopped())
{
viewer->spinOnce() ;
boost::this_thread::sleep(boost::posix_time::microseconds()) ;
}
return 0;
}