PCL簡介
PCL(Point Cloud Library)是在吸收了前人點雲相關研究基礎上建立起來的大型跨平台開源C++編程庫,它實現了大量點雲相關的通用算法和高效數據結構,涉及到點雲獲取、濾波、分割、配准、檢索、特征提取、識別、追蹤、曲面重建、可視化等。支持多種操作系統平台,可在Windows、Linux、Android、Mac OS X、部分嵌入式實時系統上運行。如果說OpenCV是2D信息獲取與處理的結晶,那么PCL就在3D信息獲取與處理上具有同等地位,PCL是BSD授權方式,可以免費進行商業和學術應用。
最近剛接觸PCL,發現用到PCL的人還是比較少,可供學習的資料也不多,所以,我想從頭開始學習,並記錄下學習的過程。如果有興趣一起學習的同學可以加我微信號zcs9602,我們一起交流學習。
學習資源:
PCL 1.8.0 比較全的安裝包及安裝步驟:http://unanancyowen.com/en/pcl18/
PCL 相關資料匯總:https://github.com/neilgu00365/Survey-for-SfMMission
PCL 中國點雲庫:http://www.pclcn.org/
環境:windows+vs2010
如果你沒有vs2010我給你分享一個安裝包鏈接:http://pan.baidu.com/s/1pL3I0dH 密碼:a53o
一、下載
我用的是PCL 1.6.0 All-In-One Installer,Windows MSVC 2010 (32bit),所以,下面是以這個版本為主。其實,只要下載PCL-1.6.0-AllInOne-msvc2010-win32.exe、OpenNI 1.5.4 (patched)和Sensor 5.1.0 (patched)三個文件就可以了,PCL-1.6.0-AllInOne-msvc2010-win32.exe內部已經包含了全部的依賴庫,安裝的過程中,OpenNI會安裝不上,所以要單獨下載,其它的依賴庫都可以不用下載。
二、安裝
分別安裝
1、PCL-1.6.0-AllInOne-msvc2010-win32.exe
2、OpenNI-Win32-1.5.4-Dev.msi
3、Sensor-Win-OpenSource32-5.1.0.msi
注意:你要編譯的是Win32和Win64的版本要區別開,PCL和依賴庫都統一用同一個版本的,否則運行的時候會報錯。
三、配置
1、配置包含路徑
將PCL安裝路徑下的3rdParty目錄下的include添加進去,另外OpenNI單獨安裝的路徑也添加進去,還有PCL安裝路徑下的Include\pcl-1.6也添加進去。
2、配置庫路徑
將PCL安裝路徑下的3rdParty目錄下的lib添加進去,另外OpenNI單獨安裝的路徑也添加進去,還有PCL安裝路徑下的lib也添加進去。
3、配置輸入庫文件
添加下列文件名
opengl32.lib pcl_apps_debug.lib pcl_common_debug.lib pcl_features_debug.lib pcl_filters_debug.lib pcl_io_debug.lib pcl_io_ply_debug.lib pcl_kdtree_debug.lib pcl_keypoints_debug.lib pcl_octree_debug.lib pcl_registration_debug.lib pcl_sample_consensus_debug.lib pcl_search_debug.lib pcl_segmentation_debug.lib pcl_surface_debug.lib pcl_tracking_debug.lib pcl_visualization_debug.lib flann_cpp_s-gd.lib boost_chrono-vc100-mt-gd-1_49.lib boost_date_time-vc100-mt-gd-1_47.lib boost_date_time-vc100-mt-gd-1_49.lib boost_filesystem-vc100-mt-gd-1_47.lib boost_filesystem-vc100-mt-gd-1_49.lib boost_graph-vc100-mt-gd-1_49.lib boost_graph_parallel-vc100-mt-gd-1_49.lib boost_iostreams-vc100-mt-gd-1_47.lib boost_iostreams-vc100-mt-gd-1_49.lib boost_locale-vc100-mt-gd-1_49.lib boost_math_c99-vc100-mt-gd-1_49.lib boost_math_c99f-vc100-mt-gd-1_49.lib boost_math_tr1-vc100-mt-gd-1_49.lib boost_math_tr1f-vc100-mt-gd-1_49.lib boost_mpi-vc100-mt-gd-1_49.lib boost_prg_exec_monitor-vc100-mt-gd-1_49.lib boost_program_options-vc100-mt-gd-1_49.lib boost_random-vc100-mt-gd-1_49.lib boost_regex-vc100-mt-gd-1_49.lib boost_serialization-vc100-mt-gd-1_49.lib boost_signals-vc100-mt-gd-1_49.lib boost_system-vc100-mt-gd-1_47.lib boost_system-vc100-mt-gd-1_49.lib boost_thread-vc100-mt-gd-1_47.lib boost_thread-vc100-mt-gd-1_49.lib boost_timer-vc100-mt-gd-1_49.lib boost_unit_test_framework-vc100-mt-gd-1_49.lib boost_wave-vc100-mt-gd-1_49.lib boost_wserialization-vc100-mt-gd-1_49.lib libboost_chrono-vc100-mt-gd-1_49.lib libboost_date_time-vc100-mt-gd-1_47.lib libboost_date_time-vc100-mt-gd-1_49.lib libboost_filesystem-vc100-mt-gd-1_47.lib libboost_filesystem-vc100-mt-gd-1_49.lib libboost_graph_parallel-vc100-mt-gd-1_49.lib libboost_iostreams-vc100-mt-gd-1_47.lib libboost_iostreams-vc100-mt-gd-1_49.lib libboost_locale-vc100-mt-gd-1_49.lib libboost_math_c99-vc100-mt-gd-1_49.lib libboost_math_c99f-vc100-mt-gd-1_49.lib libboost_math_tr1-vc100-mt-gd-1_49.lib libboost_math_tr1f-vc100-mt-gd-1_49.lib libboost_mpi-vc100-mt-gd-1_49.lib libboost_prg_exec_monitor-vc100-mt-gd-1_49.lib libboost_program_options-vc100-mt-gd-1_49.lib libboost_random-vc100-mt-gd-1_49.lib libboost_regex-vc100-mt-gd-1_49.lib libboost_serialization-vc100-mt-gd-1_49.lib libboost_signals-vc100-mt-gd-1_49.lib libboost_system-vc100-mt-gd-1_47.lib libboost_system-vc100-mt-gd-1_49.lib libboost_test_exec_monitor-vc100-mt-gd-1_49.lib libboost_thread-vc100-mt-gd-1_47.lib libboost_thread-vc100-mt-gd-1_49.lib libboost_timer-vc100-mt-gd-1_49.lib libboost_unit_test_framework-vc100-mt-gd-1_49.lib libboost_wave-vc100-mt-gd-1_49.lib libboost_wserialization-vc100-mt-gd-1_49.lib vtkalglib-gd.lib vtkCharts-gd.lib vtkCommon-gd.lib vtkDICOMParser-gd.lib vtkexoIIc-gd.lib vtkexpat-gd.lib vtkFiltering-gd.lib vtkfreetype-gd.lib vtkftgl-gd.lib vtkGenericFiltering-gd.lib vtkGeovis-gd.lib vtkGraphics-gd.lib vtkhdf5-gd.lib vtkHybrid-gd.lib vtkImaging-gd.lib vtkInfovis-gd.lib vtkIO-gd.lib vtkjpeg-gd.lib vtklibxml2-gd.lib vtkmetaio-gd.lib vtkNetCDF-gd.lib vtkNetCDF_cxx-gd.lib vtkpng-gd.lib vtkproj4-gd.lib vtkRendering-gd.lib vtksqlite-gd.lib vtksys-gd.lib vtktiff-gd.lib vtkverdict-gd.lib vtkViews-gd.lib vtkVolumeRendering-gd.lib vtkWidgets-gd.lib vtkzlib-gd.lib
文件有點多,這里可以有個比較快的方法:這里以vtk為例,
打開CMD->進入PCL的安裝目錄->進入3rdParty\VTK\lib\vtk-5.8目錄->輸入命令:dir /b *gd.lib -> list.txt
命令的意思是找出gd.lib結尾的文件並保存到list.txt文檔里面。然后當前目錄就會生成list.txt
四、Demo
例程:
#include <pcl/visualization/cloud_viewer.h> #include <iostream> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h> int user_data; void viewerOneOff (pcl::visualization::PCLVisualizer& viewer) { viewer.setBackgroundColor (0, 0, 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++; } int main () { pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>); pcl::io::loadPCDFile ("my_point_cloud.pcd", *cloud); pcl::visualization::CloudViewer viewer("Cloud Viewer"); //blocks until the cloud is actually rendered viewer.showCloud(cloud); //use the following functions to get access to the underlying more advanced/powerful //PCLVisualizer //This will only get called once viewer.runOnVisualizationThreadOnce (viewerOneOff); //This will get called once per visualization iteration viewer.runOnVisualizationThread (viewerPsycho); while (!viewer.wasStopped ()) { //you can also do cool processing here //FIXME: Note that this is running in a separate thread from viewerPsycho //and you should guard against race conditions yourself... user_data++; } return 0; }
以上效果圖是用realsense的SR300獲取到我桌面的點雲。
my_point_cloud.pcd 文件 鏈接:http://pan.baidu.com/s/1gfD2lF1 密碼:cexi
五、總結分享
1、pcd讀取有點慢,據說pcd數據以有序點雲的方式保存會好一點,但是沒我試了沒看出來能快多少,這個有待研究。
2、SR300直接獲取的深度圖像和RGB圖像坐標上有偏差,這個考慮下怎么做對齊。
3、如果工程配置上SR300的SDK和opencv,我們就不需要在另一個工程先保存pcd文件再讀取,中間就可以省了很多步驟。
4、PCL的學習資料還是很少,目前聽說比較好也就只有《點雲庫PCL學習教程》,我也買了一本,慢慢學吧。
公眾號奉上~歡迎來搞!