robo8080のブログ

ロボット製作や電子工作など。

KinectをOpenNI+ARToolKitで動かしてみた。【その1.VC++プロジェクト作成編】

2010年12月15日 | OpenNI

 【注意】以下の手順は、私が試行錯誤で調べたものを、参考のためにまとめたものです。
      間違い勘違い等があるかもしれませんので、その場合はご了承ください。
      また、もっと簡単な方法があるかもしれません。

 【追記'10.12.16】"SamplesConfig.xml"をコピーする手順がもれていたので追記しました。

1.開発環境
 OS:Windows XP
 使用言語:C++(Visual C++ 2010 Express)
 ベースソフト:ARToolKit "ARToolKit-2.72.1-bin-win32.zip"
        :OpenNI      "OPENNI-Win32-1.0.0.23.exe"
        :NITE         "NITE-Win32-1.3.0.17.exe"
        :Driver       "avin2-SensorKinect-XXXXX.zip"

 ARToolKit、OpenNIのインストール方法は、いろいろな方がわかりやすく解説していますので省略します。
 また、Visual C++ 2010 Expressの使用方法もある程度知っているものとして説明します。
 わからない場合は、詳しく解説しているサイトがありますのでそちらを参照ください。

2.ファイルを準備する。
 ARToolKitをここからダウンロードします。
 OpenNIをここからダウンロードします。

 今回使用したのは、以下の4つです。
  ARToolKit-2.72.1-bin-win32.zip
  OPENNI-Win32-1.0.0.23.exe
  NITE-Win32-1.3.0.17.exe
  avin2-SensorKinect-XXXXX.zip

3.ARToolKitを適当なディレクトリに解凍する。
 ダウンロードしたファイルを適当なディレクトリに解凍します。
 この例では、C:\testに解凍するものとします。

 解凍すると次のようになります。
  C:\test\ARToolKit-2.72.1-bin-win32

4.ARToolKitとOpenNIの動作を確認する。
 (1)Visual C++ 2010 ExpressでARToolKitのソリューションを開きビルドします。
   C:\test\ARToolKit-2.72.1-bin-win32\ARToolKit.sln
 ソリューションを開くと変換しますかと聞いてくるので、変換を実行します。

 以降、説明を簡単にするため、ARToolKitの"simpleTest2"プロジェクトを改造して使用するものとします。

 (2)変換が終わったら、ソリューション構成をReleaseにして、ソリューションのビルドをします。
  (大量の"warning"が出ますが、とりあえず無視しても大丈夫のようです。)

  

 (3)USBカメラを接続してARToolKitが正常に動くのを確認します。
  C:\test\ARToolKit\bin\simpleTest2.exe
  "Esc"キーを押すと終了します。

  【注意】ARToolKitをDebugでビルドした"simpleTest2d.exe"はうまく動かないので
   以降、すべてReleaseでビルドするものとします。こんなダイアログが出ます。
   原因はいずれ調べようと思っていますが、Releaseで動くので当面放置してます。
  

  

 (4)OpenNIをインストールして、OpenNIのサンプルプログラムが正常に動くのを確認します。

  【注意】OpenNIのインストール方法と使い方は他の方が詳しく紹介していますので省略します。

5.ARToolKitプロジェクトにOpenNIライブラリを追加する。
 C:\test\ARToolKit-2.72.1-bin-win32\ARToolKit.slnを開きます。

 ソリューションエクスプローラで、SimpleTest2プロジェクト右クリック->プロパティ を選択します。
  構成プロパティ->リンカー->入力 を選択します。
 ”
追加の依存ファイル”に、"OpenNI.lib"を追加します。

6.ライブラリディレクトリを追加する。
 引き続き、構成プロパティ->C++->リンカー->全般 を選択します。
 ”
追加のライブラリディレクトリ”に、"$(OPEN_NI_LIB)"を追加します。

7.インクルードファイルディレクトリを追加する。
  引き続き、構成プロパティ->C++->全般 を選択します。
 ”追加のインクルードディレクトリ”に、"$(OPEN_NI_INCLUDE)"を追加します。

8.simpleTest2プロジェクトにファイルを追加する。
 "simpleTest2.c"を一旦プロジェクトから除外します。
 "simpleTest2.c"の拡張子をcppに変更し、"simpleTest2.cpp"を再度プロジェクトに追加します。

 以下の2つのファイルをプロジェクトに追加します。
  "knVideo.cpp"
  "knVideo.h"
 ファイルの詳細は【その2.サンプルプログラム編】を参照してください。

9.使用するインクルードファイルを変更する。
 "simpleTest2.cpp"の14行目付近にある
  #include
 をコメントアウトし、
  #include "knVideo.h"
 を追加します。

10."simpleTest2.cpp"の関数名を変更する。
 ここで一度ビルドします。

 ソリューション構成が"Release"になっていることを確認します。
 ソリューションエクスプローラ->SimpleTest2プロジェクト を右クリック  スタートアッププロジェクトに設定します。

 ソリューションエクスプローラ->SimpleTest2プロジェクト->ビルド
 そうすると、"arVideoXXX"という関数がエラーになるので、すべて"knVideoXXX"に変更します。

11.ビルド&実行
 【追記'10.12.16】
 まず、"C:\Program Files\OpenNI\Data\SamplesConfig.xml" を
 "C:\test\ARToolKit\bin\Data"へコピーしておきます。

 次に、ソリューション構成が"Release"になっていることを確認します。

  

 ソリューションエクスプローラ->SimpleTest2プロジェクト->ビルド でビルドが正常に終了したら、下記ファイルを実行します。
  C:\test\ARToolKit\bin\simpleTest2.exe


 うまくいけばこのようになるはずです。(使用したパターンは"pattHiro.pdf"です。)

  


 "simpleTest2.cpp"の86行目を以下のように変更すると、DepthカメラのDepthを色に変換した
 画像が表示されます。(ただし、この画像ではマーカの検出は出来ません。)

 変更前:
    /* grab a vide frame */
    if( (dataPtr = (ARUint8 *)knVideoGetImage()) == NULL ) {
        arUtilSleep(2);
        return;
    }

 変更後:
    /* grab a vide frame */
    if( (dataPtr = (ARUint8 *)knVideoGetImage()) == NULL ) {
        arUtilSleep(2);
        return;
    }
    dataPtr = (ARUint8 *)knVideoGetDepthColor();   //<---この行を追加

  【注意】knVideoGetDepthColor()関数を使うときは、先に"knVideoGetImage()"関数を実行しておく必要がある。

  

 また、上の例のknVideoGetDepthColor関数を、knVideoGetDepthImage関数に換えるとDepthとカメラ画像が重ねて表示されます。

 【注意】knVideoGetDepthImage()関数を使うときは、先に"knVideoGetImage()"関数を実行しておく必要がある。

 

---以上---


最新の画像もっと見る