3D開源點庫(PointCloud Library)介紹
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等模組,
為了使用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;
}
執行結果如下圖: