pcl可視化的那些事

可視化:一目瞭然

如題所示,可視化的重要性沒必要多說。在點雲數據預處理中,要想知道點雲的形狀須要可視化; 要想了解精簡/去噪/簡化/壓縮 的結果須要可視化; 配準中,對應點對的顯示/對應點對的去除結果/配準變化的過程 須要可視化 ...linux

pcl_viewer

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

  1. pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> sources_cloud_color(source,250,0,0); //這句話的意思是:對輸入爲pcl::PointXYZ類型的點雲,着色爲紅色。其中,source表示真正處理的點雲,sources_cloud_color表示處理結果.命令行

  2. view->addPointCloud(source,sources_cloud_color,"sources_cloud_v1",v1); //將點雲source,處理結果sources_cloud_color,添加到視圖中,其中,雙引號中的sources_cloud_v1,表示該點雲的」標籤「,咱們依然能夠稱之爲」名字「,之因此設置各個處理點雲的名字,是爲了在後續處理中易於區分; v1表是添加到哪一個視圖窗口(pcl中可設置多窗口模式)線程

  3. view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,3,"sources_cloud_v1"); //設置點雲屬性. 其中PCL_VISUALIZER_POINT_SIZE表示設置點的大小爲3,雙引號中」sources_cloud_v1「,就是步驟2中所說的標籤。code

  4. 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> Apcl::Correspondences A中.要想顯示點對的對應關係,只需 view->addCorrespondences<pcl::PointXYZ>(source,target,A,"correspond",v1); 其中,pcl::PointXYZ表示所添加對應點對的類型爲PointXYZ類型的,參數中的前兩個表示目標點雲和源點雲,A 存儲從目標點雲到源點雲的對應點的索引,」correspond「依然是自定義的標籤,v1表示添加到哪一個窗口.
爲了使得對應點更加個性化,咱們能夠對它進行一下」定製「:

  1. view->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH,2,"correspond"); //設置對應點連線的粗細.PCL_VISUALIZER_LINE_WIDTH,表示操做,線段的寬度爲2(提醒一下本身: 線段的寬度最好不要超過自定義的點的大小),"correspond"表示對 對應的標籤 作處理.

  2. 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();

圖片描述

相關文章
相關標籤/搜索