I am Charmie

メモとログ

Point Cloud Library (PCL)

Point Cloud Library (PCL)のインストールとセットアップ for Windows

1. PCLのインストール
PCLのセットアップは2つの方法がある.プレビルド(あらかじめビルド)されたものをインストールするか,それとも自分でソースからコンパイルするか.プレビルド版はLinux, Windows, Mac OS Xの3種類が提供されているようだけど,自分が試したのはWindows+Visual Studio2010のものだけなので,それ以外のプラットフォームでのセットアップに関しては良くわからんです.

PCLは単体では動かず,イクツカノ3rd partyのライブラリやらを必要としている.バージョン1.3.0からは,All-In-Oneインストーラーなる,一つのインストーラで外部依存のライブラリから全てインストールをしてくれるインストーラが提供されているので,それを使うと非常に楽.
大半の外部依存系のライブラリは,CMakeを使ってコンパイルすればいいのだけど(1.2.0は自分でコンパイルしてみた),バージョンアップのためにアンインストールする時に苦労したので,特別な理由がないのであれば,All-In-Oneインストーラを使った方がよさそう.

環境変数にPCLとOpenNIのバイナリへのパスを設定しなければいけない.以下は,自分のマシン上での設定なので,最初の部分(C:\PCLやC:\PCL\3rdParty\OpenNI\OpenNI)は自分のマシンの設定によって変える必要がある.

  • C:\PCL\bin
  • C:\PCL\3rdParty\OpenNI\OpenNI\Bin (64bitの場合はC:\PCL\3rdParty\OpenNI\OpenNI\Bin64)
2. Visual Studioの設定
Visual Studioガリガリ実装していくわけだけど,いくつか設定が必要なので,忘れないようにメモ.
2.1. プロジェクトの設定
2.1.1. マルチバイト文字
"構成プロパティ > 文字セット" を マルチバイト文字を使用するに変更.
Change "Configuration Properties > Character Set" to Use Multi-Byte Character Set.
2.1.2. ヘッダファイルの参照ディレクト
includeするヘッダファイルが保存されているディレクトリを指定すると,ソースコードで.hファイルをincludeする時に楽.具体的には以下のような感じ.
参照ディレクトリ設定なし: #include
参照ディレクトリ設定あり: #include
PCLそのものと,外部依存系の全てのディレクトリを書くけど,必要最低限のディレクトリを参照するだけで十分.
バージョン1.3.0から,デバッグ用,リリース用同一ディレクトリ内にファイルが保存されているため,
"構成" を 全ての構成 にして一括設定できる.
Change "Configuration" to All Configurations, so that you can set both Debug and Release configurations simultaneously.
  • C:\PCL\include\pcl-1.3
  • C:\PCL\3rdParty\Boost\include
  • C:\PCL\3rdParty\Eigen\include
  • C:\PCL\3rdParty\flann\include
  • C:\PCL\3rdParty\qhull\include\libqhullcpp
  • C:\PCL\3rdParty\VTK 5.8.0\include\vtk-5.8
  • C:\PCL\3rdParty\OpenNI\OpenNI\Include
2.1.3. ライブラリファイルの参照ディレクト
ヘッダファイルと同様に,ライブラリファイルについてもが保存されているディレクトリを指定した方が楽.ライブラリファイルもDebug/Releaseで同一ディレクトリを指定すればいいので,全ての構成(All Configurations)を選択して一括設定をする.
  • C:\PCL\lib
  • C:\PCL\3rdParty\flann\lib
  • C:\PCL\3rdParty\Boost\lib
  • C:\PCL\3rdParty\qhull\lib
  • C:\PCL\3rdParty\VTK 5.8.0\lib\vtk-5.8
  • C:\PCL\3rdParty\OpenNI\OpenNI\Lib (64bitの場合 C:\PCL\3rdParty\OpenNI\OpenNI\Lib)
2.2. ライブラリファイル
実際に使用するライブラリファイルの指定は,"構成プロパティ > リンカ > 全般 > 追加の依存ファイル"にて指定する方法と,ソースコードで指定する方法の二つがある.以下は,ソースコードで指定する時の書き方の例.
#ifdef _DEBUG
// PCL library
#pragma comment(lib,"pcl_common-gd.lib")
#pragma comment(lib,"pcl_features-gd.lib")
#pragma comment(lib,"pcl_filters-gd.lib")
#pragma comment(lib,"pcl_io-gd.lib")
#pragma comment(lib,"pcl_kdtree-gd.lib")
#pragma comment(lib,"pcl_keypoints-gd.lib")
#pragma comment(lib,"pcl_octree-gd.lib")
#pragma comment(lib,"pcl_range_image-gd.lib")
#pragma comment(lib,"pcl_range_image_border_extractor-gd.lib")
#pragma comment(lib,"pcl_registration-gd.lib")
#pragma comment(lib,"pcl_sample_consensus-gd.lib")
#pragma comment(lib,"pcl_segmentation-gd.lib")
#pragma comment(lib,"pcl_search-gd.lib")
#pragma comment(lib,"pcl_surface-gd.lib")
#pragma comment(lib,"pcl_visualization-gd.lib")
// FLANN library
#pragma comment(lib,"flann-gd.lib")
#pragma comment(lib,"flann_s-gd.lib")
#pragma comment(lib,"flann_cpp-gd.lib")
#pragma comment(lib,"flann_cpp_s-gd.lib")
// QHull library
#pragma comment(lib,"qhull6_d.lib")
#pragma comment(lib,"qhullcpp_d.lib")
#pragma comment(lib,"qhullstatic_d.lib")
#pragma comment(lib,"qhullstatic_p_d.lib")
// VTK library
#pragma comment(lib,"MapReduceMPI-gd.lib")
#pragma comment(lib,"mpistubs-gd.lib")
#pragma comment(lib,"vtkalglib-gd.lib")
#pragma comment(lib,"vtkCharts-gd.lib")
#pragma comment(lib,"vtkCommon-gd.lib")
#pragma comment(lib,"vtkDICOMParser-gd.lib")
#pragma comment(lib,"vtkexoIIc-gd.lib")
#pragma comment(lib,"vtkexpat-gd.lib")
#pragma comment(lib,"vtkFiltering-gd.lib")
#pragma comment(lib,"vtkfreetype-gd.lib")
#pragma comment(lib,"vtkftgl-gd.lib")
#pragma comment(lib,"vtkGenericFiltering-gd.lib")
#pragma comment(lib,"vtkGeovis-gd.lib")
#pragma comment(lib,"vtkGraphics-gd.lib")
#pragma comment(lib,"vtkHybrid-gd.lib")
#pragma comment(lib,"vtkImaging-gd.lib")
#pragma comment(lib,"vtkInfovis-gd.lib")
#pragma comment(lib,"vtkIO-gd.lib")
#pragma comment(lib,"vtkjpeg-gd.lib")
#pragma comment(lib,"vtklibxml2-gd.lib")
#pragma comment(lib,"vtkmetaio-gd.lib")
#pragma comment(lib,"vtkNetCDF-gd.lib")
#pragma comment(lib,"vtkNetCDF_cxx-gd.lib")
#pragma comment(lib,"vtkpng-gd.lib")
#pragma comment(lib,"vtkproj4-gd.lib")
#pragma comment(lib,"vtkRendering-gd.lib")
#pragma comment(lib,"vtksqlite-gd.lib")
#pragma comment(lib,"vtksys-gd.lib")
#pragma comment(lib,"vtktiff-gd.lib")
#pragma comment(lib,"vtkverdict-gd.lib")
#pragma comment(lib,"vtkViews-gd.lib")
#pragma comment(lib,"vtkVolumeRendering-gd.lib")
#pragma comment(lib,"vtkWidgets-gd.lib")
#pragma comment(lib,"vtkzlib-gd.lib")

//
#pragma comment(lib,"opengl32.lib")
// OpenNI library
#pragma comment(lib,"openNI.lib")
#pragma comment(lib,"OpenNI.jni.lib")
#pragma comment(lib,"NiSampleModule.lib")
#pragma comment(lib,"NiSampleExtensionModule.lib")
#else
// PCL library
#pragma comment(lib,"pcl_common.lib")
#pragma comment(lib,"pcl_features.lib")
#pragma comment(lib,"pcl_filters.lib")
#pragma comment(lib,"pcl_io.lib")
#pragma comment(lib,"pcl_kdtree.lib")
#pragma comment(lib,"pcl_keypoints.lib")
#pragma comment(lib,"pcl_octree.lib")
#pragma comment(lib,"pcl_range_image.lib")
#pragma comment(lib,"pcl_range_image_border_extractor.lib")
#pragma comment(lib,"pcl_registration.lib")
#pragma comment(lib,"pcl_sample_consensus.lib")
#pragma comment(lib,"pcl_segmentation.lib")
#pragma comment(lib,"pcl_search.lib")
#pragma comment(lib,"pcl_surface.lib")
#pragma comment(lib,"pcl_visualization.lib")
// FLANN library
#pragma comment(lib,"flann.lib")
#pragma comment(lib,"flann_s.lib")
#pragma comment(lib,"flann_cpp.lib")
#pragma comment(lib,"flann_cpp_s.lib")
// QHull library
#pragma comment(lib,"qhull6.lib")
#pragma comment(lib,"qhullcpp.lib")
#pragma comment(lib,"qhullstatic.lib")
#pragma comment(lib,"qhullstatic_p.lib")
// VTK library
#pragma comment(lib,"MapReduceMPI.lib")
#pragma comment(lib,"mpistubs.lib")
#pragma comment(lib,"vtkalglib.lib")
#pragma comment(lib,"vtkCharts.lib")
#pragma comment(lib,"vtkCommon.lib")
#pragma comment(lib,"vtkDICOMParser.lib")
#pragma comment(lib,"vtkexoIIc.lib")
#pragma comment(lib,"vtkexpat.lib")
#pragma comment(lib,"vtkFiltering.lib")
#pragma comment(lib,"vtkfreetype.lib")
#pragma comment(lib,"vtkftgl.lib")
#pragma comment(lib,"vtkGenericFiltering.lib")
#pragma comment(lib,"vtkGeovis.lib")
#pragma comment(lib,"vtkGraphics.lib")
#pragma comment(lib,"vtkHybrid.lib")
#pragma comment(lib,"vtkImaging.lib")
#pragma comment(lib,"vtkInfovis.lib")
#pragma comment(lib,"vtkIO.lib")
#pragma comment(lib,"vtkjpeg.lib")
#pragma comment(lib,"vtklibxml2.lib")
#pragma comment(lib,"vtkmetaio.lib")
#pragma comment(lib,"vtkNetCDF.lib")
#pragma comment(lib,"vtkNetCDF_cxx.lib")
#pragma comment(lib,"vtkpng.lib")
#pragma comment(lib,"vtkproj4.lib")
#pragma comment(lib,"vtkRendering.lib")
#pragma comment(lib,"vtksqlite.lib")
#pragma comment(lib,"vtksys.lib")
#pragma comment(lib,"vtktiff.lib")
#pragma comment(lib,"vtkverdict.lib")
#pragma comment(lib,"vtkViews.lib")
#pragma comment(lib,"vtkVolumeRendering.lib")
#pragma comment(lib,"vtkWidgets.lib")
#pragma comment(lib,"vtkzlib.lib")
//
#pragma comment(lib,"opengl32.lib")
// OpenNI library
#pragma comment(lib,"openNI.lib")
#pragma comment(lib,"OpenNI.jni.lib")
#pragma comment(lib,"NiSampleModule.lib")
#pragma comment(lib,"NiSampleExtensionModule.lib")
#endif

2.3. インクルードするヘッダファイル
ヘッダファイルは,使い関数を必要なヘッダファイルをインクルードすればいい.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include