pcl点云三维重建面片赋予彩色

本文介绍了如何使用PCL库对点云进行三角化处理,并将三角化后的面片赋予颜色。首先,通过贪婪投影三角化算法得到点云的三维重建曲面,然后将曲面转换为XYZRGB点云格式,接着通过循环赋值将点云的XYZ坐标复制到新的点云对象中,并设定RGB颜色,最后利用PCLVisualizer展示彩色的三角化点云。
摘要由CSDN通过智能技术生成

1.对三角化后的点云赋予颜色

在对点云进行三维重建时,使用贪婪三角化得到将点云重建后的曲面,但曲面一般默认是白色的网格,视觉效果很不好,如下图。
在这里插入图片描述
将点云三角化后的面片设置为彩色的步骤为,首先初始化xyzrgb点云cloud2,将三维重建的面片triangles的点云与xyzrgb的cloud2结合,通过for语句将之前对三角化的点云cloud的xyz坐标值赋给新创建的cloud2,通过for语句来赋予cloud2的rgb颜色云。效果如图。

	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud2;					//
	cloud2.reset(new pcl::PointCloud<pcl::PointXYZRGB>);
	pcl::fromPCLPointCloud2(triangles.cloud, *cloud2);
	for (int i = 0; i < cloud->size(); i++)//设置显示颜色 26 26
	{
		cloud2->points[i].x = cloud->points[i].x;
		cloud2->points[i].y = cloud->points[i].y;
		cloud2->points[i].z = cloud->points[i].z;
	}
	for (int i = 0; i < cloud->size(); i++)//设置显示颜色 	0 139 69
	{
		cloud2->points[i].r = 0;
		cloud2->points[i].g = 139;
		cloud2->points[i].b = 0;

	}

在这里插入图片描述

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/gp3.h>      //贪婪投影三角化算法
#include <pcl/visualization/pcl_visualizer.h>
int main() {
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
	pcl::PCLPointCloud2 cloud_doub;
	pcl::io::loadPCDFile("plant.pcd", cloud_doub);
	pcl::fromPCLPointCloud2(cloud_doub, *cloud);
	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::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
	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 triangles;
	gp3.setSearchRadius(10);
	gp3.setMu(5);
	gp3.setMaximumNearestNeighbors(20);
	gp3.setMaximumSurfaceAngle(M_PI / 4);
	gp3.setMinimumAngle(M_PI / 18);
	gp3.setMaximumAngle(2 * M_PI / 3);
	gp3.setNormalConsistency(false);

	gp3.setInputCloud(cloud_with_normals);
	gp3.setSearchMethod(tree2);
	gp3.reconstruct(triangles);

	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud2;					//
	cloud2.reset(new pcl::PointCloud<pcl::PointXYZRGB>);
	pcl::fromPCLPointCloud2(triangles.cloud, *cloud2);
	for (int i = 0; i < cloud->size(); i++)//设置显示颜色 26 26
	{
		cloud2->points[i].x = cloud->points[i].x;
		cloud2->points[i].y = cloud->points[i].y;
		cloud2->points[i].z = cloud->points[i].z;
	}
	for (int i = 0; i < cloud->size(); i++)//设置显示颜色 	0 139 69
	{
		cloud2->points[i].r = 0;
		cloud2->points[i].g = 139;
		cloud2->points[i].b = 0;

	}
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));

	viewer->setBackgroundColor(255, 250, 250);
	viewer->addPolygonMesh<pcl::PointXYZRGB>(cloud2, triangles.polygons, "mesh1"); //显示面*****树1
	viewer->spin();
	return 0;
}


源代码及pcd文件下载地址:https://download.csdn.net/download/bigorange1/85575822

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值