PCL点云库安装及学习(2021.7.28)
PCL點云庫學習 2021.7.28
- 1、PCL簡介
- 2、Win10系統下PCL環境配置
- 2.1 前提環境(Win10 64位+Visual Studio 2015)
- 2.2 方式一:源碼編譯(過程繁瑣但通用性強)
- 2.3 方式二:安裝包安裝(簡單易懂,推薦使用)
- 3、PCL項目實戰(VS 2015)
- 3.1 VS 2015 新建項目進行配置
- 3.2 PCL項目頭文件、庫文件配置
- 3.2.1 PCL項目配置 Include包含目錄(.h)
- 3.2.2 PCL項目配置 Lib庫目錄(.lib)
- 3.2.3 PCL項目配置 鏈接器->輸入(使用Eclipse+Java來獲取lib下的lib文件名)
- 3.2.4 PCL項目配置 預處理器定義
- 3.3 pcd文件簡介
- 3.4 編寫C++PCL代碼
- 3.5 運行結果(點云可視化)
- 3.5.1 附圖
1、PCL簡介
????????點云庫PCL英文全稱為Point Cloud Library,它是一個獨立的、大規模的、開放的項目,用于2D和3D圖像和點云處理,同時還可免費用于商業和科學研究。PCL支持的操作系統有Linux、Windows、MacOS等,它所支持的開發語言有C++和Python,內部所調用的第三方依賴庫有Boost、Eigen、FLANN、VTK、QHull和OpenNI2,這六個依賴庫特別重要!!!PCL可分為一系列的模塊庫,包含濾波器filters、特征features、特征keypoints、配準registration、kd樹kdtree、oc樹octree、分割segmentation、采樣一致性sample_consensus、表面surface、識別recognition、輸入輸出io和可視化visualization。
????????在三維激光掃描點云數據處理中,PCL可作為一款強大的工具幫助企業和科研人員開展大量的研究工作,具體PCL的細節可參考PCL幫助文檔,PCL論文下載,PCL的Github地址。
2、Win10系統下PCL環境配置
2.1 前提環境(Win10 64位+Visual Studio 2015)
????????這里電腦的操作系統為64位Windows10系統,同時需要電腦安裝Visual Studio。
| Win10 x64 | VS 2015 |
????????在Windows系統上配置PCL環境通常有兩種方式:方式一:源碼編譯、方式二:安裝包安裝。在很多情況下,我們可以使用All-in-one Installer安裝包來使用PCL;但是如果用戶想要使用其他編譯器來使用PCL點云庫的功能,就需要自己編譯PCL及其依賴的第三方庫。
2.2 方式一:源碼編譯(過程繁瑣但通用性強)
????????PCL 1.8.1源碼編譯英文教程
????????如果從源碼編譯更新版本的PCL點云庫,則需要從幫助文檔出發。首先參考Building PCL’s dependencies from source on Windows來編譯所需的第三方依賴庫,然后下載PCL源代碼并參考Compiling PCL from source on Windows編譯為二進制binaries庫可供其他項目調用,這里不再贅述。
2.3 方式二:安裝包安裝(簡單易懂,推薦使用)
????????PCL All-in-one Installer是一個包含預編譯好的PCL及其第三方庫的安裝包,由于電腦安裝了VS 2015,通過查找發現安裝包PCL-1.8.1-AllInOne-msvc2015-win64.exe和調試數據庫文件pcl-1.8.1-pdb-msvc2015-win64.zip比較適合自己的電腦環境。PCL1.8.1安裝包下載鏈接
????????第一步,雙擊安裝包PCL-1.8.1-AllInOne-msvc2015-win64.exe,一直點擊下一步即可;安裝的過程中會彈出OpenNI的安裝程序,將OpenNI的安裝路徑設置為PCL安裝路徑下的3rdParty\OpenNI2文件夾。
| OpenNI 2 | PCL 1.8.1 |
????????安裝程序結束后,PCL安裝目錄結構如下圖所示,其中第三方庫3rdParty文件夾下包含Boost、Eigen、FLANN、OpenNI2、Qhull和VTK六個文件夾,各個文件夾目錄結構見下圖。
| PCL 1.8.1 安裝目錄 | 第三方庫3rdParty文件夾 |
| Boost文件夾 | eigen3文件夾 |
| FLANN文件夾 | OpenNI 2文件夾 |
| Qhull文件夾 | VTK文件夾 |
????????第二步,pcl-1.8.1-pdb-msvc2015-win64.zip解壓后文件夾下的文件如下圖所示,安裝程序執行完成后,將pcl-1.8.1-pdb-msvc2015-win64.zip解壓后的pdb文件全部拷貝到PCL安裝目錄下的bin文件夾中。
????????第三步,對系統的環境變量進行設置,設置PCL_ROOT為D:\Program Files (x86)\PCL 1.8.1,并在Path文本后添加;%PCL_ROOT%\bin;%PCL_ROOT%\3rdParty\OpenNI2\Tools;%PCL_ROOT%\3rdParty\FLANN\bin;%PCL_ROOT%\3rdParty\Qhull\bin;%PCL_ROOT%\3rdParty\VTK\bin;。
????????最終設置好的系統環境變量如下圖所示,至此,PCL環境配置完成。
3、PCL項目實戰(VS 2015)
3.1 VS 2015 新建項目進行配置
????????第一步,打開Visual Studio 2015后新建一個Visual C++下的Win32控制臺應用程序,項目名稱輸入MyPCL并選擇項目保存位置后點擊確定,進入Win32應用程序向導窗口后點擊下一步后,接下來選擇控制臺應用程序和空項目后點擊完成,
????????第二步,在解決方案PCL項目的源文件上右鍵選擇新建項->添加,在彈出的添加新項窗口中選擇C++文件(.cpp)后,輸入文件名為main.cpp后點擊添加
????????第三步,在打開的main.cpp文件中輸入以下C++代碼開始調試運行,運行結果如下圖所示,說明程序能夠正常運行。
3.2 PCL項目頭文件、庫文件配置
????????MyPCL項目上右鍵選擇屬性進入屬性頁窗口,配置選擇Release或者Debug,平臺選擇x64。
????????對于一個C++項目而言,尤其是像包含第三方庫(如OpenCV、OSG、PCL等)的項目,尤其要注意對三個部分的設置:1、頭文件include包含目錄用來指明.h文件的目錄位置;2、庫文件lib庫目錄用來指明.lib文件的目錄位置;3、鏈接器中輸入下的附加依賴項輸入所有項目需要鏈接到的lib文件名。
3.2.1 PCL項目配置 Include包含目錄(.h)
????????在屬性頁窗口中選擇VC++目錄,點擊右側的包含目錄,向其中添加 .h文件所在目錄 后點擊確定。
D:\Program Files (x86)\PCL 1.8.1\3rdParty\FLANN\include D:\Program Files (x86)\PCL 1.8.1\3rdParty\Qhull\include D:\Program Files (x86)\PCL 1.8.1\3rdParty\OpenNI2\Include D:\Program Files (x86)\PCL 1.8.1\3rdParty\VTK\include\vtk-8.0 D:\Program Files (x86)\PCL 1.8.1\3rdParty\Eigen\eigen3 D:\Program Files (x86)\PCL 1.8.1\3rdParty\Boost\include\boost-1_64 D:\Program Files (x86)\PCL 1.8.1\include\pcl-1.83.2.2 PCL項目配置 Lib庫目錄(.lib)
????????在屬性頁窗口中選擇VC++目錄,點擊右側的庫目錄,向其中添加 .lib文件所在目錄 后點擊確定。
D:\Program Files (x86)\PCL 1.8.1\3rdParty\Qhull\lib D:\Program Files (x86)\PCL 1.8.1\3rdParty\OpenNI2\Lib D:\Program Files (x86)\PCL 1.8.1\3rdParty\FLANN\lib D:\Program Files (x86)\PCL 1.8.1\3rdParty\VTK\lib D:\Program Files (x86)\PCL 1.8.1\3rdParty\Boost\lib D:\Program Files (x86)\PCL 1.8.1\lib3.2.3 PCL項目配置 鏈接器->輸入(使用Eclipse+Java來獲取lib下的lib文件名)
????????由于項目運行時需要鏈接到其他lib庫文件,所以需要向鏈接器指定項目運行需要鏈接到的lib文件名稱,因此需要獲取PCL安裝目錄下lib文件夾以及第三方庫3rdParty文件夾下所有的lib文件名稱,具體的lib文件夾包含:(1)D:\Program Files (x86)\PCL 1.8.1\lib;(2)D:\Program Files (x86)\PCL 1.8.1\3rdParty\Boost\lib;(3)D:\Program Files (x86)\PCL 1.8.1\3rdParty\FLANN\lib;(4)D:\Program Files (x86)\PCL 1.8.1\3rdParty\OpenNI2\Lib;(5)D:\Program Files (x86)\PCL 1.8.1\3rdParty\Qhull\lib;(6)D:\Program Files (x86)\PCL 1.8.1\3rdParty\VTK\lib。由于MyPCL項目配置為Release,所以獲取的lib就是release類型的lib;如果項目配置為Debug,則需要獲取debug類型的lib。
| PCL的lib | Boost的lib |
| FLANN的lib | OpenNI 2的lib |
| Qhull的lib | VTK的lib |
| Java 1.8 | Eclipse IDE |
????????獲取文件夾下所有文件名的java代碼如下
package com.test;import java.io.File; import java.text.*;public class BianliFolderFile {public static void main(String[] args) {String path = "D:\\Program Files (x86)\\PCL 1.8.1\\3rdParty\\VTK\\lib";SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(path+ "路徑下的所有文件");File file = new File(path); //獲取其file對象File[] fs = file.listFiles();for(File f:fs){if(f.isFile()){ String f1 = f.getName();if(!f1.contains("-gd"))System.out.println(f.getName());}}} }????????運行結果如下圖所示,將控制臺運行的結果手動復制出來
????????將六個lib文件夾字符串分別賦值給上述java代碼中的path變量執行六次,同時通過根據條件過濾(lib文件名含有_debug、-gd、_d的均代表Debug項目下的lib,其余的則代表Release項目下的lib)可得到每個lib文件夾下的lib文件名。
????????各個lib文件夾匯總后的適用于Release項目的lib文件名如下:
pcl_common_release.lib pcl_features_release.lib pcl_filters_release.lib pcl_io_ply_release.lib pcl_io_release.lib pcl_kdtree_release.lib pcl_keypoints_release.lib pcl_ml_release.lib pcl_octree_release.lib pcl_outofcore_release.lib pcl_people_release.lib pcl_recognition_release.lib pcl_registration_release.lib pcl_sample_consensus_release.lib pcl_search_release.lib pcl_segmentation_release.lib pcl_stereo_release.lib pcl_surface_release.lib pcl_tracking_release.lib pcl_visualization_release.lib libboost_atomic-vc140-mt-1_64.lib libboost_bzip2-vc140-mt-1_64.lib libboost_chrono-vc140-mt-1_64.lib libboost_container-vc140-mt-1_64.lib libboost_context-vc140-mt-1_64.lib libboost_coroutine-vc140-mt-1_64.lib libboost_date_time-vc140-mt-1_64.lib libboost_exception-vc140-mt-1_64.lib libboost_fiber-vc140-mt-1_64.lib libboost_filesystem-vc140-mt-1_64.lib libboost_graph-vc140-mt-1_64.lib libboost_graph_parallel-vc140-mt-1_64.lib libboost_iostreams-vc140-mt-1_64.lib libboost_locale-vc140-mt-1_64.lib libboost_log-vc140-mt-1_64.lib libboost_log_setup-vc140-mt-1_64.lib libboost_math_c99-vc140-mt-1_64.lib libboost_math_c99f-vc140-mt-1_64.lib libboost_math_c99l-vc140-mt-1_64.lib libboost_math_tr1-vc140-mt-1_64.lib libboost_math_tr1f-vc140-mt-1_64.lib libboost_math_tr1l-vc140-mt-1_64.lib libboost_mpi-vc140-mt-1_64.lib libboost_numpy-vc140-mt-1_64.lib libboost_numpy3-vc140-mt-1_64.lib libboost_prg_exec_monitor-vc140-mt-1_64.lib libboost_program_options-vc140-mt-1_64.lib libboost_python-vc140-mt-1_64.lib libboost_python3-vc140-mt-1_64.lib libboost_random-vc140-mt-1_64.lib libboost_regex-vc140-mt-1_64.lib libboost_serialization-vc140-mt-1_64.lib libboost_signals-vc140-mt-1_64.lib libboost_system-vc140-mt-1_64.lib libboost_test_exec_monitor-vc140-mt-1_64.lib libboost_thread-vc140-mt-1_64.lib libboost_timer-vc140-mt-1_64.lib libboost_type_erasure-vc140-mt-1_64.lib libboost_unit_test_framework-vc140-mt-1_64.lib libboost_wave-vc140-mt-1_64.lib libboost_wserialization-vc140-mt-1_64.lib libboost_zlib-vc140-mt-1_64.lib flann.lib flann_cpp.lib flann_cpp_s.lib flann_s.lib OpenNI2.lib qhull.lib qhullcpp.lib qhullstatic.lib qhullstatic_r.lib qhull_p.lib qhull_r.lib vtkalglib-8.0.lib vtkChartsCore-8.0.lib vtkCommonColor-8.0.lib vtkCommonComputationalGeometry-8.0.lib vtkCommonCore-8.0.lib vtkCommonDataModel-8.0.lib vtkCommonExecutionModel-8.0.lib vtkCommonMath-8.0.lib vtkCommonMisc-8.0.lib vtkCommonSystem-8.0.lib vtkCommonTransforms-8.0.lib vtkDICOMParser-8.0.lib vtkDomainsChemistry-8.0.lib vtkexoIIc-8.0.lib vtkexpat-8.0.lib vtkFiltersAMR-8.0.lib vtkFiltersCore-8.0.lib vtkFiltersExtraction-8.0.lib vtkFiltersFlowPaths-8.0.lib vtkFiltersGeneral-8.0.lib vtkFiltersGeneric-8.0.lib vtkFiltersGeometry-8.0.lib vtkFiltersHybrid-8.0.lib vtkFiltersHyperTree-8.0.lib vtkFiltersImaging-8.0.lib vtkFiltersModeling-8.0.lib vtkFiltersParallel-8.0.lib vtkFiltersParallelImaging-8.0.lib vtkFiltersPoints-8.0.lib vtkFiltersProgrammable-8.0.lib vtkFiltersSelection-8.0.lib vtkFiltersSMP-8.0.lib vtkFiltersSources-8.0.lib vtkFiltersStatistics-8.0.lib vtkFiltersTexture-8.0.lib vtkFiltersTopology-8.0.lib vtkFiltersVerdict-8.0.lib vtkfreetype-8.0.lib vtkGeovisCore-8.0.lib vtkgl2ps-8.0.lib vtkhdf5-8.0.lib vtkhdf5_hl-8.0.lib vtkImagingColor-8.0.lib vtkImagingCore-8.0.lib vtkImagingFourier-8.0.lib vtkImagingGeneral-8.0.lib vtkImagingHybrid-8.0.lib vtkImagingMath-8.0.lib vtkImagingMorphological-8.0.lib vtkImagingSources-8.0.lib vtkImagingStatistics-8.0.lib vtkImagingStencil-8.0.lib vtkInfovisCore-8.0.lib vtkInfovisLayout-8.0.lib vtkInteractionImage-8.0.lib vtkInteractionStyle-8.0.lib vtkInteractionWidgets-8.0.lib vtkIOAMR-8.0.lib vtkIOCore-8.0.lib vtkIOEnSight-8.0.lib vtkIOExodus-8.0.lib vtkIOExport-8.0.lib vtkIOExportOpenGL-8.0.lib vtkIOGeometry-8.0.lib vtkIOImage-8.0.lib vtkIOImport-8.0.lib vtkIOInfovis-8.0.lib vtkIOLegacy-8.0.lib vtkIOLSDyna-8.0.lib vtkIOMINC-8.0.lib vtkIOMovie-8.0.lib vtkIONetCDF-8.0.lib vtkIOParallel-8.0.lib vtkIOParallelXML-8.0.lib vtkIOPLY-8.0.lib vtkIOSQL-8.0.lib vtkIOTecplotTable-8.0.lib vtkIOVideo-8.0.lib vtkIOXML-8.0.lib vtkIOXMLParser-8.0.lib vtkjpeg-8.0.lib vtkjsoncpp-8.0.lib vtklibharu-8.0.lib vtklibxml2-8.0.lib vtklz4-8.0.lib vtkmetaio-8.0.lib vtkNetCDF-8.0.lib vtknetcdf_c++.lib vtkoggtheora-8.0.lib vtkParallelCore-8.0.lib vtkpng-8.0.lib vtkproj4-8.0.lib vtkRenderingAnnotation-8.0.lib vtkRenderingContext2D-8.0.lib vtkRenderingContextOpenGL-8.0.lib vtkRenderingCore-8.0.lib vtkRenderingFreeType-8.0.lib vtkRenderingGL2PS-8.0.lib vtkRenderingImage-8.0.lib vtkRenderingLabel-8.0.lib vtkRenderingLIC-8.0.lib vtkRenderingLOD-8.0.lib vtkRenderingOpenGL-8.0.lib vtkRenderingVolume-8.0.lib vtkRenderingVolumeOpenGL-8.0.lib vtksqlite-8.0.lib vtksys-8.0.lib vtktiff-8.0.lib vtkverdict-8.0.lib vtkViewsContext2D-8.0.lib vtkViewsCore-8.0.lib vtkViewsInfovis-8.0.lib vtkzlib-8.0.lib????????在屬性頁窗口中選擇鏈接器->輸入,點擊右側的附加依賴項,向其中添加 .lib文件名 后點擊確定。
????????(如果配置的項目屬性為Debug調試項目,則Debug項目下的lib文件名參考如下所示)
3.2.4 PCL項目配置 預處理器定義
????????在屬性頁窗口中選擇C/C+±>預處理器,點擊右側的預處理器定義,向其中添加_CRT_SECURE_NO_WARNINGS;后點擊確定。
3.3 pcd文件簡介
????????PCD文件格式并不是為了重新發明輪子,而是為了補充現有的文件格式,這些文件格式由于某種原因不支持PCL為n維點云處理帶來的某些擴展。PCD不是第一個支持三維點云數據的文件類型。特別是計算機圖形學和計算幾何界,已經創建了許多格式來描述使用激光掃描儀獲取的任意多邊形和點云。點云數據文件(.pcd)下載:github、sourceforge
3.4 編寫C++PCL代碼
????????PCL點云可視化的C++代碼如下,將其復制到main.cpp源文件中即可運行。
#include<pcl/visualization/cloud_viewer.h> #include<iostream> #include<pcl/io/io.h> #include<pcl/io/pcd_io.h> #include<pcl/io/ply_io.h> #include<pcl/point_types.h>using namespace std; using namespace pcl;void viewerOneOff(visualization::PCLVisualizer& viewer) {viewer.setBackgroundColor(0, 0, 0); //設置背景顏色為黑色 }int main() {PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);char strfilepath[256] = "rabbit.pcd";if (-1 == io::loadPCDFile(strfilepath, *cloud)) {cout << "error input!" << endl;return -1;}cout << cloud->points.size() << endl;visualization::CloudViewer viewer("Cloud Viewer: Rabbit");viewer.showCloud(cloud);viewer.runOnVisualizationThreadOnce(viewerOneOff);system("pause");return 0; }3.5 運行結果(點云可視化)
3.5.1 附圖
????????利用下載的其他點云數據可視化后的部分結果如下圖所示。
總結
以上是生活随笔為你收集整理的PCL点云库安装及学习(2021.7.28)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于ZYNQ+AD936X的开源SDR硬
- 下一篇: cdo处理数据(自用笔记