ColladaBinary にイメージファイルを追加できるようにしました。
マテリアルにて任意のテクスチャマップを追加できるようにしました。
追加した結果を保存、読み込みで復元できることを確認しました。
無駄なシェーダ変数の更新を行わないようなシステムにしました。
マテリアルのパラメータすべてがシェーダ変数と連動するように修正しました。
時間変数を追加し、時間変化でアニメーションするシェーダを作れるように修正しました。
…と、前々回にこんなことできたらいいなと思った機能をKimberliteに追加しました。
新しいプラグインタイプを追加し、指先認識に特化した拡張機能を作ります。
夏休みの課題と題しましたが、話が長くなりそうなので適当に区切りをつけて話を切ります。
まずは Intel の PerC から両手の五指、肘の位置を取得する方法を確認します。
場合によってはそれで話が終わるかもしれません。
4日ほどこちらに没頭できるので、そこそこ作業が進みそうです。
C++で指先の認識結果を得る方法が次の記事にて示されています。
Intel Perceptual Computing SDK入門(4)
そもそも Intel の CREATIVE カメラを購入したきっかけがこの記事です。
こうした技術記事の存在は大きいです。(私のような指先認識や画像処理に興味を持つ人間にとって)
さて、内容を確認すると見慣れない EnableGesture(); auto gestureFrame = QueryGesture(); というコードを目にします。
ここまで作った C# のツールでも同じようにジェスチャーが取得できるのか確認してみます。
さっそく UtilMPipeline の機能だとういうことがわかります。
ここまで作ってきたツールは VideoStream から ReadStreamAsync を呼び出す形式でした。
しまった、つまり使えない?よくわからないので詳細をドキュメントに求めます。
PXCMGesture クラスをキーワードに記述が豊富なので、情報を集めてみます。
作るには CreateImpl function を利用、そういえば PXCMCapture も CreateImpl 使いました。
どうも session があれば、次のコードでインスタンス化できるようです。
気になるのは PXCMGesture.ProfileInfo です。ちょっとインスタンス化してみて
内容をチェックしてみます。そもそも今まで ProfileInfo をどのようにリストアップしていたのか忘れました。
調べました QueryProfile のインデックスをインクリメントしながら呼び続けるというものでした。(そうでした)
では、ProfileInfo をリストアップしてみましょう。
リストアップできました…が、よくわかりません。
nodeAlerts, blobs とか、何なのでしょう?ドキュメントを読んでみます。
Finger Tracking using Util[M]Capture というコラムを見つけたので読みました。
どうも指先認識のほかに Gesture, Alerts というものがあり、それぞれにイベントハンドラを設定できる模様
Gesture はスワイプとか、Alerts は FOV(field of view つまり視界)から手が出たなどに対処できるもの。
指先認識をする身としては今のところ使いませんが、多くのジェスチャシステムを作りたい人にとっては重要な情報です。
ジェスチャ認識の主要コードを見つけました。
つまり作ったジェスチャーを作成、プロファイルを設定して保持し
PXCMImage 配列を ProcessImageAsync で渡す。
入力がPXCMImage配列なのが気になります。
どうやら Profile の inputs の順番で渡す必要がある模様。
どちらかというと Util[M]Capture を Profile で LocateStreams する必要があるようです。
まとめると、次のようにしてジェスチャーを作り
作れましたが、同じプロファイルが2個取得出来ました。よくわからない…
SDKドキュメントの
Finger Tracking and Pose/Gesture Recognition
General Procedure
Geometric Nodes and Hand Modeling
Pose and Gesture Recognition
Blob Image and Data
の5ページを読み進めると、ジェスチャ認識についての基本的な使い方がわかります。
そして、PXCMCapture を使う方法でループを回す方法は具体的に示されていません。
デバイスとストリームとプロファイルを複数選択してキャプチャを開始する仕組みで作った場合は
いい感じに対処してねと示されています。(難易度高いよ)
結論、ボタンを一つ追加して、選択デバイスストリームにジェスチャを追加
これにプラグインを任意に選択することができ、既存のStartボタンでキャプチャ開始
これで行けそうですね。
Intel PerC ライブラリのジェスチャ認識結果を受け取りつつ
その深度画像を処理しながら仕事を行うプラグインを考えます。
依存するのが PerC ライブラリから受け取る情報です。
ただ、ほかの指先認識ライブラリの結果も受け取れるようにしたいので
指定した部位の姿勢行列を受け取る仕組みとしたいと思います。
正直手元にセンサがないと、どういった情報が手に入るのかわからなくなってきました。
ドキュメントだけでは厳しいので、そろそろセンサをつないで試験してみたいと思います。
…
……
これが思わぬ落とし穴にはまってしまって、半日ほど無駄にしました。
セッションにて PXCMCapture を一度取得していると、どうもそのセッションから作った
PXCMGesture は距離画像を使って、ジェスチャ認識を行わないようです。
手をセンサに近づけるとC++の中でクラッシュするなど、よくわからない状態で試行錯誤を続けました。
結果、UtilMCapture を別のセッションで作り、PXCMGesture もそのセッションで作ることとしました。
すると、何のエラーも起きずにジェスチャ認識結果を得ました。(別セッションを作るという発想が無かったので苦労…)
ひとまずこれで指先位置を取得できるループを回しながら3D距離点群を得ることができますので、
プラグインの方を考えていこうと思います。
Intel PerC の Geometric Node 構造体について考えます。
もう、これをそのままプラグインに渡したいわけですが…使うのは
body, side, confidence, positionWorld, positionImage, massCenterWorld, massCenterImage, normal, openness, opennessState
…ほぼすべてですね。
プラグインが使う構造体を用意すると次のとおり。
初期化時に必要なのはこの配列をどれくらいの長さで用意すればよいかということ。
2次元配列で次のように設定するので、2, 11 と渡せると良いかな。
ひとまず、上記のノード情報配列を渡せるようにインタフェースを用意しました。
そして、そのプラグインインタフェースを継承したプラグインを用意します。
前々回に作った VerticesViewer プラグインをそのままコピーするだけです。
作りました、そして実行すると…
動きました。(良かった。)
下図は現在のツールのUIです。
このへんで今回のお話は切ろうと思います。
夏休みの課題として
3D点群を表示しつつ、リアルタイムで指先位置をプラグインに渡す機構を作成しました。
この後はプラグイン側で手の姿勢推定機構を詰めていこうと思います。
やっと楽しくなってきました。(4日使ったけど、思ったより進まなかったな…)
2014/08/13 初記。
2014/08/16 更新。