深度センサーは部屋の明るさや色彩の影響を受けずに人や物の形状を立体物として捉えることができるものですが、取得した深度データを処理することで、捉えた立体物の形状から人間の形を認識し、さらには人間の骨組みを検出することが可能になります。 今回はASUSTeK COMPUTER INC.の深度センサー「Xtion2」を使って、実際に人の骨組みを検出する手順をご紹介したいと思います。
深度センサーによる骨格検出の流れ
今回使用するASUSの深度センサー「Xtion2」では、赤外線などのレーザー光を細かく位置を変えて対象物に当てることで、対象物を立体として捉えることが可能です。
深度センサーのはたらきについては下記記事も参考にしてください。
“深度センサー Xtion2を使ってみよう”
上記記事でもご説明している通り、Xtion2と「OpenNI」というライブラリを用いて深度センサーの値の取得と表示ができますが、これに「NiTE」というライブラリを組み合わせると、捉えた対象物を人間として捉え、さらには捉えた形状から計算される人間の骨格を表示することが可能になります。
人間の骨格を表示する方法には他にもRGBカメラ(いわゆるWebカメラなど)を用いた方法などがありますが、深度センサーを用いることにより、対象物の周辺の光(照明や外光など)や着ている服の色の影響をあまり受けずに骨格を検出することができます。
NiTEによる骨格検出の準備と設定
NiTEのインストールと設定
OpenNI2からNiTEを使用するためのプログラムはXtion2のサポートページから入手できるソフトウェアに含まれていますが、最新版のソフトウェアに含まれているものではNiTEがうまく動かないため、以前のバージョンのソフトウェアを入手する必要があります。
また、今回動作させるサンプルコードを含むNiTE本体は別途入手する必要があります。現在NiTE公式のダウンロードサイトはありませんが、開発者向け情報サイトや関連書籍のサポートページなどでNiTE2が公開されていますので、あらかじめ入手してインストールを行ってください。
※Xtion2とOpenNIの設定については先ほどもご紹介した下記記事を参考にしてください。
“深度センサー Xtion2を使ってみよう”
Xtion2のサポートページへアクセスし、「OSを選択してください」メニューの一番下にある「すべてを表示」を選択後、「ASUS-Xtion2_nuitrack-win64」が含まれている「バージョン:2018/04/23」をダウンロードします。
ダウンロードしたファイルに含まれている「ASUS-Xtion2_nuitrack-win64¥nuitrack¥bin¥OpenNI2」を「C:¥Program Files¥PrimeSense¥NiTE2¥Samples¥Bin」に移動します。
続いて「C:¥Program Files¥PrimeSencse¥OpenNI2¥Drivers¥SenDuck.ini」を開き、「NiteMode = 1」の前にあるセミコロン(;)を削除します。
これでサンプルの実行ファイルを起動できるようになります。
サンプルコードの実行
準備ができたら、サンプルコードを実行してみます。「C:¥Program Files¥PrimeSense¥NiTE2¥Samples¥UserViewer¥UserViewer.vcxproj」を開きます。
ここで「アクセス許可」のダイアログが出た場合は、「異なる資格情報でアプリケーションを再起動」を選択してください。この場合、ファイルを開くで、上記「C:¥Program Files¥PrimeSense¥NiTE2¥Samples¥UserViewer¥UserViewer.vcxproj」を再度開いてください
また、「プロジェクトの再ターゲット」のダイアログが出た場合は、「Windows SDKバージョン」を「10.xxxx」に設定してください。
Visual Studioの左メニューの「ソリューションエクスプローラ」内の「UserViewer」を右クリックして、「プロパティ」を開きます。
開いたウィンドウ内左側「構成プロパティ」の「VC++ ディレクトリ」を開きます。
「インクルードディレクトリ」の「<編集…>」をクリックします。
表示されたウィンドウ右上「新しい行」ボタンをクリックします。
ディレクトリを選択する画面になりますので、「C:¥Program Files¥PrimeSense¥NiTE2¥Include」ディレクトリを選択して「フォルダーの選択」をクリック後、「OK」をクリックしてインクルードディレクトリの編集を終えます。
続いて「ライブラリディレクトリ」にも同様の手順で、「C:¥Program Files¥PrimeSense¥NiTE2¥Lib」を追加します。
正しく設定が完了すると、下図のような表示になります。
引き続き「構成プロパティ」の「デバッグ」を選択します。
作業ディレクトリを「$(TargetDir)」に変更します。
続いてVisual Studioの上部メニューを「x86」から「x64」に変更します。
続いて右横にある「ローカルWindowsデバッガー」をクリックします。
しかしこの状態では、ドライバーの問題で、エラーが出て起動することができません。
そこで、「ASUS-Xtion2_nuitrack-win64¥nuitrack¥bin¥OpenNI2」を「C:¥Program Files¥PrimeSense¥NiTE2¥Samples¥UserViewer¥x64¥Debug」に移動します。
上記移動後、再度「C:¥Program Files¥PrimeSencse¥OpenNI2¥Drivers¥SenDuck.ini」を開き、先ほどと同様に「NiteMode = 1」の直前のセミコロンを削除します。
上記作業を行なった上で、再度「ローカル Windows デバッガー」をクリックすると、プログラムの動作を確認できます(下図)。
NiTEに同梱されているサンプルコードの種類
ここまで、NiTEのサンプルコード「UserViewer」を動かしてみましたが、他にもいくつかのサンプルコードが収録されています。
「UserViewer」を含め、各サンプルコードの内容について挙げておきます。
UserViewer
深度データとユーザの骨格を可視化する(ユーザ認識には、センサーの撮影範囲に全身を収める必要があります)
UserViewer.javar
Javaで書かれたUserViewer
HandViewerr
深度データとユーザの手の位置を可視化する(ユーザ認識には、センサーの撮影範囲に全身を収める必要があります)
HandViewer.javar
Javaで書かれたHandViewer
SimpleUserTrackerr
ユーザの認識状態とユーザの頭の位置をCUIで表示する
SimpleHandTrackerr
ユーザの手の位置をCUIで表示する
まとめ
このように、Xtion2とOpenNI、NiTEを連携させて人間と骨格の検出をさせることができましたが、これらのプログラムはあくまで深度センサーをコントロールし、センサーの値を様々な形で扱いやすくするまでの役割を持ったものです。
実際にはこれらのプログラムから、特定の姿勢を取った時に起動するプログラムや、体を動かして遊ぶゲーム、キャラクターの動きに人の動きをあてはめるプログラムなどと連携させることで始めて完成されたソフトウェアプログラムとして機能します。
検出した骨格データを活用したプログラムの作成については、また別の機会にご説明したいと思います。
石郷祐介
大学卒業後、公設研究機関勤務を経て、「情報科学芸術大学院大学[IAMAS]」に入学。
専門学校講師を経て、企業の研究開発をコンセプトから開発まで支援する「合同会社4D Pocket」代表、エンジニアを養成するフリースクール「一般社団法人HOPTER TECH SCHOOL」代表理事、「名古屋文理大学」及び「名古屋造形大学」非常勤講師。