「やってみよう!kinectアプリ開発」の第三回目レビューを記載させていただきたいと思います。今回の課題は下記のようになっておりました。
- やってみよう!Kinectアプリ開発 - 第8回 初期化・終了処理
- やってみよう!Kinectアプリ開発 - 第9回 ポーズ認識
- やってみよう!Kinectアプリ開発 - 第10回 ジェスチャー認識
- やってみよう!Kinectアプリ開発 - 第11回 継続的なジェスチャー認識
これらの課題について、第4回、第5回をまとめてレビューさせていただき、そのあとで第6回、第7回をまとめてレビューさせていただきます。
SDKとSDKドキュメントについて
この回では、まず最初にSDKドキュメントのインストールを行っています。SDKとは、ソフトウェア開発キット(Software Development Kit)の頭文字をとった物です。このSDKが、現在のソフトウェア開発には欠かせない物となっています。SDKがなければ、複雑になった現在のソフトウェア構築は不可能と言えるでしょう。
今回のkinectアプリ開発でも、第1回の一番最初にKinect for Windows SDKのセットアップを行いました。そのおかげで、kinectで映像を取得したり、人物の位置を取得したり、ジェスチャーの認識をするために準備された命令をプログラムの中に数行記述するだけで可能となっています。もし、このSDKがなかったとしたら、kinectと接続する事さえもできません。
つまり、SDKとはあらかじめ必要と思われるプログラムの専門的な部分をまとめたプログラムで、それを自分の作ろうとするプログラムに読み込むことで、専門的な知識がなくても簡単にプログラムを作れるようにしてくれる、魔法のようなプログラムだったのですwww
SDKにはプログラムだけでなく、統合開発環境やデバッグ用のユーティリティー、サンプルプログラムなど開発に必要なものがいろいろと含まれています。
ただし、いくら魔法のようなプログラムがあったとしても、その使い方がわからなければただのハードディスクの中のゴミにしかなりません。本屋に行けば詳しく説明した書籍なども多数置いてありますが、自分の調べたい命令を調べるのも大変ですし気軽に使うことはできません。それを、SDKドキュメントをインストールすることで、自分の知りたい命令を選択してF1キーを押すだけで、その説明が見れてしまうようになる、魔法のプログラムを使うための魔法の説明書となっていますwwwww
ほかにも、後で出てくるTOOLKITやAPIなど開発用のプログラムパッケージはいろいろな種類がありますので、違いを調べてみるのも面白いかと思います。
第8回 初期化処理と終了処理
普段、パソコンを使っていても気が付きにくいのですが、基本的にすべてのソフトウェアは初期化処理と終了処理を行っています。昔はハードウェアは基本的に電源を入れた時にはすでに接続されている必要がありました。しかし、今ではUSBによる接続が可能となり、電源を入れたままでも接続、取り外しが可能となりました。
このUSB機器を接続したときに行うのが初期化処理、抜いた時(もしくは抜く前に)行うのが終了処理となります。
kinectでは、toolkitを使用することで、上記のように接続状態や電源のON/OFFなどの状態を簡単に取得することが可能となっています。
第9回 ポーズ認識
さて、この回からやっとkinectの本当のすごさを感じられるプログラムを作っていくことになります。
普通のWebカメラを使用しても、画像解析の技術を使って同じことをやろうと思えばできないことは無いと思いますが、現実的に考えて、カメラに映った映像から人物の場所を特定するだけでもかなりの量のプログラムを作る羽目になってしまいます。
当然、画像処理や三次元空間把握などの基本的な知識は必要となりますが、ほんの数行のプログラムを書くだけで簡単にジェスチャーの認識が行えました。
このプログラムでは、右手を頭より上の位置でまっすぐにした時のみ、顔のサイズが倍になるようにしています。
左側の写真では、手はまっすぐ伸びていますが高さが足りないため小さいままになっています。右側では高さは十分ですが腕が曲がっているために小さくなっています。中央のように頭より上で、かつ、まっすぐになっているという状態をプログラムで認識できたことがわかります。
第10回 ジェスチャー認識
ポーズとジェスチャーの違いは、ポーズは1つの形であるのに比べてジェスチャーは複数のポーズの連続と言えるかと思います。そのため、ジェスチャーの認識の場合には逐次ポーズをチェックして、現在のポーズが1つ前に確認されたポーズの次に来るべきポーズなのかどうかを確認していく事で可能となります。
この場合、すべての基本となるのは現在のポーズを取得する事です。それを行っている関数がcheckPostureになります。
この関数では、頭、右手首、腰の中央の3つのポイントを使って現在のポーズを特定しています。詳細は第10回講座に記載がありますので省略しますが、この3つのポイントを利用して右手がどの位置にあるのかを定義しています。
また、連続してポーズを行っているという確認のために1のポーズと2のポーズの間に行ってはいけないポーズをとっていないかを確認する必要があります。その確認を行っているのがcheckTransStateという関数です。この関数はbool型という型の戻り値をとっており、これはOKかNGのどちらかを示すだけの物です。
この関数の中でメインとなるのが下の関数の部分になります。
この部分では switch~case 文を利用して、前回がどのポーズであったかを識別しています。そのうえで、前回のポーズの後にとるべき条件を満たしていればOK(true)を返し、それを満たしていない場合にはNG(false)を返すようになっています。
この2つの関数を利用して、最終的にジェスチャーの判定を行います。
最初に checkTransState で継続状態にあるかどうかを確認し、異なるポーズを取った場合には現在の状態を格納する変数である nextState を0の初期値に戻します。
その後、現在のポーズを取得して次の状態に映った場合には nextState の値を次の状態へ移します。最終的にジェスチャーが完了した時点で頭部の画像を大きく表示するようにしています。
第11回 継続的なジェスチャー認識
今までは、kinectで取得した映像をベースにプログラムを行ってきましたが、この回では映像を直接使うのではなく、映像を取得する事で得られた情報のみを利用して動くプログラムを作成しています。
実際に、作成したプログラムを実行した結果がこのようになります。この緑色の点が頭の角度に対応して移動するようになっています。また、その移動量に応じてマウスの移動方向と速度をwindowsに対して指示する事で実際にマウスを動かす事を可能にしています。
この回の講座では、前回のプログラムを流用するのではなく新たに新規のプロジェクトを作成しています。今までの講座では、基本的に右側に表示されているプロパティを編集する事で各オブジェクトの設定を行っていましたが、この回の講座では講座の最後にソースコードがテキストで掲載されているため、そのソースコードを対象のファイルにコピーする事で、各プロパティの値を探して編集しなくとも、すべてのプロパティを一括して設定することが可能です。
これは、そもそも右側にあるプロパティの画面はプログラムに詳しくない人でも簡単に変更ができるようにあるツールであり、実際はプログラムとして記述する事でも同様の変更が可能であることを示しています。
プログラムに慣れてくると、いちいち右側のプロパティウィンドウを見なくても何という名前の項目にどういう内容を設定すればよいかがわかるようになってきます。その場合には、ソースコードに直接その項目を記述したほうが、プロパティを利用して変更するよりも効率が良くなる事があります。
特に、最近の(と言ってもunixのエディタなども含めるとかなり前からですが)開発環境では、最初の数文字を入れると入力候補の変数や型名を自動的に表示し、それを選択してTABキーやENTERキーを押す事で自動入力することも可能になっていますので、さらに利便性は上がっていると思います。
今回軽く触れられているwin32APIやそのほかのSDKを利用する事で、kinectとそのほかのアプリケーションを連携して動作するようなプログラムを作成する事も可能となりますので、オリジナルソフトウェアの作成においては、kinectのみでなくいろいろなことにチャレンジしてみたいと思います。
・・・・・・と書いて、自分でハードルを上げてしまったことにちょっと後悔(^_^;)
残るレビューも1回となってしまいましたが、最後まで頑張って継続していきたいと思います。
最後まで読んでいただきありがとうございました。
ZIGSOWにログインするとコメントやこのアイテムを持っているユーザー全員に質問できます。