Kinect

概要
特定のパターンを投影し三角測量の原理で距離画像を取得するセンサ
図.20 kinect
図.20 kinect
目次

Linux

kinectで遊んでみる(インストール編)

ここではkinectを動かすために必要なOpenNI,NITEなどのインストール方法について述べる. やることは以下の4点.

注意:OSはUbuntu10.04で下記の方法で動作を確認しましたが,バージョンなどが違うと動作しないかもしれません.

  • 必要なライブラリのインストール
  • OpenNIのインストール
  • kinectドライバのインストール
  • NITEのインストール

1.必要なライブラリのインストール

$sudo apt-get install git-core cmake libglut3-dev pkg-config build-essential libxmu-dev libxi-dev libusb-1.0-0-dev doxygen graphviz

2.OpenNIのインストール

http://www.openni.org/downloadfiles/openni-binaries/21-stable からパッケージをダウンロードし,展開する.

$tar -xf ダウンロードしたファイル名

展開したらインストールする.

$sudo ./install.sh

3.kinectドライバーのインストール

https://github.com/avin2/SensorKinect/tree/master からパッケージをダウンロードし,1と同様に展開する. 後はREADMEに従ってインストールする.

$cd Platform/Linux-x86/CreateRedist/
$./RedistMaker
$cd ../Redist/
$sudo ./install.sh

4.NITEのインストール

http://www.openni.org/downloadfiles/openni-compliant-middleware-binaries/34-stable からパッケージをダウンロードし,今までと同様に展開する.展開したら,Dataフォルダ内にある3つのxmlファイル(Sample-User.xml,Sample-Scene.xml,Sample-Tracking.xml)のライセンスを書き換える. ただし,最初は書き込み権限がないはずなので権限を変更する.

$chmod 644 Data/*.xml

そして3つとも3行目を

<License vendor="PrimeSense" key="0KOIk2JeIBYClPWVnMoRKn5cdY4="/>

と書き換える.変更が完了したらインストールする.

$sudo ./install.sh

kinectで遊んでみる(動作確認編)

インストールしたNITEにサンプルプログラムがあるので,それらで動作確認できる.

$cd Samples/Bin/

下図はサンプルの中のSample-Playersを実行した結果で,人間の骨格をトラッキングできるようである.

図.21 スケルトントラッキング
図.21 スケルトントラッキング

Windows

Visual Studio で Kinect SDK を用いてスケルトンを取得する方法について解説する.使用言語は C++.
This page introduces the way to detect a skeleton by using Kinect SDK with Visual Studio.

このページの内容を参考にした.
Reference: this page.

準備 / Preparation

  • Visual Studio は各自で用意.
    Install Visual Studio by yourself.
  • 試しに,インストールしたディレクトリ (e.g. C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2) 以下にあるC++のサンプル (e.g. C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2\Samples\KinectSDKSamples.zip\Unmanaged\SkeletalViewer) を Visual Studio でコンパイルしてみて,ちゃんと実行までできるか確認しておく.
    Try to compile a sample (e.g. C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2\Samples\KinectSDKSamples.zip\Unmanaged\SkeletalViewer) and check if it is executable.
    • このディレクトリ以下のファイル一式を適当なディレクトリにコピーし,SkeletalViewer.sln を Visual Studio で起動.
      Copy every files in this directory into your directory, and open SkeletalViewer.sln with Visual Studio.
    • ソリューションエクスプローラで SkeletalViewer のプロパティを開き,C/C++ の全般で「追加のインストールディレクトリ」に C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2\inc を追加.
      Open the property of SkeletalViewer in Solution Explorer, and in a C/C++ tab add C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2\inc into the additional include directories.
    • 同じく,リンカの全般で「追加のライブラリディレクトリ」に C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2\lib\x86 を追加.
      Similarly, in a linker tab, add C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2\lib\x86 into the additional library directories.
    • ビルドして Kinect をつなぎ,実行すれば,カメラ画像,デプス,スケルトンが取得されるはず.
      Build, then connect a Kinect and execute the program, you can see that the program can observe a camera image, a depth image, and a skeleton.

スケルトン取得プログラム / Program to Get Skeleton

  • Visual Studio で空のCUIプロジェクトを作って,以下のプログラムを書く.これ以外の余計なヘッダとかソースは一切不要(あってもいいが).
    Make a blank CUI project in Visual Studio, then add a following source code.
#include <tchar.h>
#include <iostream>
#include <fstream>

#include <windows.h>
#include <MSR_NuiApi.h>
#include <MSR_NuiSkeleton.h>

using namespace std;

bool connect()
{
  HRESULT hr= NuiInitialize(NUI_INITIALIZE_FLAG_USES_SKELETON);
  if(FAILED(hr))
  {
    cout<<"kinect is not initialized!! KINECT connected?"<<endl;
    return false;
  }
  return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
  connect();
  ofstream outfs("test1.dat");

  NUI_SKELETON_FRAME SkeletonFrame;

  while (true)
  {
    NuiSkeletonGetNextFrame(0, &SkeletonFrame);

    for(int i(0); i<NUI_SKELETON_COUNT; ++i)
    {
      if(SkeletonFrame.SkeletonData[i].eTrackingState==NUI_SKELETON_TRACKED)
      {
        float hand_l_x=SkeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].x;
        float hand_l_y=SkeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y;
        float hand_l_z=SkeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].z;

        float hand_r_x=SkeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].x;
        float hand_r_y=SkeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y;
        float hand_r_z=SkeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].z;

        cout<<"Left Hand: "<<hand_l_x<<", "<<hand_l_y<<", "<<hand_l_z<<"\t";
        cout<<"Right Hand:"<<hand_r_x<<", "<<hand_r_y<<", "<<hand_r_z<<endl;

        for(int j(0);j<NUI_SKELETON_POSITION_COUNT; ++j)
        {
          outfs<<SkeletonFrame.SkeletonData[i].SkeletonPositions[j].x
              <<" "<<SkeletonFrame.SkeletonData[i].SkeletonPositions[j].y
              <<" "<<SkeletonFrame.SkeletonData[i].SkeletonPositions[j].z<<endl;
        }
        outfs<<endl;
      }
    }

    // smooth out the skeleton data
    NuiTransformSmooth(&SkeletonFrame,NULL);
  }

  return 0;
}
  • ソリューションエクスプローラでプロジェクトのプロパティを開き,C/C++ の全般で「追加のインストールディレクトリ」に C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2\inc を追加.
    Open the property dialogue from the solution explorer. In the C/C++ tab, add C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2\inc into the additional include directories.
  • 同じく,リンカの全般で「追加のライブラリディレクトリ」に C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2\lib\x86 を追加.
    Similarly in the linker tab, add C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2\lib\x86 into the additional library directories.
  • 同じく,リンカの入力で「追加の依存ファイル」に MSRKinectNUI.lib を追加.
    Then, in the linker input tab, add MSRKinectNUI.lib into the additional depending files.
  • ビルド.
    Build.

エラーが出なければ,Kinect をつないで実行しよう.スケルトンが取得できるように Kinect から少し離れると,手先位置の出力が始まる.以下はコマンドプロンプトの出力.
If there is no error, attach Kinect and launch the program. Move away from Kinect so that the skeleton data is measured, then the command prompt starts printing the positions of the hand. The following is the example of the output of the command prompt.

 Attempting to open \\?\usb#vid_045e&pid_02ae#a00364915929052a#{00873fdf-61a8-11d
 1-ef5e-00c04f2d728b}\00
 KinWinDeviceName = (\\?\usb#vid_045e&pid_02ae#a00364915929052a#{00873fdf-61a8-11
 d1-ef5e-00c04f2d728b}\00\PIPE01)
 KinectCamera_OpenStreamEndpoint Opened successfully.
 Left Hand: 0.274473, -0.800708, 3.15295 Right Hand:0.564601, -0.655808, 3.0679
 Left Hand: 0.279375, -0.868915, 3.152   Right Hand:0.305756, -0.57561, 3.17116
 Left Hand: 0.286445, -0.831477, 3.15941 Right Hand:0.563111, -0.737451, 3.13431
 ...

また,同時に,アプリケーションのディレクトリに test1.dat という名前のファイルが作成され,すべてのマーカの3次元位置が記録されているので確認してみよう.
At the same time, the file named test1.dat is created in the application directory in which the 3D positions of all markers are stored.

この test1.dat を gnuplot でプロットすると,
Plot the test1.dat file with gnuplot,

 gnuplot> set size ratio 1
 gnuplot> plot "test1.dat" ev :::200::200 pt 7 ps 10 t ""

以下のようなグラフが見られるはず.ちなみに ev :::200::200 は 200 番目のブロック(この場合はフレーム)のみプロットするという指定.
you can see a graph such as follows. Here, ev :::200::200 denotes plotting only 200th block (in this case, a block is a frame).

test1.png

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-02-14 (木) 11:05:36 (1981d)