PCL库是一个采用模版化的现代c++语言实现,并在底层充分利用了SSE优化指令,算法中采用了大量的开源库,包括Eigen(一个用于线性代数的开源模版化库)、OPenMP(可以参考网站:http://openmp.org)、Intel公司开发的用于多核并行运算的TBB库(Threading Building Blocks)、以及FLANN(Fast K-Nearest for Approximate Nearest Neighbors),除此以外,在三维展示方面,PCL库引入了VTK(Visualization Toolkit)。
PCL设计的时候考虑到了开发的简单和方便性,将这些函数库分别分成更小的块进行编译,主要包括如下模块:
(1)libpcl_filters:实现数据滤波,如向下降采样、异常数据处理、indices extraction,投影等。
(2)libpcl_feature: 该库包含大量的3D特征,如surface normals, curvatures, boundary point estimation, moment invariants, principal curvatures, PFH 和FPFH descriptors, RIFT, RSD, VFH, SIFHT等。
(3)libpcl_io:主要用于输入输出。
(4)libpcl_segmentation:实现cluster extraction, model fitting, polygonal prism extraction.
另外,还包括Libpcl_surface, libpcl_registration, libpcl_keypoints, libpcl_range_image等模块,更多信息请参考官网:http://www.pointclouds.org/。
为了使用PCL,首先需要下载库,通过官网下载对应的版本,选择ALL-IN-ONE的安装包,该包包含了PCL中所使用的全部第三方编译包。下载完成后直接安装,路径可以根据自己的需要进行安装。安装完成后:将对应的库文件添加到环境变量中(如果要用到第三方的库,则要将第三方的库文件也添加到环境变量中):
接着,在开发环境IDE中添加对应的路径,本文是在VS2008中,“工具---选项--项目与解决方案”:
1) 可执行文件bin的配置
2) 包含文件include的配置
3)库文件lib的配置
特别提示,上面的配置只是举例,开发人员在配置的时候,一定要将所有的对应文件都进行配置,即包括PCL库和所有的第三方的库的对应文件的配置。
下面是一个简单的使用PCL库的例子(在项目属性的附加依赖性里添加使用的lib文件,如果不知道是哪个lib文件,则将所有的lib文件都添加进行),包括:
debug:
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_range_image_border_extractor_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.libRelease:
pcl_apps_release.lib
pcl_common_release.lib
pcl_features_release.lib
pcl_filters_release.lib
pcl_io_release.lib
pcl_io_ply_release.lib
pcl_kdtree_release.lib
pcl_keypoints_release.lib
pcl_octree_release.lib
pcl_range_image_border_extractor_release.lib
pcl_registration_release.lib
pcl_sample_consensus_release.lib
pcl_search_release.lib
pcl_segmentation_release.lib
pcl_surface_release.lib
pcl_tracking_release.lib
pcl_visualization_release.lib
程序代码如下:
#include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> using namespace std; int main( int argc, char* argv[]) { pcl::PointCloud<pcl::PointXYZ> cloud; cloud.width = 5; cloud.height = 1; cloud.is_dense = false; cloud.points.resize(cloud.height*cloud.width); for ( size_t i=0; i<cloud.points.size(); ++i ) { cloud.points[i].x = 1024* rand()/(RAND_MAX+1.0f); cloud.points[i].y = 1024* rand()/(RAND_MAX+1.0f); cloud.points[i].z = 1024* rand()/(RAND_MAX+1.0f); } pcl::io::savePCDFileASCII("test_pcd.pcd",cloud); std::cerr<<"Saved"<< cloud.points.size()<<" data points to test_pcd.pcd."<<std::endl; for ( size_t i=0; i<cloud.points.size(); ++i ) { std::cerr<<" cloud.points[i].x "<<cloud.points[i].x<<endl<<" cloud.points[i].yx "<<cloud.points[i].y<<endl<<" cloud.points[i].z "<<cloud.points[i].z<<endl; } char c= (char)getchar(); return 1; }
执行结果如下图: