1. 程式人生 > >PCL中PCLVisualizer類與CloudViewer類簡介與區別

PCL中PCLVisualizer類與CloudViewer類簡介與區別

PCLVisualizer視覺化類是PCL中功能最全的視覺化類,與CloudViewer視覺化類相比,PCLVisualizer使用起來更為複雜,但該類具有更全面的功能,如顯示法線、繪製多種形狀和多個視口。


我們先從官方文件及原始碼看起:

http://docs.pointclouds.org/1.8.1/classpcl_1_1visualization_1_1_cloud_viewer.html

http://docs.pointclouds.org/1.8.1/classpcl_1_1visualization_1_1_p_c_l_visualizer.html


對於CloudViewer類來說,其方法有大致以下幾類(駝峰規則讓原始碼看起來很舒服)

void showCloud()

void wasStopped()

void runOnVisualizationThread()

void runOnVisualizationThreadOnce ()

void removeVisualizationCallable()

boost::signals2::connection registerKeyboardCallback()

boost::signals2::connection registerMouseCallback()

boost::signals2::connection registerPointPickingCallback()

從名字中可以大致看出函式的意義:顯示點雲、關閉視窗、鍵盤滑鼠的響應。

void runOnVisualizationThread()

void runOnVisualizationThreadOnce ()

這兩個函式和PCLVisualizer關聯較大,一起使用更加甜蜜。

他們的可以在函式中呼叫一個物件,在介面中畫出想要的東西,但可能是隻執行一次的或者一直執行的。

//只會執行一次

void viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{

	//設定背景顏色
	viewer.setBackgroundColor (0.0, 0.0, 0.0);
	
	//球體座標
 //   pcl::PointXYZ o;
 //   o.x = 0;
 //   o.y = 0;
 //   o.z = 0;
	////新增球體
 //   viewer.addSphere (o, 1, "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);
    //viewer.addCoordinateSystem (1.0,0,0,0);
    //FIXME: possible race condition here:
   // user_data++;
}


void OpenOfflineOutputFile::open3DPointCloudFile(std::string& filepath)
{
	pcl::PointCloud<pcl::PointXYZI>::Ptr m_cloud(new pcl::PointCloud<pcl::PointXYZI>);
	pcl::io::loadPCDFile(filepath,*m_cloud);
	
	pcl::visualization::CloudViewer viewer("3D Point Cloud Viewer");
	viewer.showCloud(m_cloud);
	viewer.runOnVisualizationThreadOnce (viewerOneOff);//呼叫相應函式執行
	viewer.runOnVisualizationThread (viewerPsycho);//呼叫相應函式執行
	while(!viewer.wasStopped())
	{
	}
}

從上即可看出,PCLVisualizer的強大之處,可以改變視窗背景,還可以新增球體,設定文字,功能特別豐富。

由於PCLVisualizer中功能甘薯太多,這裡就不一一列舉了,大家可以按需自行查閱。這裡僅提供一個PCL中一個小方法:CloudViewer不能完成的介面功能可以使用PCLVisualizer。