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(); } }
結果為: