また1からこつこつと

最高はひとつじゃないと信じてまたがんばります。

Simple Open NIをつかって、ProcessingとKinectを接続してみる

mjk0513.hateblo.jp
で、OpenFrameworksを使ってKinectと接続する云々と書いたんだけど、ちょっといろいろ厳しくて断念。
その代わりにProcessingでKinectと接続してみた。

SimpleOpenNI とは

公式サイトはこちら
Google Code Archive - Long-term storage for Google Code Project Hosting.

ProcessingとKinectをつなげてくれる外部ライブラリ
もともとOpenNIってのがあったらしいんだけど、開発元がAppleに買収されちゃったあと開発が中止されてしまった

[OpenFrameworks + Kinect] で検索するとほとんどこのOpenNIを使ってるサンプルばかりで、僕の欲しい情報があまり見つからなかったので、このSimpleOpenNIで開発することにした

まずはこれをProcessingのライブラリに追加する必要がある
Processingのデフォルト機能にライブラリを追加する機能があるので、そこに「SImpleOpenNI」と入力する。
(Sketch > import Library > Add Library)
そうすると自分のスケッチにSimpleOpenNIがインポートされる
これで下準備は完了

まずはサンプルから

cmd + shift + o でサンプルを開くことができる。
f:id:mjk0513:20160206202848p:plain
画像の通り、SimpleOpenNIのサンプル画面を開いていろいろ試してみると吉です
Userってのが一番分かりやすかった

関節の情報を取得してみる

サンプルを実行したら、次は実際に自分で書いてみたくなるのがプログラマってもんですよね
というわけで、今回は左手の動きをトラッキングするコードを書いてみた

import SimpleOpenNI.*;

SimpleOpenNI kinect;

void setup(){
  kinect = new SimpleOpenNI(this);
  kinect.enableDepth();
  kinect.enableUser();
  kinect.setMirror(true);
  background(0);
  size(640, 480);
}

void draw(){
  kinect.update();
  background(0);
  
  //認識しているユーザを格納する配列
  int[] userList = kinect.getUsers();
  
  PVector rpos = new PVector();
  PVector ipos = new PVector();
  
  for (int i = 0; i < userList.length; i++){
    if ( kinect.isTrackingSkeleton(userList[i]) ){
       kinect.getJointPositionSkeleton(userList[i], 1, rpos);
       kinect.convertRealWorldToProjective(rpos, ipos);
        
  //左手を検出する処理
       PVector leftHand = new PVector();
       kinect.getJointPositionSkeleton(userList[i], SimpleOpenNI.SKEL_LEFT_HAND, leftHand );
       PVector convertedLeftHand = new PVector();
       kinect.convertRealWorldToProjective(leftHand, convertedLeftHand );
       fill(0, 255, 0);
       ellipse(convertedLeftHand.x, convertedLeftHand.y, 50, 50);      

    }
  }
 
}

成功すれば、黒い背景に緑色の円が、自分の左手の動きに合わせて動くはずだ
draw()の中はループされるので、その都度background(0)してあげることで毎回円の位置が変わるようになっている

大事なのは

kinect.getJointPositionSkeleton(userList[i], SimpleOpenNI.SKEL_LEFT_HAND, leftHand );

の部分

SimpleOpenNI.SKEL_LEFT_HAND

というプロパティの部分を変えることで他の部位のデータを取得することができる
簡単にまとめてみた
(L = LEFT / R = RIGHT)

  • SKEL_HEAD → 頭
  • SKEL_NECK → 首
  • SKEL_(L/R)_SHOULDER → 肩
  • SKEL_(L/R)_ELBOW → 肘
  • SKEL_(L/R)_HAND → 手
  • SKEL_(L/R)_WRIST → 手首
  • SKEL_(L/R)_FINGER_TOP → 指先
  • SKEL_(L/R)_KNEE → 膝
  • SKEL_(L/R)_FOOT → 足
  • SKEL_(L/R)_ANKLE → かかと
  • SKEL_TORSO → 胸
  • SKEL_(L/R)_HIP → 腰

詳細はこちらをどうぞ
SimpleOpenNIの公式リファレンス
SimpleOpenNI

全身を作ってみた

幾つか部位をピックアップして全身を描いてみた
vimeo.com

これを使ってまたおもしろいことできそう