可視化(visualization)是利用計算機圖形學和圖像處理技術,將數據轉換圖像在屏幕上顯示出來,並進行交互處理的的理論,方法和技術,
pcl_visualization庫建立了能夠快速建立原型的目的和可視化算法對三維點雲數據操作的結果。類似於opencv的highgui例程顯示二維圖像,在屏幕上繪制基本的二維圖形,庫提供了以下幾點:
(1)渲染和設置視覺特性的方法(如顏色、大小、透明度等)在PCL任意n維的點雲數據集pcl::PointCloud<T> format
(2)在屏幕上繪制基本的3D形狀的方法(例如,圓柱體,球體,線,多邊形等),無論是從點集或參數方程;
(3)一個直方圖可視化模塊(pclhistogramvisualizer)的二維圖;
(4)大量的幾何和顏色處理pcl::PointCloud<T> datasets
(5)a pcl::RangeImage 可視化模塊
.
1. class pcl::visualization::CloudViewer 類CloudViewer實現創建點雲可視化的窗口,以及相關的可視化功能
Public Member Functions |
|
CloudViewer (const std::string &window_name) 構建可視化點雲窗口,窗口名為window_name |
|
~CloudViewer () 注銷窗口相關資源 |
|
void | showCloud (const ColorCloud::ConstPtr &cloud, const std::string &cloudname="cloud") |
可視化窗口顯示cloud對應的點雲,考慮到多個點雲用鍵值cloudname來限定是哪一個點雲 | |
bool | wasStopped (int millis_to_wait=1) |
判斷用戶是否已經關閉窗口,如果是則需要注銷窗口 | |
void | runOnVisualizationThread (VizCallable x, const std::string &key="callable") |
在窗口運行期間處理x的回調函數,key為鍵值標識此回調函數,知道窗口關閉 | |
void | runOnVisualizationThreadOnce (VizCallable x) |
值調用回調函數一次 | |
void | removeVisualizationCallable (const std::string &key="callable") |
刪除key對應的回調函數 | |
boost::signals2::connection | registerKeyboardCallback (void(*callback)(const pcl::visualization::KeyboardEvent &, void *), void *cookie=NULL) |
注冊鍵盤事件回調函數,cookie為回調時的參數,callback為回調函數的指針 | |
template<typename T > | |
boost::signals2::connection | registerKeyboardCallback (void(T::*callback)(const pcl::visualization::KeyboardEvent &, void *), T &instance, void *cookie=NULL) |
同上,其中的instance 指向是實現該回到函數的對象 |
(2)太多了這里就貼出所有的關於可視化的類 對於類的成員就不再一一介紹
等等*****************************************8
應用實例
cloud_viewer.cpp:
#include <pcl/visualization/cloud_viewer.h> //類cloud_viewer頭文件申明 #include <iostream> //標准輸入輸出頭文件申明 #include <pcl/io/io.h> //I/O相關頭文件申明 #include <pcl/io/pcd_io.h> //PCD文件讀取 /********************************************************************************** 函數是作為回調函數,在主函數中只注冊一次 ,函數實現對可視化對象背景顏色的設置,添加一個圓球幾何體 *********************************************************************************/ int user_data; void viewerOneOff (pcl::visualization::PCLVisualizer& viewer) { viewer.setBackgroundColor (1.0, 0.5, 1.0); //設置背景顏色 pcl::PointXYZ o; //存儲球的圓心位置 o.x = 1.0; o.y = 0; o.z = 0; viewer.addSphere (o, 0.25, "sphere", 0); //添加圓球幾何對象 std::cout << "i only run once" << std::endl; } /*********************************************************************************** 作為回調函數,在主函數中注冊后每幀顯示都執行一次,函數具體實現在可視化對象中添加一個刷新顯示字符串 *************************************************************************************/ void viewerPsycho (pcl::visualization::PCLVisualizer& viewer) { static unsigned count = 0; std::stringstream ss; ss << "Once per viewer loop: " << count++; viewer.removeShape ("text", 0); viewer.addText (ss.str(), 200, 300, "text", 0); //FIXME: possible race condition here: user_data++; } /************************************************************** 首先加載點雲文件到點雲對象,並初始化可視化對象viewer,注冊上面的回 調函數,執行循環直到收到關閉viewer的消息退出程序 *************************************************************/ int main () { pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>); //聲明cloud pcl::io::loadPCDFile ("my_point_cloud.pcd", *cloud); //加載點雲文件 pcl::visualization::CloudViewer viewer("Cloud Viewer"); //創建viewer對象 //showCloud函數是同步的,在此處等待直到渲染顯示為止 viewer.showCloud(cloud); //該注冊函數在可視化的時候只執行一次 viewer.runOnVisualizationThreadOnce (viewerOneOff); //該注冊函數在渲染輸出時每次都調用 viewer.runOnVisualizationThread (viewerPsycho); while (!viewer.wasStopped ()) { //此處可以添加其他處理 //FIXME: Note that this is running in a separate thread from viewerPsycho //and you should guard against race conditions yourself... user_data++; } return 0; }
編譯結果如下
未完待續*************************8888888