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