如題所示,可視化的重要性沒必要多說。在點雲數據預處理中,要想知道點雲的形狀須要可視化; 要想了解精簡/去噪/簡化/壓縮 的結果須要可視化; 配準中,對應點對的顯示/對應點對的去除結果/配準變化的過程 須要可視化 ...linux
linux 下可直接在命令行輸入 pcl_viewr path/to/.pcd或.vtk
可直接顯示pcl中的點雲文件。segmentfault
pcl_viewr
幾個經常使用的命令:r
鍵: 重現視角。若是讀入文件沒有在主窗口顯示,不妨按下鍵盤的r
鍵一試。j
鍵:截圖功能。g
鍵:顯示/隱藏 座標軸。 鼠標
:左鍵,使圖像繞自身旋轉; 滾輪, 按住滾輪不鬆,可移動圖像,滾動滾輪,可放大/縮小 圖像; 右鍵,「原地」
放大/縮小。-/+
:-(減號)可縮小點; +(加號),可放大點。pcl_viewe -bc r,g,b /path/to/.pcd
:可改變背景色.pcl_viewer
還能夠用來直接顯示pfh,fpfh(fast point feature histogram),vfh等直方圖。
經常使用的pcl_viewer
好像就這些,其餘未涉及到的功能可經過pcl_viewer /path/.pcd
打開圖像,按鍵盤h
(獲取幫助)的方式得到.多線程
所謂簡單可視化類,是指直接在程序中使用,並且不支持多線程。
必須包含的頭文件 #include<pcl/visualization/cloud_viewer.h>
,聲明一個可視化類直接 pcl::visualization::CloudViewer viewer ("test");
便可,它的意思是說,我建立了一個CloudViewer的可視化類,這個可視化窗口的名字叫作test
; 顯示用viewer.showCloud(cloud)
, 要想讓本身所創窗口一直顯示,則加上 while (!viewer.wasStopped()){ };
便可, 或者直接 viewr.spin(0);
函數
以一段程序爲例:this
#include <pcl/visualization/pcl_visualizer.h> //包含基本可視化類 #include <pcl/visualization/pcl_visualizer.h> //設置鍵盤交互函數,按下`space`鍵,某事發生 void keyboardEvent(const pcl::visualization::KeyboardEvent &event,void *nothing) { if(event.getKeySym() == "space" && event.keyDown()) next_iteration = true; } int main (int argc, char **argv) { 1. 讀入點雲 source, target 2. 處理讀入的數據文件 boost::shared_ptr<pcl::visualization::PCLVisualizer> view (new pcl::visualization::PCLVisualizer("test")); //建立可視化窗口,名字叫作`test` view->setBackgroundColor(0.0,0,0); //設置背景色爲黑色 viewer->addCoordinateSystem(1.0); //創建空間直角座標系 // viewer->setCameraPosition(0,0,200); //設置座標原點 viewer->initCameraParameters(); //初始化相機參數 ***`*顯示的」處理的數據文件「的具體內容*`*** view->registerKeyboardCallback(&keyboardEvent,(void*)NULL); //設置鍵盤迴吊函數 while(!viewer->wasStopped()) { viewer->spinOnce(100); //顯示 boost::this_thread::sleep (boost::posix_time::microseconds (100000)); //隨時間 } }
在主程序2
中,處理顯示數據文件包含如下幾種:
一. 計算並顯示法向量,具體在本身的筆記pcl法向量的計算與顯示
二. 個人筆記畫線與顯示,可用於配準計算中對應點對的顯示,不過用畫線的辦法很很差.
三. 單純的自定義的顯示點雲有以下經常使用函數:spa
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> sources_cloud_color(source,250,0,0); //這句話的意思是:對輸入爲pcl::PointXYZ
類型的點雲,着色爲紅色。其中,source表示真正處理的點雲,sources_cloud_color表示處理結果.命令行
view->addPointCloud(source,sources_cloud_color,"sources_cloud_v1",v1); //將點雲source,處理結果sources_cloud_color,添加到視圖中,其中,雙引號中的sources_cloud_v1,表示該點雲的」標籤「,咱們依然能夠稱之爲」名字「,之因此設置各個處理點雲的名字,是爲了在後續處理中易於區分; v1表是添加到哪一個視圖窗口(pcl中可設置多窗口模式)線程
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,3,"sources_cloud_v1"); //設置點雲屬性. 其中PCL_VISUALIZER_POINT_SIZE
表示設置點的大小爲3,雙引號中」sources_cloud_v1「,就是步驟2
中所說的標籤。code
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY,1,"sources_cloud_v1"); //主要用來設置標籤
點雲的不透明度,表示對標籤名字爲"sources_cloud_v1"的標籤點雲設置不透明度爲1,也就是說透明度爲0. 默認狀況下徹底不透明。blog
四. 顯示配準中的對應點對關係.
要想顯示點對之間的對應關係, 首先必須計算出對應點對, pcl中對應點對的計算可經過pcl::registration::CorrespondenceEstimation<pcl::PointT,pcl::PointT> correspond_est;
計算,計算出對應點對後, source 和 target對應點的索引會存儲在vector<int> A
或pcl::Correspondences A
中.要想顯示點對的對應關係,只需 view->addCorrespondences<pcl::PointXYZ>(source,target,A,"correspond",v1);
其中,pcl::PointXYZ
表示所添加對應點對的類型爲PointXYZ
類型的,參數中的前兩個表示目標點雲和源點雲,A
存儲從目標點雲到源點雲的對應點的索引,」correspond「依然是自定義的標籤,v1表示添加到哪一個窗口.
爲了使得對應點更加個性化,咱們能夠對它進行一下」定製「:
view->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH,2,"correspond"); //設置對應點連線的粗細.PCL_VISUALIZER_LINE_WIDTH,表示線
操做,線段的寬度爲2(提醒一下本身: 線段的寬度最好不要超過自定義的點的大小),"correspond"表示對 對應的標籤 作處理.
view->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,0,0,1,"correspond"); //設置對應點連線的顏色,範圍從0-1之間。
五. 多窗口及人機交互設置.
具體操做即設置請看pcl之ICP實現
六. 若是用pcl的可視化類顯示直方圖,則能夠這樣作(以fpfh爲例):
#include <pcl/visualization/histogram_visualizer.h> //直方圖的可視化 #include <boost/thread/thread.hpp> #include <pcl/visualization/pcl_plotter.h> int main (int argc, char **argv) { .... 直方圖計算 .... pcl::visualization::PCLHistogramVisualizer view; view.setBackgroundColor(255,0,0); view.addFeatureHistogram<pcl::FPFHSignature33> (*fpfhs,"fpfh",1000); //對下標爲1000的元素可視化 //view.spinOnce(10000); //循環的次數 view.spin(); //無限循環 return 0; }
也能夠這樣顯示直方圖不過須要在添加頭文件#include <pcl/visualization/pcl_plotter.h>
pcl::visualization::PCLPlotter plotter; // We need to set the size of the descriptor beforehand. plotter.addFeatureHistogram(*fpfhs, 300); //設置的很座標長度,該值越大,則顯示的越細緻 plotter.plot();