PCL经典例程
1、用到的頭文件:
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkInteractionStyle) VTK_MODULE_INIT(vtkRenderingFreeType)#include <iostream> #include <boost/thread/thread.hpp> #include <pcl/common/common_headers.h> #include <pcl/common/common_headers.h> #include <pcl/features/normal_3d.h> #include <pcl/io/pcd_io.h> //讀取PCD文件 #include <pcl/io/vtk_lib_io.h> //讀取Ploy文件 #include <pcl/visualization/pcl_visualizer.h> #include <pcl/console/parse.h>2、基本的點云可視化操作
boost::shared_ptr<pcl::visualization::PCLVisualizer> simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud) {// -----Open 3D viewer and add point cloud//創建視窗對象并給標題欄設置一個名稱“3D Viewer”并將它設置為boost::shared_ptr智能共享指針,這樣可以保證指針在程序中全局使用,而不引起內存錯誤boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));//設置視窗的背景色,可以任意設置RGB的顏色,這里是設置為黑色viewer->setBackgroundColor(0, 0, 0);/*這是最重要的一行,我們將點云添加到視窗對象中,并定一個唯一的字符串作為ID 號,利用此字符串保證在其他成員中也能標志引用該點云,多次調用addPointCloud可以實現多個點云的添加,每調用一次就會創建一個新的ID號,如果想更新一個已經顯示的點云,必須先調用removePointCloud(),并提供需要更新的點云ID 號*/viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");//用于改變顯示點云的尺寸,可以利用該方法控制點云在視窗中的顯示方法,viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");//查看復雜的點云,經常讓人感到沒有方向感,為了保持正確的坐標判斷,需要顯示坐標系統方向,可以通過使用X(紅色)//Y(綠色 )Z (藍色)圓柱體代表坐標軸的顯示方式來解決,圓柱體的大小可以通過scale參數來控制,本例中scale設置為1.0viewer->addCoordinateSystem(1.0);//通過設置照相機參數使得從默認的角度和方向觀察點云viewer->initCameraParameters();return (viewer); }3、可視化彩色點云的顏色特征?
boost::shared_ptr<pcl::visualization::PCLVisualizer> rgbVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud) {boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer); }4、自定義點云的顏色特征(自定義點云顏色)
boost::shared_ptr<pcl::visualization::PCLVisualizer> customColourVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud) {boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);//創建一個自定義的顏色處理器PointCloudColorHandlerCustom對象,并設置顏色為純綠色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);//addPointCloud<>()完成對顏色處理器對象的傳遞viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer); }5、可視化點云法線
//顯示法線是理解點云的一個重要步驟,點云法線特征是非常重要的基礎特征,PCL visualizer可視化類可用于繪制法線, //也可以繪制表征點云的其他特征,比如主曲率和幾何特征,normalsVis函數中演示了如何實現點云的法線 boost::shared_ptr<pcl::visualization::PCLVisualizer> normalsVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals) {boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");//實現對點云法線的顯示viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals, 10, 0.05, "normals");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer); }?6、繪制普通形狀
//PCL visualizer可視化類允許用戶在視窗中繪制一般圖元,這個類常用于顯示點云處理算法的可視化結果,例如 通過可視化球體 //包圍聚類得到的點云集以顯示聚類結果,shapesVis函數用于實現添加形狀到視窗中,添加了四種形狀:從點云中的一個點到最后一個點 //之間的連線,原點所在的平面,以點云中第一個點為中心的球體,沿Y軸的椎體 boost::shared_ptr<pcl::visualization::PCLVisualizer> shapesVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud) {boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();/************************************************************************************************繪制形狀的實例代碼,繪制點之間的連線,*************************************************************************************************/viewer->addLine<pcl::PointXYZRGB>(cloud->points[0],cloud->points[cloud->size() - 1], "line");//添加點云中第一個點為中心,半徑為0.2的球體,同時可以自定義顏色viewer->addSphere(cloud->points[0], 0.2, 0.5, 0.5, 0.0, "sphere");//---------------------------------------//-----Add shapes at other locations添加繪制平面使用標準平面方程ax+by+cz+d=0來定義平面,這個平面以原點為中心,方向沿著Z方向-----//---------------------------------------pcl::ModelCoefficients coeffs;coeffs.values.push_back(0.0);coeffs.values.push_back(0.0);coeffs.values.push_back(1.0);coeffs.values.push_back(0.0);viewer->addPlane(coeffs, "plane");//添加錐形的參數coeffs.values.clear();coeffs.values.push_back(0.3);coeffs.values.push_back(0.3);coeffs.values.push_back(0.0);coeffs.values.push_back(0.0);coeffs.values.push_back(1.0);coeffs.values.push_back(0.0);coeffs.values.push_back(5.0);viewer->addCone(coeffs, "cone");return (viewer); }7、多窗口顯示多個點云
//viewportsVis函數演示如何用多視角來顯示點云計算法線的方法結果對比 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewportsVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2) {boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->initCameraParameters();//以上是創建視圖的標準代碼int v1(0); //創建新的視口viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1); //4個參數分別是X軸的最小值,最大值,Y軸的最小值,最大值,取值0-1,v1是標識viewer->setBackgroundColor(0, 0, 0, v1); //設置視口的背景顏色viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1); //添加一個標簽區別其他窗口 利用RGB顏色著色器并添加點云到視口中pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud1", v1);//對第二視口做同樣的操作,使得做創建的點云分布于右半窗口,將該視口背景賦值于灰色,以便明顯區別,雖然添加同樣的點云,給點云自定義顏色著色int v2(0);viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);viewer->setBackgroundColor(0.3, 0.3, 0.3, v2);viewer->addText("Radius: 0.1", 10, 10, "v2 text", v2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, single_color, "sample cloud2", v2);//為所有視口設置屬性,viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");viewer->addCoordinateSystem(1.0);//添加法線 每個視圖都有一組對應的法線viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals1, 10, 0.05, "normals1", v1);viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals2, 10, 0.05, "normals2", v2);return (viewer); }8、鼠標事件
//每次響應這種事件都會在鼠標按下的位置上生成一個文本標簽 unsigned int text_id = 0; void keyboardEventOccurred(const pcl::visualization::KeyboardEvent &event,void* viewer_void) {pcl::visualization::PCLVisualizer *viewer = static_cast<pcl::visualization::PCLVisualizer *> (viewer_void);if (event.getKeySym() == "r" && event.keyDown()){std::cout << "r was pressed => removing all text" << std::endl;char str[512];for (unsigned int i = 0; i < text_id; ++i){sprintf(str, "text#%03d", i);viewer->removeShape(str);}text_id = 0;} }9、鍵盤事件
//所以在PCL中視窗中注冊事件響應回調函數,不會覆蓋其他成員對同一事件的響應 void mouseEventOccurred (const pcl::visualization::MouseEvent &event,void* viewer_void) {pcl::visualization::PCLVisualizer *viewer = static_cast<pcl::visualization::PCLVisualizer *> (viewer_void);if (event.getButton () == pcl::visualization::MouseEvent::LeftButton &&event.getType () == pcl::visualization::MouseEvent::MouseButtonRelease){std::cout << "Left mouse button released at position (" << event.getX () << ", " << event.getY () << ")" << std::endl;char str[512];sprintf (str, "text#%03d", text_id ++);viewer->addText ("clicked here", event.getX (), event.getY (), str);} }10、自定義交互
//多數情況下,默認的鼠標和鍵盤交互設置不能滿足用戶的需求,用戶想擴展函數的某一些功能,比如按下鍵盤時保存點云的信息,或者通過鼠標確定點云的位置,interactionCustomizationVis 函數進行演示如何捕捉鼠標和鍵盤事件,在窗口點擊,將會顯示一個2D的文本標簽,按下r健出去文本boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis () {boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));viewer->setBackgroundColor (0, 0, 0);//以上是實例化視窗的標準代碼viewer->addCoordinateSystem (1.0);//分別注冊響應鍵盤和鼠標事件,keyboardEventOccurred mouseEventOccurred回調函數,需要將boost::shared_ptr強制轉換為void*viewer->registerKeyboardCallback (keyboardEventOccurred, (void*)viewer.get ());viewer->registerMouseCallback (mouseEventOccurred, (void*)viewer.get ());return (viewer); }?完整代碼
#include <iostream> #include <boost/thread/thread.hpp> #include <pcl/common/common_headers.h> #include <pcl/common/common_headers.h> #include <pcl/features/normal_3d.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/pcl_visualizer.h> #include <pcl/console/parse.h> // 幫助 void printUsage(const char* progName) {std::cout << "\n\nUsage: " << progName << " [options]\n\n"<< "Options:\n"<< "-------------------------------------------\n"<< "-h this help\n"<< "-s Simple visualisation example\n"<< "-r RGB colour visualisation example\n"<< "-c Custom colour visualisation example\n"<< "-n Normals visualisation example\n"<< "-a Shapes visualisation example\n"<< "-v Viewports example\n"<< "-i Interaction Customization example\n"<< "\n\n"; }//Simple visualisation example boost::shared_ptr<pcl::visualization::PCLVisualizer> simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud) {//創建3D窗口并添加點云 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer); }//RGB colour visualisation example boost::shared_ptr<pcl::visualization::PCLVisualizer> rgbVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud) {//創建3D窗口并添加點云 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer); }//Custom colour visualisation example boost::shared_ptr<pcl::visualization::PCLVisualizer> customColourVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud) {//創建3D窗口并添加點云 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer); }//Normals visualisation example boost::shared_ptr<pcl::visualization::PCLVisualizer> normalsVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals) {//創建3D窗口并添加點云其包括法線 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals, 10, 0.05, "normals");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer); }//Shapes visualisation example boost::shared_ptr<pcl::visualization::PCLVisualizer> shapesVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud) {//創建3D窗口并添加點云 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();//在點云上添加直線和球體模型 viewer->addLine<pcl::PointXYZRGB>(cloud->points[0],cloud->points[cloud->size() - 1], "line");viewer->addSphere(cloud->points[0], 0.2, 0.5, 0.5, 0.0, "sphere");//在其他位置添加基于模型參數的平面及圓錐體 pcl::ModelCoefficients coeffs;coeffs.values.push_back(0.0);coeffs.values.push_back(0.0);coeffs.values.push_back(1.0);coeffs.values.push_back(0.0);viewer->addPlane(coeffs, "plane");coeffs.values.clear();coeffs.values.push_back(0.3);coeffs.values.push_back(0.3);coeffs.values.push_back(0.0);coeffs.values.push_back(0.0);coeffs.values.push_back(1.0);coeffs.values.push_back(0.0);coeffs.values.push_back(5.0);viewer->addCone(coeffs, "cone");return (viewer); }//Viewports example boost::shared_ptr<pcl::visualization::PCLVisualizer> viewportsVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2) {// 創建3D窗口并添加顯示點云其包括法線 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->initCameraParameters();int v1(0);viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);viewer->setBackgroundColor(0, 0, 0, v1);viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud1", v1);int v2(0);viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);viewer->setBackgroundColor(0.3, 0.3, 0.3, v2);viewer->addText("Radius: 0.1", 10, 10, "v2 text", v2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, single_color, "sample cloud2", v2);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");viewer->addCoordinateSystem(1.0);viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals1, 10, 0.05, "normals1", v1);viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals2, 10, 0.05, "normals2", v2);return (viewer); }unsigned int text_id = 0; void keyboardEventOccurred(const pcl::visualization::KeyboardEvent &event,void* viewer_void) {boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);if (event.getKeySym() == "r" && event.keyDown()){std::cout << "r was pressed => removing all text" << std::endl;char str[512];for (unsigned int i = 0; i < text_id; ++i){sprintf(str, "text#%03d", i);viewer->removeShape(str);}text_id = 0;} }void mouseEventOccurred(const pcl::visualization::MouseEvent &event,void* viewer_void) {boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);if (event.getButton() == pcl::visualization::MouseEvent::LeftButton &&event.getType() == pcl::visualization::MouseEvent::MouseButtonRelease){std::cout << "Left mouse button released at position (" << event.getX() << ", " << event.getY() << ")" << std::endl;char str[512];sprintf(str, "text#%03d", text_id++);viewer->addText("clicked here", event.getX(), event.getY(), str);} }//Interaction Customization example boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis() {boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);viewer->addCoordinateSystem(1.0);viewer->registerKeyboardCallback(keyboardEventOccurred, (void*)&viewer);viewer->registerMouseCallback(mouseEventOccurred, (void*)&viewer);return (viewer); } // -----Main----- int main(int argc, char** argv) {// 解析命令行參數 if (pcl::console::find_argument(argc, argv, "-h") >= 0){printUsage(argv[0]);return 0;}bool simple(false), rgb(false), custom_c(false), normals(false),shapes(false), viewports(false), interaction_customization(false);if (pcl::console::find_argument(argc, argv, "-s") >= 0){simple = true;std::cout << "Simple visualisation example\n";}else if (pcl::console::find_argument(argc, argv, "-c") >= 0){custom_c = true;std::cout << "Custom colour visualisation example\n";}else if (pcl::console::find_argument(argc, argv, "-r") >= 0){rgb = true;std::cout << "RGB colour visualisation example\n";}else if (pcl::console::find_argument(argc, argv, "-n") >= 0){normals = true;std::cout << "Normals visualisation example\n";}else if (pcl::console::find_argument(argc, argv, "-a") >= 0){shapes = true;std::cout << "Shapes visualisation example\n";}else if (pcl::console::find_argument(argc, argv, "-v") >= 0){viewports = true;std::cout << "Viewports example\n";}else if (pcl::console::find_argument(argc, argv, "-i") >= 0){interaction_customization = true;std::cout << "Interaction Customization example\n";}else{printUsage(argv[0]);return 0;}// 自行創建一隨機點云 pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>);std::cout << "Genarating example point clouds.\n\n";// 以橢圓為邊線沿z軸拉伸獲取其點云,并賦予紅綠藍漸變色。 uint8_t r(255), g(15), b(15);for (float z(-1.0); z <= 1.0; z += 0.05){for (float angle(0.0); angle <= 360.0; angle += 5.0){pcl::PointXYZ basic_point;basic_point.x = 0.5 * cosf(pcl::deg2rad(angle));basic_point.y = sinf(pcl::deg2rad(angle));basic_point.z = z;basic_cloud_ptr->points.push_back(basic_point);pcl::PointXYZRGB point;point.x = basic_point.x;point.y = basic_point.y;point.z = basic_point.z;uint32_t rgb = (static_cast<uint32_t>(r) << 16 |static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));point.rgb = *reinterpret_cast<float*>(&rgb);point_cloud_ptr->points.push_back(point);}if (z < 0.0){r -= 12;g += 12;}else{g -= 12;b += 12;}}basic_cloud_ptr->width = (int)basic_cloud_ptr->points.size();basic_cloud_ptr->height = 1;point_cloud_ptr->width = (int)point_cloud_ptr->points.size();point_cloud_ptr->height = 1;// 0.05為搜索半徑獲取點云法線 pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;ne.setInputCloud(point_cloud_ptr);pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>());ne.setSearchMethod(tree);pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1(new pcl::PointCloud<pcl::Normal>);ne.setRadiusSearch(0.05);ne.compute(*cloud_normals1);// 0.1為搜索半徑獲取點云法線 pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2(new pcl::PointCloud<pcl::Normal>);ne.setRadiusSearch(0.1);ne.compute(*cloud_normals2);boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;if (simple){viewer = simpleVis(basic_cloud_ptr);}else if (rgb){viewer = rgbVis(point_cloud_ptr);}else if (custom_c){viewer = customColourVis(basic_cloud_ptr);}else if (normals){viewer = normalsVis(point_cloud_ptr, cloud_normals2);}else if (shapes){viewer = shapesVis(point_cloud_ptr);}else if (viewports){viewer = viewportsVis(point_cloud_ptr, cloud_normals1, cloud_normals2);}else if (interaction_customization){viewer = interactionCustomizationVis();}// 主循環 while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));} }?
總結
- 上一篇: 学习Nginx,看这篇就就好了!(多图详
- 下一篇: JeecgCloud 微服务开发平台-部