前言
激光雷達生成的點雲數據通過可視化顯示,是下圖中的效果:
能看到激光雷達發射多線激光束(藍色圓圈形紋),通過接收器進行處理加工,最好可視化展示出來。從圖能看到車、行人、路燈杆、周圍的建築物等。
那麼通過什麼來處理這些點雲數據呢?
答案是: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呢??
以下適合開發者,快速入門
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具有寫自己文件放置的位置路徑
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
希望對你有幫助。