【激光雷達】認識點雲庫PCL

前言

激光雷達生成的點雲數據通過可視化顯示,是下圖中的效果:

能看到激光雷達發射多線激光束(藍色圓圈形紋),通過接收器進行處理加工,最好可視化展示出來。從圖能看到車、行人、路燈杆、周圍的建築物等。

 

那麼通過什麼來處理這些點雲數據呢?

答案是:PCL點雲庫

目錄

簡介

特徵

PCL的代碼庫圖

PCL項目由哪些開發的?

以下適合純使用者,快速入門

以下適合開發者,快速入門

安裝PCL

開發實踐


 

簡介

  PCL全稱 Point Cloud Library,中文簡稱:點雲庫;這個庫包含豐富的點雲處理函數。點雲庫(PCL)是一個獨立的,大規模的,開放的項目用於2D / 3D圖像和點雲處理。


 

 

特徵

  • PCL是ROS(機器人操作系統)的3D處理主幹。
  • 點雲庫(PCL)可在許多操作系統上運行,並且預構建的二進制文件可用於Linux,Windows和Mac OSX。
  • PCL是根據BSD許可條款發佈的,可免費用於商業和研究用途。
  • 爲了簡化開發,將PCL分爲一系列較小的代碼庫,可以分別進行編譯。
  • PCL分爲一系列模塊化庫,包含:filters、features、keypoints、registration、kdtree、segmentation、sample、consensus surface、recognition、visualization。

圖中標註了常用的模塊函數;

PCL庫主要包括:點雲獲取、濾波、分割、配準、檢索、特徵提取、識別、追蹤、曲面重建、可視化

 

PCL的代碼庫圖

類似於Boost of C ++庫。這是一個例子:

PCL項目由哪些開發的?

PCL開源項目,由來自許多不同組織的衆多工程師和科學家開發的,分佈在世界各地,包括:

 

 

以下適合純使用者,快速入門

(如果開發者可以跳過,後面介紹)

API文檔:http://docs.pointclouds.org/trunk/

如何找到不同版本的API呢??

點擊我來查找不同版本的API

用戶論壇:http://www.pcl-users.org

 

以下適合開發者,快速入門

PCL開發者論壇:http://www.pcl-developers.org

PCL開源庫地址:https://github.com/PointCloudLibrary/pcl

 

如果開發過程中遇到問題,可以在下面提問交流:

開發者教程:http://www.pointclouds.org/documentation/tutorials/

 

其他

PCL點雲庫的標誌

PCL官方博客文章:http://www.pointclouds.org/blog/

 

安裝PCL

Ubuntu系統

sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo apt-get update
sudo apt-get install libpcl-all

Linux系統

wget https://aur.archlinux.org/packages/pc/pcl/pcl.tar.gz
tar -xzf pcl.tar.gz
cd pcl
makepkg
sudo pacman -U pcl*.xz

安裝好後,需要進行配置。參考官網:在自己的項目中使用PCL

 

 

開發實踐

1)PCL點雲讀取和顯示

dmeo1 基本的讀取與顯示

PCL中點雲的顯示主要有兩個類:1. pcl::visualization::CloudViewer;  2. pcl::visualization::PCLVisualizer。

下面代碼採用CloudViewer,讀取點雲數據的pcd文件:

#include <iostream> //標準輸入輸出流
#include <pcl/io/pcd_io.h> //PCL的PCD格式文件的輸入輸出頭文件
#include <pcl/point_types.h> //PCL對各種格式的點的支持頭文件
#include <pcl/visualization/cloud_viewer.h>  //引入cloud_viewer相關文件
 
int main(int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 創建點雲(指針)
          //讀入PCD格式的文件,如果文件不存在,返回-1
	if (pcl::io::loadPCDFile<pcl::PointXYZ>("D:/PCL_TEST/velodyn_1.pcd", *cloud) == -1) 
	{
		PCL_ERROR("Couldn't read file test_pcd.pcd \n"); //文件不存在時,返回錯誤,終止程序。
		return (-1);
	}
	std::cout << "Loaded "
		<< cloud->width * cloud->height
		<< " data points from test_file.pcd with the following fields: "
		<< std::endl;
	for (size_t i = 0; i < cloud->points.size (); ++i) //通過for循環,顯示所有的點  效率偏慢
		std::cout << "    " << cloud->points[i].x
		<< " " << cloud->points[i].y
		<< " " << cloud->points[i].z << std::endl;
	pcl::visualization::CloudViewer viewer("pcd viewer");   //建立CloudViewer 對象
	viewer.showCloud(cloud);   //窗口可視化顯示
	system("pause");
	return (0);
}

pcl  是一個命名空間,跟std類似;PointCloud是類模板,<pcl::PointXYZ>是模板類實例化的類型。

其中PointXYZ可以替換爲PointXYZRGB,、PointXYZRGBA等多種點雲的格式。

D:/PCL_TEST/velodyn_1.pcd具有寫自己文件放置的位置路徑


demo2 基本讀取與豐富地顯示

pcl::visualization::PCLVisualizer

如果想要更加豐富的點雲顯示,如給點雲添加顏色、顯示點雲中的法矢、在窗口中自己畫圖案、自定義視角的位置,可以採用pcl::visualization::PCLVisualizer

官網案例參考:http://www.pointclouds.org/documentation/tutorials/pcl_visualizer.php#pcl-visualizer

下面代碼採用PCLVisualizer,讀取點雲數據的pcd文件:

#include <opencv2/core/core.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>       //前面是導入OpenCV的函數文件
#include <pcl/visualization/cloud_viewer.h>  //導入點雲可視化的文件
 
using namespace pcl;     //申明命名空間
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));  //創建PCLVisualizer對象
 
int main()
{
    //定義點雲數據
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
 
    // 定義讀取對象
    pcl::PCDReader reader;
 
    // 讀取點雲文件
    reader.read<pcl::PointXYZ> ("D:/PCL_TEST/velodyn_1.pcd", *cloud);  // D:/PCL_TEST/velodyn_1.pcd具有寫自己文件放置的位置路徑

    while(true)
    {
        viewer1->removeAllPointClouds();  // 移除當前所有點雲
        viewer1->addPointCloud(cloud, "test");  
        viewer1->updatePointCloud(cloud, "test"); 
        viewer1->spinOnce(0.0000000000001);
    }
}

同樣其中PointXYZ可以替換爲PointXYZRGB,、PointXYZRGBA等多種點雲的格式。

D:/PCL_TEST/velodyn_1.pcd具有寫自己文件放置的位置路徑

參考:https://blog.csdn.net/lizhengze1117/article/details/89154028?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-13&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-13

 

2)點雲庫對濾波算法的實現

其原理及算法:直通濾波器、體素濾波器、統計濾波器、半徑濾波器  參考:https://www.cnblogs.com/ironstark/p/4991232.html

參考:https://blog.csdn.net/qq_30815237/article/details/86294496

VexelGrid濾波器對點雲下采樣;參考:https://blog.csdn.net/LimitOut/article/details/102888615

 

 

 

希望對你有幫助。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章