logo header
logo header
logo header
logo header
  • 2017.05.23
  • 開発

デプスカメラでジェスチャー認識をしてみよう! ポーズ認識編

前回の記事「デプスカメラでジェスチャー認識をしてみよう! 環境構築編」では、
サンプルプログラムの実行まで行いました。
今回はデプスカメラを用いてポーズ認識を行いたいと思います!

はじめに

まず初めにSimpleOpenNIを使用するためにSimpleOpenNIをインポートし、初期化します。

SimpleOpenNIコールバックの記述

SimpleOpenNIを使用してユーザを検知するには、
SimpleOpenNIのコールバックのonStartPose、onEndCalibration、onNewUserの3つが必要なのでコールバックを記述します。コールバックの内容はサンプルプログラムのものをそのまま利用します。

初期化関数とメインループ関数

Processingを使ったプログラミングでは、初期化関数(setup関数)とメインループ関数(draw関数)という2つの関数を使ってプログラムコードを構成するのが一般的です。
初期化関数はプログラム実行時に1度だけ実行され、その後メインループ関数が繰り返し実行されます。
前回実行したサンプルプログラムを参考に、初期化関数とメインループ関数を作成します。

初期化関数

メインループ関数

関節情報を取得する

今回ポーズを設定・検出をするプログラムを作成するため、関節の座標を取得します。
SimpleOpenNIでは、各関節ごとにプロパティが存在し、プロパティを変更することで各関節ごとのデータの取得ができます。
プロパティは以下の通りです。

プロパティ 関節名
SimpleOpenNI.SKEL_HEAD
SimpleOpenNI.SKEL_NECK
SimpleOpenNI.SKEL_(LEFT or RIGHT)_SHOULDER
SKEL_(LEFT or RIGHT)_ELBOW
SKEL_(LEFT or RIGHT)_HAND
SKEL_(LEFT or RIGHT)_WRIST 手首
SKEL_(LEFT or RIGHT)_FINGER_TOP 指先
SKEL_(LEFT or RIGHT)_KNEE
SKEL_(LEFT or RIGHT)_FOOT
SKEL_(LEFT or RIGHT)_ANKLE かかと
SKEL_TORSO
SKEL_(LEFT or RIGHT)_HIP

関節の座標の取得は以下のコードでできます。

ポーズを設定・検出するプログラムを作成する

次にポーズを設定・検出するプログラムを作成します。
ポーズの検出には、各関節の座標を取得し、あらかじめ設定していたポーズの設定と比較することで検出します。
例えば「右手を挙げる」というポーズを設定していた場合、デプスカメラで検知した右肩のY座標より右手のY座標が高いかどうかを比較してポーズを検出します。

ポーズを検出するプログラムは以下になります。

ポーズを設定しているプログラムです。
このプログラムをメインループ関数で呼び出すことでポーズ認識ができるようになります。
今回は、「右手を挙げる」ポーズを設定しています。

プログラムを実行する

作成したプログラムを実行してみます。
右手を挙げた時に右肩、右肘、右手が線で結ばれれば成功です。

無事、成功しました!

まとめ

今回はデプスカメラを使用してポーズ認識を行いました。
本記事では、「右手を挙げる」ポーズを取ると右肩、右肘、右手が線で結ばれるという簡単な処理を行いましたが、より複雑なポーズを設定や処理を実行することもできます。

次回は、今回のポーズ認識のプログラムを応用してジェスチャー認識を行いたいと思います。

ともに世界をアップグレードできる、そんな日を夢見て。
Upgrade the World!