pcl中几种常见的点云渲染方式
(1)颜色区别深度
此方法在PointCloudColorHandlerGenericField类中实现,该将不同的深度值显示为不同的颜色,实现以颜色区分深度的目的,PointCloudColorHandlerGenericField方法是将点云按深度值(“x”、“y”、"z"均可)的差异着以不同的颜色进行渲染。
例如:
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
pcl::PointCloud<pcl::PointXYZ>::Ptr Cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("./biansu.pcd", *Cloud);//读入点云数据
pcl::visualization::PCLVisualizer viewer("display");
viewer.setBackgroundColor(0, 0, 0);
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(Cloud, "z");//按照z字段进行渲染
viewer.addPointCloud<pcl::PointXYZ>(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 <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/io.h>
using namespace std;
using namespace pcl;
using namespace io;
int main() {
PointCloud<PointXYZRGB>::Ptr cloud(new PointCloud<PointXYZRGB>);
if (pcl::io::loadPCDFile("./biansu.pcd", *cloud) == -1) {
cerr << "can't read file biansu.pcd" << endl;
return -1;
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
viewer->addPointCloud<pcl::PointXYZRGB>(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 <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/io.h>
using namespace pcl;
using namespace io;
int main()
{
PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);
if (pcl::io::loadPCDFile("./biansu.pcd", *cloud) == -1) {
std::cerr << "can't read file biansu.pcd" << endl;
return -1;
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255,20,147); //DeepPink
viewer->addPointCloud<pcl::PointXYZ>(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 <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/io.h>
using namespace pcl;
using namespace io;
int main(int argc, char* argv[])
{
pcl::PointCloud<pcl::PointXYZ>::Ptr Cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("./biansu.pcd", *Cloud);
pcl::visualization::PCLVisualizer viewer("biansu");
viewer.setBackgroundColor(0, 0, 0);
pcl::visualization::PointCloudColorHandlerRandom<pcl::PointXYZ> RandomColor(Cloud);
viewer.addPointCloud<pcl::PointXYZ>(Cloud, RandomColor, "sample");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample");
while (!viewer.wasStopped())
{
viewer.spinOnce();
}
return 0;
}
结果为:
(4)法向量的颜色表示
#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::io::loadPCDFile("./biansu.pcd", *cloud);//读入点云数据
// Normal estimation*
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
//建立kdtree来进行近邻点集搜索
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
//为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<pcl::PointXYZ> fildColor(cloud, "z");
//添加需要显示的点云数据
viewer.addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud");
//设置点显示大小
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
//添加需要显示的点云法向。cloud为原始点云模型,normal为法向信息,1表示需要显示法向的点云间隔,即每1个点显示一次法向,0.01表示法向长度。
viewer.addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, normals, 1, 0.01, "normals");
while (!viewer.wasStopped())
{
viewer.spinOnce();
}
}
结果为: