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 でサンプルを開くことができる。
画像の通り、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