PCL实现泊松表面重建

PCL实现泊松表⾯重建
简介:
泊松表⾯重建是⼀种隐函数的重构⽅法。通过定义模型内部的值⼤于零, 模型外部它的值⼩于零, 然后提取值为零的等值⾯, 直接地重构逼近表⾯。
双挂调法泊松表⾯重建的算法融合了全局和局部⽅法的优点,采取隐性拟合的⽅式,通过求解泊松⽅程来取得点云模型所描述的表⾯信息代表的隐性⽅程,通过对该⽅程进⾏等值⾯提取,从⽽得到具有⼏何实体信息的表⾯模型。优点在于,重建出的模型具有⽔密性的封闭特征,具有良好的⼏何表⾯特性和细节特性。
/** Filename: Poisson_reconstruction
** Date: 2018-3-29
**Description:
**/
#include "stdafx.h"
#include <iostream>
#include <string>
#include <pcl\io\pcd_io.h>
#include <pcl\io\ply_io.h>
#include <pcl\point_types.h>
#include <pcl\kdtree\kdtree_flann.h>
#include <pcl\features\normal_3d.h>
#include <pcl\features\normal_3d_omp.h>
#include <pcl\surface\poisson.h>
#include <pcl\surface\gp3.h>
#include <pcl\visualization\cloud_viewer.h>
#include <pcl\visualization\pcl_visualizer.h>
//多线程
物流订单管理系统
#include <boost\thread\thread.hpp>
#include <vector>
using namespace std;
废矿物油
struct Node
{
float x;
float y;
float z;
float i;
float j;
float k;
};
int _tmain(int argc, _TCHAR* argv[])
{
pcl::PointCloud<pcl::PointXYZ> ::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
ifstream in0;
in0.open("FanBlade.asc",ios::in);取暖袋
if(!in0.is_open())
{
cout<<"error open!"<<endl;
system("pause");
return -1;
}
}
vector<Node> points;
points.clear();
Node tmp;
while(in0>>tmp.x>>tmp.y>>tmp.z>>tmp.i>>tmp.j>>tmp.k)
points.push_back(tmp);
pcl::PointXYZ cltmp;
for(size_t i = 0 ;i<points.size();++i)
{
cltmp.x = points[i].x;
cltmp.y = points[i].y;
cltmp.z = points[i].z;
cloud->points.push_back(cltmp);
}
//pcl::io::loadPCDFile("rabbit.pcd ",*cloud);大田西瓜种植技术
cout << cloud->points.size() << endl;
// 计算法向量
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);
//将点云和法线放到⼀起
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) ;
//创建Poisson对象,并设置参数
pcl::Poisson<pcl::PointNormal> pn ;
pn.setConfidence(false); //是否使⽤法向量的⼤⼩作为置信信息。如果false,所有法向量均归⼀化。
pn.setDegree(2); //设置参数degree[1,5],值越⼤越精细,耗时越久。
pn.setDepth(8); //树的最⼤深度,求解2^d x 2^d x 2^d⽴⽅体元。由于⼋叉树⾃适应采样密度,指定值仅为最⼤深度。
pn.setIsoDivide(8); //⽤于提取ISO等值⾯的算法的深度
pn.setManifold(false); //是否添加多边形的重⼼,当多边形三⾓化时。设置流⾏标志,如果设置为true,则对多边形进⾏细分三⾓话时添加重⼼,设置false则不添加
pn.setOutputPolygons(false); //是否输出多边形⽹格(⽽不是三⾓化移动⽴⽅体的结果)
pn.setSamplesPerNode(9); //设置落⼊⼀个⼋叉树结点中的样本点的最⼩数量。⽆噪声,[1.0-5.0],
有噪声[15.-20.]平滑
pn.setScale(1.25); //设置⽤于重构的⽴⽅体直径和样本边界⽴⽅体直径的⽐率。
pn.setSolverDivide(8); //设置求解线性⽅程组的Gauss-Seidel迭代⽅法的深度
//设置搜索⽅法和输⼊点云
pn.setSearchMethod(tree2);
pn.setInputCloud(cloud_with_normals);
传输带//创建多变形⽹格,⽤于存储结果
pcl::PolygonMesh mesh ;
//执⾏重构
pn.performReconstruction(mesh);
//保存⽹格图
pcl::io::savePLYFile("FanBlade.ply", mesh);
// 显⽰结果图
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D viewer")) ;
viewer->setBackgroundColor(0.5, 0.5 ,1) ;
viewer->addPolygonMesh(mesh , "Blade") ;
viewer->addCoordinateSystem (50.0);
viewer->initCameraParameters();
viewer->initCameraParameters();
while (!viewer->wasStopped()){
viewer->spinOnce(100) ;
boost::this_thread::sleep(boost::posix_time::microseconds(100000)) ; }
system("pause");
return 0;
}

本文发布于:2024-09-22 04:36:57,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/102767.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:设置   模型   法线   具有   对象
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议