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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐