1. 程式人生 > >3D開源點庫(PointCloud Library)介紹

3D開源點庫(PointCloud Library)介紹

          Point Clouds Library (PCL) 是由Radu Bogdan等人開發的一個開源專案,其最初的動機是專注於點雲感知的應用,並整合大量高階的用語3D感知的方法,適用於3 Building Blcoks,這個庫實現的演算法包括:Filtering, feature estimation, surface reconstruction, registration, model fitting and segmentation. PCL庫還支援ROS(Robot operating system).

         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.lib

Release: 
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;

}

          執行結果如下圖: