ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

最小限のPCL+OpenNIコード

最小限のPCLアプリケーションを作ってみます。

前述の通り、PCLにはOpenNIとSensorドライバがあらかじめ組み込まれているので、Xtion+OpenNIでやってみます。

こちらのサイトを参考にしてみました。

Visual Studio 2012でC++のコンソールアプリケーションを作ります。

まず設定の変更として、プロジェクトのプロパティから「全般|プラットフォーム ツールセット」を 「Visual Studio 2010(v100)」を選択します。これはOpenNIがVisual Studio 2010までしかサポートしていないためです。

続いてインクルードパスやライブラリの設定を行います。設定がたくさんあるので、プロパティファイルにまとめました(debugだけですが)。少し解説すると、PCLは 「C:\Program Files (x86)\PCL 1.6.0」に、OpenNIは「C:\Program Files (x86)\OpenNI」にそれぞれインストールされ、パスは環境変数「PCL_ROOT」または「OPEN_NI_INSTALL_PATH」に定義されます。OpenNIのインクルードおよびライブラリパスはそれぞれ「OPEN_NI_INCLUDE」および「OPEN_NI_LIB」に定義されています。

ほかにどこを参照しているかは、ファイルをのぞいてみてください。ファイルの場所は一番下に記載しています。

全体のコードは次のようになります。

#include <pcl/io/openni_grabber.h>

#include <pcl/visualization/cloud_viewer.h>

void main()

{

// viewerを作る

pcl::visualization::CloudViewer viewer( "OpenNI Viewer" );

// データ更新のコールバック関数

boost::function<void (const pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr&)> f =

[&viewer](const pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr &cloud) {

if (!viewer.wasStopped()) {

viewer.showCloud( cloud );

}

};

// OpenNIの入力を作る

pcl::Grabber* interface = new pcl::OpenNIGrabber();

interface->registerCallback( f );

interface->start();

while ( !viewer.wasStopped() ) {

Sleep( 0 );

}

interface->stop();

}

流れとしてはこんな感じです。これで点群表示ができるのはすごいですね。

  • ビューアーを作る
  • OpenNIの入力を作る
  • OpenNIのデータが更新されたときに呼ばれるコールバックを登録する
  • コールバック内で、ビューアーに点群を設定する

プロパティファイルを含めたプロジェクト全体はこちらに置いてあります。