深度センサー「Xtion2」とライブラリ「OpenNI」「NiTE」を使って、人の骨組みを検出する手順をご紹介します。

チャレンジ&ナレッジ最終更新日: 20190104

深度センサー Xtion2 で人の骨格を検出する

  • このエントリーをはてなブックマークに追加

深度センサーは部屋の明るさや色彩の影響を受けずに人や物の形状を立体物として捉えることができるものですが、取得した深度データを処理することで、捉えた立体物の形状から人間の形を認識し、さらには人間の骨組みを検出することが可能になります。 今回はASUSTeK COMPUTER INC.の深度センサー「Xtion2」を使って、実際に人の骨組みを検出する手順をご紹介したいと思います。

深度センサーによる骨格検出の流れ

今回使用するASUSの深度センサー「Xtion2」今回使用するASUSの深度センサー「Xtion2」

今回使用するASUSの深度センサー「Xtion2」では、赤外線などのレーザー光を細かく位置を変えて対象物に当てることで、対象物を立体として捉えることが可能です。

深度センサーのはたらきについては下記記事も参考にしてください。
深度センサー Xtion2を使ってみよう

上記記事でもご説明している通り、Xtion2と「OpenNI」というライブラリを用いて深度センサーの値の取得と表示ができますが、これに「NiTE」というライブラリを組み合わせると、捉えた対象物を人間として捉え、さらには捉えた形状から計算される人間の骨格を表示することが可能になります。

Xtion2とOpenNIで捉えた対象物をNiTEにより人間として認識し、骨格を検出&表示する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」をダウンロードします。

OSを選択して「すべて表示する」をクリックOSを選択して「すべて表示する」をクリック

「バージョン:2018/04/23」をダウンロード「バージョン:2018/04/23」をダウンロード

ダウンロードしたファイルに含まれている「ASUS-Xtion2_nuitrack-win64¥nuitrack¥bin¥OpenNI2」を「C:¥Program Files¥PrimeSense¥NiTE2¥Samples¥Bin」に移動します。

OSを選択して「すべて表示する」をクリック「バージョン:2018/04/23」をダウンロード

続いて「C:¥Program Files¥PrimeSencse¥OpenNI2¥Drivers¥SenDuck.ini」を開き、「NiteMode = 1」の前にあるセミコロン(;)を削除します。

xtion2

これでサンプルの実行ファイルを起動できるようになります。

サンプルコードの実行

準備ができたら、サンプルコードを実行してみます。「C:¥Program Files¥PrimeSense¥NiTE2¥Samples¥UserViewer¥UserViewer.vcxproj」を開きます。

xtion2

ここで「アクセス許可」のダイアログが出た場合は、「異なる資格情報でアプリケーションを再起動」を選択してください。この場合、ファイルを開くで、上記「C:¥Program Files¥PrimeSense¥NiTE2¥Samples¥UserViewer¥UserViewer.vcxproj」を再度開いてください

xtion2

また、「プロジェクトの再ターゲット」のダイアログが出た場合は、「Windows SDKバージョン」を「10.xxxx」に設定してください。

xtion2

Visual Studioの左メニューの「ソリューションエクスプローラ」内の「UserViewer」を右クリックして、「プロパティ」を開きます。

xtion2

開いたウィンドウ内左側「構成プロパティ」の「VC++ ディレクトリ」を開きます。

xtion2

「インクルードディレクトリ」の「<編集…>」をクリックします。

xtion2

表示されたウィンドウ右上「新しい行」ボタンをクリックします。

xtion2

ディレクトリを選択する画面になりますので、「C:¥Program Files¥PrimeSense¥NiTE2¥Include」ディレクトリを選択して「フォルダーの選択」をクリック後、「OK」をクリックしてインクルードディレクトリの編集を終えます。

xtion2

続いて「ライブラリディレクトリ」にも同様の手順で、「C:¥Program Files¥PrimeSense¥NiTE2¥Lib」を追加します。

xtion2

xtion2

xtion2

正しく設定が完了すると、下図のような表示になります。

xtion2

引き続き「構成プロパティ」の「デバッグ」を選択します。

xtion2

作業ディレクトリを「$(TargetDir)」に変更します。

xtion2

続いてVisual Studioの上部メニューを「x86」から「x64」に変更します。

xtion2

続いて右横にある「ローカルWindowsデバッガー」をクリックします。

xtion2

しかしこの状態では、ドライバーの問題で、エラーが出て起動することができません。

そこで、「ASUS-Xtion2_nuitrack-win64¥nuitrack¥bin¥OpenNI2」を「C:¥Program Files¥PrimeSense¥NiTE2¥Samples¥UserViewer¥x64¥Debug」に移動します。

xtion2

上記移動後、再度「C:¥Program Files¥PrimeSencse¥OpenNI2¥Drivers¥SenDuck.ini」を開き、先ほどと同様に「NiteMode = 1」の直前のセミコロンを削除します。

上記作業を行なった上で、再度「ローカル Windows デバッガー」をクリックすると、プログラムの動作を確認できます(下図)。

xtion2

NiTEに同梱されているサンプルコードの種類

ここまで、NiTEのサンプルコード「UserViewer」を動かしてみましたが、他にもいくつかのサンプルコードが収録されています。
「UserViewer」を含め、各サンプルコードの内容について挙げておきます。

UserViewer
深度データとユーザの骨格を可視化する(ユーザ認識には、センサーの撮影範囲に全身を収める必要があります)

UserViewer.javar
Javaで書かれたUserViewer

HandViewerr
深度データとユーザの手の位置を可視化する(ユーザ認識には、センサーの撮影範囲に全身を収める必要があります)

HandViewer.javar
Javaで書かれたHandViewer

SimpleUserTrackerr
ユーザの認識状態とユーザの頭の位置をCUIで表示する

SimpleHandTrackerr
ユーザの手の位置をCUIで表示する

まとめ

このように、Xtion2とOpenNI、NiTEを連携させて人間と骨格の検出をさせることができましたが、これらのプログラムはあくまで深度センサーをコントロールし、センサーの値を様々な形で扱いやすくするまでの役割を持ったものです。

実際にはこれらのプログラムから、特定の姿勢を取った時に起動するプログラムや、体を動かして遊ぶゲーム、キャラクターの動きに人の動きをあてはめるプログラムなどと連携させることで始めて完成されたソフトウェアプログラムとして機能します。
検出した骨格データを活用したプログラムの作成については、また別の機会にご説明したいと思います。

ライタープロフィール 合同会社 4D Pocket
石郷祐介

大学卒業後、公設研究機関勤務を経て、「情報科学芸術大学院大学[IAMAS]」に入学。
専門学校講師を経て、企業の研究開発をコンセプトから開発まで支援する「合同会社4D Pocket」代表、エンジニアを養成するフリースクール「一般社団法人HOPTER TECH SCHOOL」代表理事、「名古屋文理大学」及び「名古屋造形大学」非常勤講師。

記事を
シェア