ホーム -> ラボ -> デバイス連携 -> kinectFaceTrakingANEのfunctionとか

ラボ

2013.08.12
kinectFaceTrakingANEのfunctionとか

Kinectもそうですが、モーションセンサーを利用するアプリを作成するには、C++などのネイティブ言語での開発が必要です。C++だとVisual Studioでの開発になりますが、Flashに慣れている私からみると、C++でのインターフェイスの構築は煩雑かつ手間のかかる印象です。 C++プログラマの方と話しても制作のネックになるのがUI部分の制作だそう。「それならば!」ということで、ANE (Adobe Native Extension)を作りました。ANEとはFlashの拡張ライブラリで、Flashの通常のクラスからではコントロールできない機能もANEというライブラリを介することで操作可能になります。今回はKinectのFaceTrakingデータを取得できるANE(詳細は前の記事をご覧ください) を作成しました。

FaceTrakingANEのサンプル動画:MouseClickハンドラ

ASからコントロールすることを前提としているのでKinectの初期化やアップデートのコマンドはDLL側での自動処理ではなくASのFunctionに用意しました。
データの取得もコンテンツで必要なタイミングでとれるようにFunctionにしてあります。
動画ではクリックハンドラでFacePointデータとFaceRectデータを取得し、描画更新を行っています。
画面左下に出力画面がちらっと見えています、クリック時にFaceTrakingが正しく行われていないときは、「doFaceTraking:resLen 1」、正しく取れたときは、「doFaceTraking:resLen 100」が返ります。

FaceTrakingANEのサンプル動画:EnterFrameハンドラ

EnterFrameイベントのハンドラにdoFaceTraking() と getRectArray()を仕掛けてみました。
少し描画がカクついて見えるのは、kinectが追従対象を見失っている状態です。そういうときは画面左下の出力パネルで「doFaceTraking:resLen 1」と表示されます。
距離(NearModeのときは60~100cm)が適切で顔の向きが斜め45度を越えない限り、正しく追従されます。そして、描画更新の遅延もほとんどありません。


用意したFunction

1)say() //クラス設定お試しよう。Hello Worldと返ります。
2)doFaceTraking() //100個の識別点がVector.<Point>データとして返ります。
3)getRectArray() //顔のRectデータが返ります。
4)initKinect() //Kinectの初期化です
5)startUpdate(bool:Boolean) //Kinectのカメラデータを更新する。boolをtrueにすると、kinectの傾きがユーザーの顔位置中心に追従します。初期状態はfalse。
6)closeKinect() //Kinectの終了。クラス終了時にも呼ばれる。コンテンツ途中で意図的に終了したい時のみ使用する。

ちなみに、今回のANEのターゲットユーザーは一人です。手前&中心に近い、正面向きの人を取得しています。
識別点は3Dではなく2Dです。3Dでもデータの引渡しはVectorになるので、書き換えはC++のDll側だけで済みそうですが、初めて作ったANEなので処理負荷の小さい2Dデータにしました。

FaceTrakingANEの識別点は100個

Microsoftの公式ページによると、識別点は87個(プラス図にはない13個もある)となっています。
Figure 2. Tracked Points
http://msdn.microsoft.com/en-us/library/jj130970.aspx


(c)Microsoft

たしかに実際にFacePointを取得すると100個が戻されました。

図に無い13個とは、下記の3種類のものですね。
・眉山の上の左右各5点ずつ計10個
・目の中心点左右1つずつ計2個
・鼻の頂点ひとつ

配列番号を表示してみました。


参考にした情報&コード

実際にKinectを操作している、C++のDll部分は、Natural Softwareさまのコードをほぼそのままくらい参考にさせていただいています。素晴らしい情報の公開にいつもいつも感謝しています。
「Kinect for Windows SDKのFaceTrackerで取れる2D座標を表示してみる(C++)」
http://www.naturalsoftware.jp/blog/2641

C++で取得できるデータ値をFlashに引き渡すさいの型変換に関しては、下記のGitHub掲載のコードを参考にさせていただきました。
AS3NUI/airkinect-2-core
https://github.com/AS3NUI/airkinect-2-core/blob/master/native/src/Data/AKBasicStructs.h

ANEの実装についての基本は下記ページを参考にしました。
「iOS用のAIRネイティブ拡張機能を使用したデータ転送 – パート1:ActionScript 3とC、C++、またはObjective-C間での基本的な型の交換」
http://www.adobe.com/jp/devnet/air/articles/transferring-data-ane-ios-pt1.html
「iOS用のAIRネイティブ拡張機能を使用したデータ転送 – パート2:ActionScript 3とC、C++、またはObjective-C間でのVectorおよびArrayオブジェクトの交換」
http://www.adobe.com/jp/devnet/air/articles/transferring-data-ane-ios-pt2.html
「FlashDevelop + GCCでANE入門」
http://rest-term.com/archives/2950/

FaceTrakingANEの利用について

ANEを誰でも利用可能なように公開するとなるとバージョンアップやら機能要望やらの対応できる体制が必要になると思いますが、それらの体制の用意はプログラマが私しかいない弊社では厳しいように感じています。
なので、オープンソース化はいまのところ予定していません。(習作でもあるのでイロイロ不安もありますし)
制作依頼には積極的に対応させていただきますので、ご利用を検討されている企業様は弊社までお問い合わせくださいまし。
 

このページを編集する(内部専用)