贪婪投影三角化算法对有向点云进行三角化
2016-01-02 20:27
441 查看
贪婪投影法:先将有向点云投影到某一局部坐标平面内,再在坐标平面内进行平面内的三角化,根据平面内三位点的拓扑关系获得一个三角网格曲面模型。
#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) == -1) { PCL_ERROR("Could not read pcd file!\n") ; return ; } 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(20) ; 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(0.025) ; gp3.setMu(2.5) ;//设置样本点搜索其邻近点的最远距离为2.5 gp3.setMaximumNearestNeighbors(100) ;//设置样本点搜索的邻域个数为100 gp3.setMaximumSurfaceAngle(M_PI/4) ;//设置某点法线方向偏离样本点法线方向的最大角度为45度 gp3.setMinimumAngle(M_PI/180) ;//设置三角化后得到的三角形内角最小角度为10度 gp3.setMaximumAngle(2*M_PI/3) ; 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 = 0 ; i < parts.size() ; i++) { if (parts[i] != 0) { fs<<parts[i]<<"\n" ; } } boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D viewer")) ; viewer->setBackgroundColor(0 , 0 , 0) ; viewer->addPolygonMesh(mesh , "my") ; viewer->initCameraParameters() ; while (!viewer->wasStopped()) { viewer->spinOnce(100) ; boost::this_thread::sleep(boost::posix_time::microseconds(100000)) ; } return ; }
相关文章推荐
- zzulioj--1634--Happy Thanksgiving Day - A + B Problem(模拟水题)
- ubuntu安装zhcon遇到的问题
- 复习纲要 更正
- 检查网络状态—实时监测
- Dreamoon and Stairs
- 01.创建型————简单工厂模式
- opencv+QT学习(1) -- opencv+QT在win 7下的环境搭建
- 没事的时候进来瞧瞧
- 【AngularJS学习笔记】Java Script "use strict" 严格模式
- JSP标签
- Android带刻度的可选角度进度条
- 关于discuz中禾金投票系统循环出现引导页的问题
- oracle 打开trace,并分析trace
- C++ Primer Plus (第六版) 编程练习2.7
- [笔试题] 阿里巴巴2013技术类笔试题(完整版手工记录+具体解析)
- 数据库之自定义函数
- linux 命令 —— cd
- 在CentOS 6.6 64bit上编译安装LLVM3.7,Clang,Libc++和libc++abi
- 阿里云出现sudo get-apt install出现page404错误
- 在VirtualBox虚拟机中安装Linux 6.2 - 配置