PCL学习之点云可视化:坐标字段、随机、单一颜色、法向量

您所在的位置:网站首页 pcl点云显示线不显示面 PCL学习之点云可视化:坐标字段、随机、单一颜色、法向量

PCL学习之点云可视化:坐标字段、随机、单一颜色、法向量

2024-05-22 21:21| 来源: 网络整理| 查看: 265

pcl中几种常见的点云渲染方式

(1)颜色区别深度

此方法在PointCloudColorHandlerGenericField类中实现,该将不同的深度值显示为不同的颜色,实现以颜色区分深度的目的,PointCloudColorHandlerGenericField方法是将点云按深度值(“x”、“y”、"z"均可)的差异着以不同的颜色进行渲染。

#include #include #include #include #include using namespace std; int main(int argc, char* argv[]) { pcl::PointCloud::Ptr Cloud(new pcl::PointCloud); pcl::io::loadPCDFile("./biansu.pcd", *Cloud);//读入点云数据 pcl::visualization::PCLVisualizer viewer("display"); viewer.setBackgroundColor(0, 0, 0); pcl::visualization::PointCloudColorHandlerGenericField fildColor(Cloud, "z");//按照z字段进行渲染 viewer.addPointCloud(Cloud, fildColor, "sample");//显示点云,其中fildColor为颜色显示 viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample");//设置点云大小 while (!viewer.wasStopped()) { viewer.spinOnce(); } return 0; }

按x坐标中值显示

按z坐标中值显示

(2)显示点云颜色特征

该方法(PointCloudColorHandlerRGBField)要求点云类型包含RGB三个颜色分量,即该方法是直接显示点云中各个点的RGB属性字段信息,而不是通过对点云着色显示不同颜色。

#include #include #include #include #include #include using namespace std; using namespace pcl; using namespace io; int main() { PointCloud::Ptr cloud(new PointCloud); if (pcl::io::loadPCDFile("./biansu.pcd", *cloud) == -1) { cerr addPointCloud(cloud, "biansu cloud"); viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "biansu cloud"); // 设置点云大小 while (!viewer->wasStopped()) { viewer->spinOnce(100); boost::this_thread::sleep(boost::posix_time::microseconds(100000)); } return 0; }

显示结果如下:

(3)自定义点云颜色特征

该方法(PointCloudColorHandlerCustom)适用于任何格式点云,不要求点云类型包含RGB三个颜色分量,即将id为"sample cloud"的点云作为一个整体进行着色。

#include #include #include #include #include #include using namespace pcl; using namespace io; int main() { PointCloud::Ptr cloud(new PointCloud); if (pcl::io::loadPCDFile("./biansu.pcd", *cloud) == -1) { std::cerr addPointCloud(cloud, single_color, "sample cloud"); // viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0,1,1, "sample cloud"); //这也是一种设置颜色的方法,0,1,1是r,g,b除以255后的值 viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample");//设置点云大小

   while (!viewer->wasStopped()) { viewer->spinOnce(100); boost::this_thread::sleep(boost::posix_time::microseconds(100000)); } return 0; }

 (4)随机生成颜色

#include #include #include #include #include #include using namespace pcl; using namespace io; int main(int argc, char* argv[]) { pcl::PointCloud::Ptr Cloud(new pcl::PointCloud); pcl::io::loadPCDFile("./biansu.pcd", *Cloud); pcl::visualization::PCLVisualizer viewer("biansu"); viewer.setBackgroundColor(0, 0, 0); pcl::visualization::PointCloudColorHandlerRandom RandomColor(Cloud); viewer.addPointCloud(Cloud, RandomColor, "sample"); viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample"); while (!viewer.wasStopped()) { viewer.spinOnce(); } return 0; }

结果为:

(4)法向量的颜色表示

#include #include #include #include #include #include int main() { pcl::PointCloud::Ptr cloud(new pcl::PointCloud); pcl::io::loadPCDFile("./biansu.pcd", *cloud);//读入点云数据 // Normal estimation* pcl::NormalEstimation n; pcl::PointCloud::Ptr normals(new pcl::PointCloud); //建立kdtree来进行近邻点集搜索 pcl::search::KdTree::Ptr tree(new pcl::search::KdTree); //为kdtree添加点云数据 tree->setInputCloud(cloud); n.setInputCloud(cloud); n.setSearchMethod(tree); //点云法向计算时,需要搜索的近邻点大小 n.setKSearch(20); //开始进行法向计算 n.compute(*normals); //* normals should not contain the point normals + surface curvatures //显示类 pcl::visualization::PCLVisualizer viewer("Cloud Viewer"); //设置背景色 viewer.setBackgroundColor(0, 0, 0); //按照z值进行渲染点的颜色 pcl::visualization::PointCloudColorHandlerGenericField fildColor(cloud, "z"); //添加需要显示的点云数据 viewer.addPointCloud(cloud, fildColor, "sample cloud"); //设置点显示大小 viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud"); //添加需要显示的点云法向。cloud为原始点云模型,normal为法向信息,1表示需要显示法向的点云间隔,即每1个点显示一次法向,0.01表示法向长度。 viewer.addPointCloudNormals(cloud, normals, 1, 0.01, "normals"); while (!viewer.wasStopped()) { viewer.spinOnce(); } }

结果为:

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3