PCL基础4:PCLVisualizer可视化窗口显示
1.單視口顯示。
//可視化結果
pcl::visualization::CloudViewer viewer("邊界提取");
viewer.showCloud(cloud_out);
while (!viewer.wasStopped()){} 
所謂簡單可視化類,是指直接在程序中使用,而且不支持多線程。
 必須包含的頭文件 #include<pcl/visualization/cloud_viewer.h>,聲明一個可視化類直接 pcl::visualization::CloudViewer viewer ("邊界提取"); 即可,它的意思是說,我創建了一個CloudViewer的可視化類,這個可視化窗口的名字叫做邊界提取; 顯示用viewer.showCloud(cloud_out) , 要想讓自己所創窗口一直顯示,則加上 while (!viewer.wasStopped()){ };即可, 或者直接 viewr.spin(0);
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("邊界提取")); 
創建視窗對象,并給標題欄定義一個名稱"邊界提取",我們將它定義為boost::shared_ptr智能共享指針,這樣可以保證該指針在整個程序全局使用,而不引起內存錯誤,通常情況下,用戶不需要這樣做。
2.兩個窗口顯示。
//可視化
boost::shared_ptr<pcl::visualization::PCLVisualizer> MView(new pcl::visualization::PCLVisualizer("邊界提取"));int v1(0);
MView->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
MView->setBackgroundColor(0.3, 0.3, 0.3, v1);
MView->addText("Raw point clouds", 10, 10, "v1_text", v1);
int v2(0);
MView->createViewPort(0.5, 0.0, 1, 1.0, v2);
MView->setBackgroundColor(0.5, 0.5, 0.5, v2);
MView->addText("Boudary point clouds", 80, 80, "v2_text", v2);//將80,80改為10,10結果如右圖
MView->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud", v1);
MView->addPointCloud<pcl::PointXYZ>(cloud_boundary, "cloud_boundary", v2);
MView->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "sample cloud", v1);
MView->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "cloud_boundary", v2);
MView->addCoordinateSystem(1.0);
MView->initCameraParameters();
MView->spin(); 
結果顯示如下:
? ? ? ? ? ?
函數解釋:
createViewPort(0.0, 0.0, 0.5, 1.0, v1); 
代表X最小值,Y最小值,X最大值,Y最大值,顯示窗口的ID號(最后一個參數我是這樣理解的??) ---此句相當于定義左半部分位置顯示(坐標原點在左上方為(0,0))
setBackgroundColor(0.3, 0.3, 0.3, v1); 
代表r,g,b的值,顯示窗口的ID號。---此句給顯示窗口背景著色,用于方便區別。
通過RGB三個通道設置視窗的背景顏色,范圍歸一化到(0到1)
addText("Raw point clouds", 10, 10, "v1_text", v1); 
添加文字信息,文字添加位置x,y,第四個參數(不太明白??),添加窗口的信息
addPointCloud<pcl::PointXYZ>(cloud, "sample cloud", v1); 
添加點云數據,第二個參數(不太理解啥意思??),該點云數據添加的窗口是哪個
我們將點云添加到視窗對象中,并定義一個唯一的字符串作為ID號,利用此字符串保證在其他成員方法中也能標識引用該點云,多次調用addPointCloud(),可以實現多個點云的添加,每調用一次就創建一個新的ID號,如果想更新一個已經顯示的點云,用戶必須先調用removePointCloud(),并提供需要更新的點云的ID號。(注:PCL?的1.1及以上版本提供一個新的API,updatePointCloud(),通過該接口,不必手動調用removePointCloud(),就可實現點云的更新)。這是addPointCloud()函數諸多重載函數中最基本的一種,其他類型的函數用于處理不同類型的點云、顯示法線等。
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中可設置多窗口模式)
?
上面代碼(如果不選擇視口ID,例如V1,V2等)就是為所有視口設置屬性,大多數PCLVisualizer類的方法成員都有一個可以選擇的視口ID參數,當設置該參數時,該方法只作用于所設置視口,不設置該參數的話,該方法作用于所有視口.
setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "sample cloud", v1); 
該函數第一個參數多樣:例如下兩個:
setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,3,"sources_cloud_v1"); //設置點云屬性. 其中PCL_VISUALIZER_POINT_SIZE表示設置點的大小為3,雙引號中”sources_cloud_v1“,就是步驟2中所說的標簽。
view->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY,1,"sources_cloud_v1"); //主要用來設置標簽點云的不透明度,表示對標簽名字為"sources_cloud_v1"的標簽點云設置不透明度為1,也就是說透明度為0. 默認情況下完全不透明。
addCoordinateSystem(1.0);默認參數為1 
 
addCoordinateSystem()函數可以在可視化窗口中的坐標原點(0,0,0)處添加一個紅綠藍三色的三維指示坐標軸,紅色是X軸,綠色是Y軸,藍色是Z,也就是說PCL點云庫中使用的是右手三維坐標系。
查看復雜的點云經常會讓用戶感到沒方向感,為了讓用戶保持正確的坐標判斷,需要顯示坐標系統方向,可以通過使用X (紅色)、Y (綠色)?、Z (藍色)圓柱體代表坐標軸的顯示方式來解決,圓柱體的大小通過scale參數控制。本例中,我們將scale參數設置為1.0,該值也為缺省值,該方法的另一重載函數可實現對點云中的每個點的坐標方向進行顯示。
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>int main(int argc, char** argv)
{//顯示類pcl::visualization::PCLVisualizer viewer("Cloud Viewer");//添加坐標系viewer.addCoordinateSystem();   //讓可視化視窗停住,否則一閃而過。while (!viewer.wasStopped()){   viewer.spinOnce();}return (0);
}
 
??
?
initCameraParameters(); 
最后的調用通過設置相機參數使用戶從默認的角度和方向觀察點云。
最后:
while (!viewer->wasStopped ())
{viewer->spinOnce (1000);boost::this_thread::sleep (boost::posix_time::microseconds (1000));
} 
上面幾行代碼在執行一個while循環,每次調用spinOnce都給視窗處理事件的時間,這樣允許鼠標鍵盤等交互操作,此外還有一種spin的重載方法,它只需調用一次。
PPPPSSSS:創建一個田字由四個窗口顯示點云的方法是先創建四個viewport的id
 根據xy坐標原點在左上角:
int v1,v2,v3,v4;
viewer->createViewPort (0.0, 0.0, 0.5, 0.5, v1); //(Xmin,Ymin,Xmax,Ymax)設置窗口坐標
viewer->createViewPort (0.5, 0.0, 1.0, 0.5, v2);
viewer->createViewPort (0.0, 0.5, 0.5, 1.0, v3);
viewer->createViewPort (0.5, 0.5, 1.0, 1.0, v4);
 
?
總結
以上是生活随笔為你收集整理的PCL基础4:PCLVisualizer可视化窗口显示的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: PCL基础2:点云赋值
 - 下一篇: C++ 函数参数传递:传值,传指针,传引