PCL簡介html
PCL(Point Cloud Library)是在吸取了前人點雲相關研究基礎上創建起來的大型跨平臺開源C++編程庫,它實現了大量點雲相關的通用算法和高效數據結構,涉及到點雲獲取、濾波、分割、配準、檢索、特徵提取、識別、追蹤、曲面重建、可視化等。支持多種操做系統平臺,可在Windows、Linux、Android、Mac OS X、部分嵌入式實時系統上運行。若是說OpenCV是2D信息獲取與處理的結晶,那麼PCL就在3D信息獲取與處理上具備同等地位,PCL是BSD受權方式,能夠免費進行商業和學術應用。ios
最近剛接觸PCL,發現用到PCL的人仍是比較少,可供學習的資料也很少,因此,我想從頭開始學習,並記錄下學習的過程。若是有興趣一塊兒學習的同窗能夠加我微信號zcs9602,咱們一塊兒交流學習。git
學習資源:github
PCL 1.8.0 比較全的安裝包及安裝步驟:http://unanancyowen.com/en/pcl18/算法
PCL 相關資料彙總:https://github.com/neilgu00365/Survey-for-SfMMissionsql
PCL 中國點雲庫:http://www.pclcn.org/編程
環境:windows+vs2010windows
若是你沒有vs2010我給你分享一個安裝包連接:http://pan.baidu.com/s/1pL3I0dH 密碼:a53o微信
1、下載數據結構
我用的是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會安裝不上,因此要單獨下載,其它的依賴庫均可以不用下載。
2、安裝
分別安裝
一、PCL-1.6.0-AllInOne-msvc2010-win32.exe
二、OpenNI-Win32-1.5.4-Dev.msi
三、Sensor-Win-OpenSource32-5.1.0.msi
注意:你要編譯的是Win32和Win64的版本要區別開,PCL和依賴庫都統一用同一個版本的,不然運行的時候會報錯。
3、配置
一、配置包含路徑
將PCL安裝路徑下的3rdParty目錄下的include添加進去,另外OpenNI單獨安裝的路徑也添加進去,還有PCL安裝路徑下的Include\pcl-1.6也添加進去。
二、配置庫路徑
將PCL安裝路徑下的3rdParty目錄下的lib添加進去,另外OpenNI單獨安裝的路徑也添加進去,還有PCL安裝路徑下的lib也添加進去。
三、配置輸入庫文件
添加下列文件名
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
4、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
5、總結分享
一、pcd讀取有點慢,聽說pcd數據以有序點雲的方式保存會好一點,可是沒我試了沒看出來能快多少,這個有待研究。
二、SR300直接獲取的深度圖像和RGB圖像座標上有誤差,這個考慮下怎麼作對齊。
三、若是工程配置上SR300的SDK和opencv,咱們就不須要在另外一個工程先保存pcd文件再讀取,中間就能夠省了不少步驟。
四、PCL的學習資料仍是不多,目前據說比較好也就只有《點雲庫PCL學習教程》,我也買了一本,慢慢學吧。
公衆號奉上~歡迎來搞!