最近由于工作需要处理相关点云数据,用于处理三维分析重建。三维点云数据处理技术包括以下几个方面:点云滤波(数据预处理)、点云关键点、特征和特征描述、点云配准、点云分割与分类、SLAM图优化、目标识别检索、变化检测、三维重建、点云数据管理等,相关的算法非常复杂。前期了解到网上有开源的点云处理库PointCloudLibrary(PCL),可以用于2D/3D图像和点云处理,PCL基于BSD开源协议,可以免费用于商业和研究用途。
PointCloud
PointCloudLibrary(PCL)库基于C++语言开发,前期同事下载了点云库,但是编译一直没通过,本着简单的原则看看有没有其他语言版本的,搜索github发现确实有其他语言的移植版本,如pclpy、pcl.py、pcl-java、PclSharp(c#)测试过后发现均不太理想(移植不太完整/示例缺乏/运行报错)
所以还是老老实实使用PCL吧,首先我们从github点云库PointCloudLibrary/pcl/releases根据自己操作系统版本下载最新的PCL安装文件:PCL-1.9.1-AllInOne-msvc-win64.exe、pcl-1.9.1-pdb-msvc-win64.zip。首先安装AllInOne-msvc,安装过程很简单直接下一步即可,安装过程中会弹出另外OpenNI的安装界面,建议安装在\3rdParty\OpenNI2目录下,当然安装在其他目录也是可以的。安装完毕后会自动创建环境变量,如果提示环境变量创建失败,则需要自己添加环境变量(总共8个),添加的环境变量如下图所示:
\PCL1.9.1\3rdParty\OpenNI2\Lib
\PCL1.9.1\3rdParty\OpenNI2\Redist
\PCL1.9.1\3rdParty\OpenNI2\Tools
\PCL1.9.1\bin\PCL1.9.1\3rdParty\Boost\lib
\PCL1.9.1\3rdParty\FLANN\bin
\PCL1.9.1\3rdParty\Qhull\bin
\PCL1.9.1\3rdParty\VTK\bin
更新path环境变量
安装完毕,环境变量确认无误后,解压pcl-1.9.1-pdb-msvc-win64.zip,将解压得到的pdb文件复制到PCL安装目录\PCL1.9.0\bin
打开VS/19新建C++空项目,我们在配置管理器里面新建配置,取名PCL1.9.1X64,平台选择X64,然后打开属性管理器选择我们刚才新建的PCL1.9.1X64,点击小扳手图标,对编译选项进行一些配置。
属性管理器
通用属性-VC++目录-包含目录增加以下项:D:\ProgramFiles\PCL1.9.1\include\pcl-1.9
D:\ProgramFiles\PCL1.9.1\3rdParty\Boost\include\boost-1_68
D:\ProgramFiles\PCL1.9.1\3rdParty\Eigen\eigen3
D:\ProgramFiles\PCL1.9.1\3rdParty\FLANN\include
D:\ProgramFiles\PCL1.9.1\3rdParty\Qhull\include
D:\ProgramFiles\PCL1.9.1\3rdParty\OpenNI2\Include
D:\ProgramFiles\PCL1.9.1\3rdParty\VTK\include\vtk-8.1
通用属性-VC++目录-库目录,增加以下项:D:\ProgramFiles\PCL1.9.1\lib
D:\ProgramFiles\PCL1.9.1\3rdParty\Boost\lib
D:\ProgramFiles\PCL1.9.1\3rdParty\FLANN\lib
D:\ProgramFiles\PCL1.9.1\3rdParty\OpenNI2\Lib
D:\ProgramFiles\PCL1.9.1\3rdParty\Qhull\lib
D:\ProgramFiles\PCL1.9.1\3rdParty\VTK\lib
C/C++-预处理器-预处理器定义中添加:
_CRT_SECURE_NO_WARNINGS
_SCL_SECURE_NO_WARNINGS
_SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING
用于去除编译警告
C/C++-所有选项-SDL检查改为否
通用属性-链接器-输入-附加的依赖项,主要是以下2个目录下的lib文件:
PCL1.9.0\PCL1.9.0\3rdParty\VTK\lib
PCL1.9.1\lib(只添加_release.lib结尾的lib)
然后百度搜索一个实例,发现正常编译运行,运行这个三角化示例如果编译提示:编译遇到pop_t找不到标志符的话,我们修改dist.h文件将typedefunsignedlonglongpop_t语句放置到#if__GNUC__之前即可。
运行示例