一、下載PCL1.9.1
Github下載地址:https://github.com/PointCloudLibrary/pcl/releases
下載紅框內(nèi)的兩個(gè)文件

Github下載速度看人品。
二、安裝
2.1 安裝“PCL-1.9.1-AllInOne-msvc2017-win64.exe”。
(1)選擇第二個(gè),自動(dòng)添加系統(tǒng)變量

(2)安裝路徑選擇D盤,系統(tǒng)會(huì)自動(dòng)新建PCL 1.9.1文件夾。

2.2 安裝過程中需要安裝OpenNI,選擇路徑(D:\PCL 1.9.1\3rdParty\OpenNI2)安裝即可。

2.3 全部安裝完成后,將pcl-1.9.1-pdb-msvc2017-win64.zip解壓后的.pdb文件拷貝到(D:\PCL 1.9.1\bin)中。
2.4 設(shè)置環(huán)境變量:右擊計(jì)算機(jī)—屬性—高級(jí)系統(tǒng)設(shè)置—高級(jí)—環(huán)境變量—用戶變量—Path—編輯!

如下圖所示,設(shè)置完成后重啟電腦。

在這里直接給出,防止出現(xiàn)錯(cuò)誤(依次添加):
%PCL_ROOT%\3rdParty\FLANN\bin
%PCL_ROOT%\3rdParty\VTK\bin
%OPENNI2_REDIST64%
%OPENNI2_LIB64%
%OPENNI2_INCLUDE64%
到此,環(huán)境變量的配置完成。
三、配置
3.1 新建空項(xiàng)目,

解決方案配置選擇Debug,解決方案平臺(tái)選擇x64。

3.2? 右擊工程—屬性—VC++目錄—包含目錄,添加7個(gè)include路徑

具體添加的include路徑如下:
D:\PCL 1.9.1\include\pcl-1.9
D:\PCL 1.9.1\3rdParty\Boost\include\boost-1_68
D:\PCL 1.9.1\3rdParty\Eigen\eigen3
D:\PCL 1.9.1\3rdParty\FLANN\include
D:\PCL 1.9.1\3rdParty\Qhull\include
D:\PCL 1.9.1\3rdParty\VTK\include\vtk-8.1
D:\PCL 1.9.1\3rdParty\OpenNI2\Include
3.3 VC++目錄—包含目錄,添加6個(gè)lib路徑

具體添加的lib路徑如下:
D:\PCL 1.9.1\lib
D:\PCL 1.9.1\3rdParty\Boost\lib
D:\PCL 1.9.1\3rdParty\FLANN\lib
D:\PCL 1.9.1\3rdParty\Qhull\lib
D:\PCL 1.9.1\3rdParty\OpenNI2\Lib
D:\PCL 1.9.1\3rdParty\VTK\lib
3.4 C/C++—常規(guī)—SDL檢查—否
此處可能會(huì)出現(xiàn)找不到 **C/C++** 選項(xiàng)的情況,解決方案為:

新建一個(gè)C++源文件之后,再打開屬性頁就可用看到C/C++選項(xiàng)。

3.5 C/C++—預(yù)處理器—預(yù)處理器定義—添加:
_CRT_SECURE_NO_WARNINGS
_SCL_SECURE_NO_WARNINGS
_SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING

3.6 配置屬性—調(diào)試—環(huán)境—添加:
PATH=D:\PCL1.9.1\\bin;D:\PCL1.9.1\\3rdParty\FLANN\bin;D:\PCL1.9.1\\3rdParty\VTK\bin;D:\PCL 1.9.1\\3rdParty\OpenNI2\Tools

3.7 鏈接器—輸入—附加依賴項(xiàng)——添加PCL和VTK的相關(guān)lib文件。我用的Debug版本。

附加依賴項(xiàng)具體添加內(nèi)容如下:
輸入到屬性表里邊的時(shí)候必須一行對(duì)應(yīng)一個(gè)lib才能成功。
Debug版本
pcl_common_debug.lib
pcl_features_debug.lib
pcl_filters_debug.lib
pcl_io_debug.lib
pcl_io_ply_release.lib
pcl_kdtree_debug.lib
pcl_keypoints_debug.lib
pcl_ml_debug.lib
pcl_octree_debug.lib
pcl_outofcore_debug.lib
pcl_people_debug.lib
pcl_recognition_debug.lib
pcl_registration_debug.lib
pcl_sample_consensus_debug.lib
pcl_search_debug.lib
pcl_segmentation_debug.lib
pcl_stereo_debug.lib
pcl_surface_debug.lib
pcl_tracking_debug.lib
pcl_visualization_debug.lib
vtkalglib-8.1-gd.lib
vtkChartsCore-8.1-gd.lib
vtkCommonColor-8.1-gd.lib
vtkCommonComputationalGeometry-8.1-gd.lib
vtkCommonCore-8.1-gd.lib
vtkCommonDataModel-8.1-gd.lib
vtkCommonExecutionModel-8.1-gd.lib
vtkCommonMath-8.1-gd.lib
vtkCommonMisc-8.1-gd.lib
vtkCommonSystem-8.1-gd.lib
vtkCommonTransforms-8.1-gd.lib
vtkDICOMParser-8.1-gd.lib
vtkDomainsChemistry-8.1-gd.lib
vtkexoIIc-8.1-gd.lib
vtkexpat-8.1-gd.lib
vtkFiltersAMR-8.1-gd.lib
vtkFiltersCore-8.1-gd.lib
vtkFiltersExtraction-8.1-gd.lib
vtkFiltersFlowPaths-8.1-gd.lib
vtkFiltersGeneral-8.1-gd.lib
vtkFiltersGeneric-8.1-gd.lib
vtkFiltersGeometry-8.1-gd.lib
vtkFiltersHybrid-8.1-gd.lib
vtkFiltersHyperTree-8.1-gd.lib
vtkFiltersImaging-8.1-gd.lib
vtkFiltersModeling-8.1-gd.lib
vtkFiltersParallel-8.1-gd.lib
vtkFiltersParallelImaging-8.1-gd.lib
vtkFiltersPoints-8.1-gd.lib
vtkFiltersProgrammable-8.1-gd.lib
vtkFiltersSelection-8.1-gd.lib
vtkFiltersSMP-8.1-gd.lib
vtkFiltersSources-8.1-gd.lib
vtkFiltersStatistics-8.1-gd.lib
vtkFiltersTexture-8.1-gd.lib
vtkFiltersTopology-8.1-gd.lib
vtkFiltersVerdict-8.1-gd.lib
vtkfreetype-8.1-gd.lib
vtkGeovisCore-8.1-gd.lib
vtkgl2ps-8.1-gd.lib
vtkhdf5-8.1-gd.lib
vtkhdf5_hl-8.1-gd.lib
vtkImagingColor-8.1-gd.lib
vtkImagingCore-8.1-gd.lib
vtkImagingFourier-8.1-gd.lib
vtkImagingGeneral-8.1-gd.lib
vtkImagingHybrid-8.1-gd.lib
vtkImagingMath-8.1-gd.lib
vtkImagingMorphological-8.1-gd.lib
vtkImagingSources-8.1-gd.lib
vtkImagingStatistics-8.1-gd.lib
vtkImagingStencil-8.1-gd.lib
vtkInfovisCore-8.1-gd.lib
vtkInfovisLayout-8.1-gd.lib
vtkInteractionImage-8.1-gd.lib
vtkInteractionStyle-8.1-gd.lib
vtkInteractionWidgets-8.1-gd.lib
vtkIOAMR-8.1-gd.lib
vtkIOCore-8.1-gd.lib
vtkIOEnSight-8.1-gd.lib
vtkIOExodus-8.1-gd.lib
vtkIOExport-8.1-gd.lib
vtkIOExportOpenGL-8.1-gd.lib
vtkIOGeometry-8.1-gd.lib
vtkIOImage-8.1-gd.lib
vtkIOImport-8.1-gd.lib
vtkIOInfovis-8.1-gd.lib
vtkIOLegacy-8.1-gd.lib
vtkIOLSDyna-8.1-gd.lib
vtkIOMINC-8.1-gd.lib
vtkIOMovie-8.1-gd.lib
vtkIONetCDF-8.1-gd.lib
vtkIOParallel-8.1-gd.lib
vtkIOParallelXML-8.1-gd.lib
vtkIOPLY-8.1-gd.lib
vtkIOSQL-8.1-gd.lib
vtkIOTecplotTable-8.1-gd.lib
vtkIOVideo-8.1-gd.lib
vtkIOXML-8.1-gd.lib
vtkIOXMLParser-8.1-gd.lib
vtkjpeg-8.1-gd.lib
vtkjsoncpp-8.1-gd.lib
vtklibharu-8.1-gd.lib
vtklibxml2-8.1-gd.lib
vtklz4-8.1-gd.lib
vtkmetaio-8.1-gd.lib
vtkNetCDF-8.1-gd.lib
vtknetcdfcpp-8.1-gd.lib
vtkoggtheora-8.1-gd.lib
vtkParallelCore-8.1-gd.lib
vtkpng-8.1-gd.lib
vtkproj4-8.1-gd.lib
vtkRenderingAnnotation-8.1-gd.lib
vtkRenderingContext2D-8.1-gd.lib
vtkRenderingContextOpenGL-8.1-gd.lib
vtkRenderingCore-8.1-gd.lib
vtkRenderingFreeType-8.1-gd.lib
vtkRenderingGL2PS-8.1-gd.lib
vtkRenderingImage-8.1-gd.lib
vtkRenderingLabel-8.1-gd.lib
vtkRenderingLIC-8.1-gd.lib
vtkRenderingLOD-8.1-gd.lib
vtkRenderingOpenGL-8.1-gd.lib
vtkRenderingVolume-8.1-gd.lib
vtkRenderingVolumeOpenGL-8.1-gd.lib
vtksqlite-8.1-gd.lib
vtksys-8.1-gd.lib
vtktiff-8.1-gd.lib
vtkverdict-8.1-gd.lib
vtkViewsContext2D-8.1-gd.lib
vtkViewsCore-8.1-gd.lib
vtkViewsInfovis-8.1-gd.lib
vtkzlib-8.1-gd.lib
四、測(cè)試
示例代碼
#include <iostream>
#include <vector>
#include <ctime>
#include <pcl/point_cloud.h>
#include <pcl/octree/octree.h>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
int
main(int argc, char**argv)
{
srand((unsigned int)time(NULL));
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 創(chuàng)建點(diǎn)云數(shù)據(jù)
cloud->width = 1000;
cloud->height = 1;
cloud->points.resize(cloud->width * cloud->height);
for (size_t i = 0; i < cloud->points.size(); ++i)
{
cloud->points[i].x = 1024.0f* rand() / (RAND_MAX + 1.0f);
cloud->points[i].y = 1024.0f* rand() / (RAND_MAX + 1.0f);
cloud->points[i].z = 1024.0f* rand() / (RAND_MAX + 1.0f);
}
float resolution = 128.0f;
pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree(resolution);
octree.setInputCloud(cloud);
octree.addPointsFromInputCloud();
pcl::PointXYZ searchPoint;
searchPoint.x = 1024.0f* rand() / (RAND_MAX + 1.0f);
searchPoint.y = 1024.0f* rand() / (RAND_MAX + 1.0f);
searchPoint.z = 1024.0f* rand() / (RAND_MAX + 1.0f);
// 體素內(nèi)近鄰搜索
vector<int>pointIdxVec;
if (octree.voxelSearch(searchPoint, pointIdxVec))
{
cout << "Neighbors within voxel search at (" << searchPoint.x
<< " " << searchPoint.y << " " << searchPoint.z << ")" << endl;
for (size_t i = 0; i < pointIdxVec.size(); ++i)
std::cout << "? ? " << cloud->points[pointIdxVec[i]].x
<< " " << cloud->points[pointIdxVec[i]].y
<< " " << cloud->points[pointIdxVec[i]].z << std::endl;
}
//K近鄰搜索
int K = 10;
vector<int>pointIdxNKNSearch;
vector<float>pointNKNSquaredDistance;
cout << "K nearest neighbor search at (" << searchPoint.x
<< " " << searchPoint.y << " " << searchPoint.z << ") with K=" << K << endl;
if (octree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)
{
for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i)
cout << "? ? " << cloud->points[pointIdxNKNSearch[i]].x << " "
<< cloud->points[pointIdxNKNSearch[i]].y
<< " " << cloud->points[pointIdxNKNSearch[i]].z
<< " (squared distance: " << pointNKNSquaredDistance[i] << ")" << endl;
}
//半徑內(nèi)近鄰搜索
vector<int>pointIdxRadiusSearch;
vector<float>pointRadiusSquaredDistance;
float radius = 256.0f* rand() / (RAND_MAX + 1.0f);
cout << "Neighbors within radius search at (" << searchPoint.x
<< " " << searchPoint.y
<< " " << searchPoint.z
<< ") with radius=" << radius << endl;
if (octree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
{
for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i)
cout << "? ? " << cloud->points[pointIdxRadiusSearch[i]].x
<< " " << cloud->points[pointIdxRadiusSearch[i]].y
<< " " << cloud->points[pointIdxRadiusSearch[i]].z
<< " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << endl;
}
// 初始化點(diǎn)云可視化對(duì)象
boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("顯示點(diǎn)云"));
viewer->setBackgroundColor(0, 0, 0);? //設(shè)置背景顏色為黑色
// 對(duì)點(diǎn)云著色可視化 (red).
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>target_color(cloud, 255, 0, 0);
viewer->addPointCloud<pcl::PointXYZ>(cloud, target_color, "target cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "target cloud");
// 啟動(dòng)可視化
//viewer->addCoordinateSystem(0.1);? //顯示XYZ指示軸
//viewer->initCameraParameters();? //初始化攝像頭參數(shù)
// 等待直到可視化窗口關(guān)閉
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(1000));
}
return (0);
}
五、可能報(bào)錯(cuò)及解決方案
1、添加頭文件``#include <pcl/registration/icp.h>``編譯的時(shí)候可能會(huì)遇到如下報(bào)錯(cuò):`1>...\flann\algorithms\dist.h(523): error C3861: “pop_t”: 找不到標(biāo)識(shí)符`
解決方法:
雙擊該行輸出直接打開`dist.h`頭文件,將第503行的`typedef unsigned long long pop_t;`移動(dòng)到第480行前面(如下圖);

2、可能出現(xiàn)如下情況:

解決方法:

3、其他錯(cuò)誤情況目前沒有
五、結(jié)果
會(huì)出現(xiàn)如下結(jié)果,輸出的是渲染信息,關(guān)掉即可,沒什么用。



至此,PCL1.9.1配置完成!!!!!該版本的PCL點(diǎn)云庫兼容VisualStudio2019,配置方法完全相同。