PCL 泊松重建

一、概述

  PCL中的 pcl::Poisson<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/poisson.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(0.0, 0.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);
	// 泊松重建
	pcl::Poisson<pcl::PointXYZRGBNormal> ps;
	pcl::search::KdTree<pcl::PointXYZRGBNormal>::Ptr tree1(new pcl::search::KdTree<pcl::PointXYZRGBNormal>);
	tree1->setInputCloud(cloudNormals);
	ps.setSearchMethod(tree1);
	ps.setInputCloud(cloudNormals);
	ps.setDepth(6);             // 将用于表面重建的树的最大深度
	ps.setMinDepth(2);          // 将用于表面重建的树的最小深度
	ps.setScale(1.5);          // 用于重建的立方体的直径与样本的边界立方体直径的比值
	ps.setSolverDivide(3);      // 块高斯-塞德尔求解器用于求解拉普拉斯方程的深度。
	ps.setIsoDivide(6);         // 块等表面提取器用于提取等表面的深度
	ps.setSamplesPerNode(10);   // 每个八叉树节点上最少采样点数目
	ps.setConfidence(false);    // 置信标志,为true时,使用法线向量长度作为置信度信息,false则需要对法线进行归一化处理
	ps.setManifold(false);      // 流行标志,如果设置为true,则对多边形进行细分三角话时添加重心,设置false则不添加
	ps.setOutputPolygons(false);// 是否输出为多边形(而不是三角化行进立方体的结果)。

	pcl::PolygonMesh triangles;           // 存储最终三角化的网格模型
	ps.performReconstruction(triangles);
	
	pcl::io::savePLYFile("lamp.ply", triangles);
	// 输出可视化结果到渲染窗口
	PointCloudandMeshViewer(cloud, triangles);

	return (0);
}

三、结果

在这里插入图片描述

三维泊松表面重建是一种常用的点云数据处理方法,可以将离散的点云数据重建成连续的三维表面模型。PCL(Point Cloud Library)是一个开源的点云处理库,提供了许多实用的算法和工具函数,包括三维泊松表面重建算法。 在PCL中使用三维泊松表面重建算法,你可以按照以下步骤进行操作: 1. 使用PCL加载点云数据:首先,你需要使用PCL库中的函数将点云数据加载到程序中。可以使用`pcl::io::loadPCDFile()`函数加载`.pcd`格式的点云文件,或者使用其他合适的函数加载其他格式的点云数据。 2. 对点云进行预处理:在进行泊松表面重建之前,有时需要对点云进行预处理,例如去除离群点、滤波等。PCL提供了许多预处理的方法,可以根据具体情况选择合适的方法进行处理。 3. 执行三维泊松表面重建:使用`pcl::Poisson`类可以进行三维泊松表面重建。你需要创建一个`pcl::Poisson`对象,并将预处理后的点云数据传递给它。然后,调用`performReconstruction()`函数执行重建过程。 4. 获取重建的三维模型:重建完成后,你可以使用`pcl::PolygonMesh`对象来获取重建的三维模型。可以使用`pcl::toPCLPointCloud2()`函数将重建的模型转换为点云格式,或者直接保存为`.ply`等格式的文件。 需要注意的是,三维泊松表面重建是一个计算密集型的算法,对于大规模的点云数据可能需要较长的运行时间。此外,泊松表面重建的结果可能受到输入点云的质量和密度等因素的影响,需要根据具体情况进行调整和优化。 希望以上信息对你有帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值