わんくまT84 kinect深度情報処理入門

Preview:

Citation preview

わんくま同盟 東京勉強会 #84

Kinect

深度情報処理入門

暁 紫電

@akatukisiden

わんくま同盟 東京勉強会 #84

自己紹介

本名: 伊藤 伸男

年齢: 26歳

興味分野

Windows クライアントアプリ

COM

WinAPI

.NET/Native 相互運用

使用言語

C++

C++/CLI

C#

HN: 暁 紫電

twitter: @akatukisiden

職業: フリープログラマー

わんくま同盟 東京勉強会 #84

アジェンダ

• Kinectとは(Kinectの歴史)

• Kinectで出来る事

• なぜ深度に注目するのか

• 解説とデモ

• まとめ

わんくま同盟 東京勉強会 #84

Kinect (for Xbox 360)とは

• Microsoftが販売するゲーム機「Xbox 360」用のコントローラー

• コントローラーを持つ必要が無く、身体の動きや、ジェスチャー、音声などによる操作が可能なことが特徴NUI (Natural User Interface)

• Kinect自体にもCPUを搭載しXbox側の負荷を下げている。

• 2010年11月「Kinect for Xbox 360」発売

わんくま同盟 東京勉強会 #84

Kinect ハック

• もともとはXboxでしか使えなかったが、PC用のドライバー等を開発・公開する人があらわれる

(KinectのUSB接続はあえて暗号化されていなかった)

• PC用のKinectアプリ開発(Kinect ハック)が ブームになる

• 2011年06月 「Kinect for Windows SDK」 β版公開

• 2012年2月Kinect for Windows 販売Kinect for Windows SDK 公開

(Windows PC専用 商用利用可能)

わんくま同盟 東京勉強会 #84

The Kinect Effect

Kinectはゲーム・エンターテイメントを目的として作られたが、

その他の分野にも活用されており、この広がりは「The Kinect Effect」と呼ばれてる

• ゲーム• リビングルーム• 医療現場• リハビリテーション

• 見守り支援• 教育• 人流計測

• ヒューマンエラー防止• 商品統計• アパレル• デジタルサイネージ• アミューズメント施設• 危険区域における構造調査• 等々…

わんくま同盟 東京勉強会 #84

次世代Kinect

• 2013年5月 「Xbox One」と共に再設計された次世代「Kinect」を公開

• 2014年 「Xbox One(+Kinect for Xbox One)」「次世代型 Kinect for Windows」 発売予定

• 3Dセンサの原理を変更、解像度、奥行き方向分解能ともに向上

• センサーに近い場所、狭い部屋でも認識精度が向上。

• スケルトン、ユーザー認識(後述)精度も向上

• 心拍数も取得可能(RGBカメラとIRカメラから推測)

• Etc…

わんくま同盟 東京勉強会 #84

Kinectで出来る事

わんくま同盟 東京勉強会 #84

カメラ(RGB/YUV/Bayer)

※サンプルアプリ Kinect Explorerの映像を撮影

わんくま同盟 東京勉強会 #84

深度センサー

• 0.8m~4m(通常モード) or 0.4m~3m(Nearモード)

• 13bit

※サンプルアプリ Kinect Explorerの映像を撮影

わんくま同盟 東京勉強会 #84

スケルトントラッキング(簡易モーションキャプチャー)

※サンプルアプリ Kinect Explorerの映像を撮影

わんくま同盟 東京勉強会 #84

• 全身20箇所の関節などの座標と向きを取得• 上半身10箇所のみの取得も可能(Nearモード)

• 2人分まで取得可能

わんくま同盟 東京勉強会 #84

ユーザーの認識

• 最大6人まで認識可能(3bit)

• 深度データ13bitと一緒に16bitデータとして取得

※サンプルアプリ Kinect Explorerの映像を撮影

わんくま同盟 東京勉強会 #84

マイク

• 音声の取得

• 音源方向の認識(指向性マイク×4)

• マイクデバイスとして使用可能

わんくま同盟 東京勉強会 #84

セッションタイトルでもわかるように、今回は深度センサー、

深度情報の扱い(画像処理)

に特化した話をします。

わんくま同盟 東京勉強会 #84

スケルトンがあるのになぜ深度に注目するのか

• そもそもスケルトンは深度から計算してる

• スケルトンでは体勢・距離・設置場所などに制限がかかる(正面に配置 全身or 上半身が写る必要がある。)

• 深度+画像処理 (+RGBカメラ)なら画像処理の知識次第で様々なデータや、ジェスチャーが取得できるはず。

わんくま同盟 東京勉強会 #84

デモと解説

今回は、深度情報を元に簡単なジェスチャーを取得します。

わんくま同盟 東京勉強会 #84

深度情報の取得

• Kinectの返す情報は、ユーザー情報3bit,深度情報13bitの計16bit

• 深度情報のみを表示する場合は3bitシフトして表示する。

015 14 13 12 11 10 9 8 7 6 5 4 3 2 1

深度情報(13bit) ユーザー情報(3bit)

わんくま同盟 東京勉強会 #84

深度情報取得コールバック関数の実行スレッド

• 深度情報の取得時に呼び出されるコールバック関数は、通常UIスレッドで実行されてしまう。

• 取得した深度情報は、表示するまでに様々な処理を加える場合があり、これらの処理をUIスレッドで行うと、UIスレッドをブロックしてしまい、操作に対するレスポンスが悪くなってしまうため、深度情報の処理は別スレッドで処理を行いたい。

• コールバック関数の登録を別スレッド(Task)で行うことでコールバック関数の実行も別スレッドで実行される。

わんくま同盟 東京勉強会 #84

深度情報の取得コールバック関数は通常UIスレッドで実行されてしまう。

//UIスレッドでコールバックを登録

深度情報の取得画像の処理がUIスレッドで実行されてしまっている

わんくま同盟 東京勉強会 #84

コールバック関数の登録を別スレッドで行うとそれが実行されるのも別スレッドになる。

深度情報の取得画像の処理が

別スレッドで実行されている

//別スレッド

わんくま同盟 東京勉強会 #84

わんくま同盟 東京勉強会 #84

わんくま同盟 東京勉強会 #84

認識深度の絞込み

• Kinectから近すぎて要らないデータ、遠すぎて要らないデータは認識の邪魔なので、認識する最大値、最小値を決めて取り除く

• (画像処理ライブラリOpenCVを使用する場合)処理内容によっては処理対象が8bitの画像でなければならない場合があるのでついでに256分割して8bit化する

わんくま同盟 東京勉強会 #84

わんくま同盟 東京勉強会 #84

しきい値処理で二値化(白黒画像化)

• 0~255(8bit化済み)の適当な値を基準にして白黒2色の画像に変換する。

• 白黒画像であれば、輪郭データを抽出可能

• 輪郭データからは外接矩形を取得できる

わんくま同盟 東京勉強会 #84

わんくま同盟 東京勉強会 #84

わんくま同盟 東京勉強会 #84

わんくま同盟 東京勉強会 #84

不定値の対処(※次世代版だと改善してるかも)

• 光の反射や、Kinectとの角度などが理由で深度を上手く取得できない箇所がある。(不定値)

• これのせいでジェスチャーなどを思うように認識できない場合がある。

• 画像を不定値による穴が塞がるまで膨張させその後同じだけ収縮することで正常に認識させることが出来る。

※縮小するのは膨張で画像全体が広がったのをもとに戻すため

わんくま同盟 東京勉強会 #84

膨張・縮小処理

• 膨張処理

– 注目している画素をその画素とその周囲の画素のうち一番濃い色にする。

縮小処理

– 注目している画素をその画素とその周囲の画素のうち一番薄い色にする。

わんくま同盟 東京勉強会 #84

周囲の定義

周囲の定義は要件に応じて8近傍、4近傍、斜め,etc を使い分ける今回は8近傍を使用

8近傍 4近傍 斜め

わんくま同盟 東京勉強会 #84

通常 → 膨張

わんくま同盟 東京勉強会 #84

膨張 → 縮小

わんくま同盟 東京勉強会 #84

わんくま同盟 東京勉強会 #84

ろくろ回しポーズ検出に挑戦

• しきい値をろくろ回しポーズ時の手の辺りになるように調整。

• 最も大きい2つの外接矩形が以下の条件を満たす場合を検出状態とする。

– 両方とも縦長である。 (Height>Width)

– 重なってない

– Y軸の値が重なっている

わんくま同盟 東京勉強会 #84

わんくま同盟 東京勉強会 #84

角度付き外接矩形

• 腕の角度などが取れるので

• 工夫すれば様々なジェスチャーを取得可能

わんくま同盟 東京勉強会 #84

わんくま同盟 東京勉強会 #84

輪郭画像の簡易取得

• ここまでで行った二値データからの輪郭取得は外接矩形が取れるということは座標を持っているはずなので内側でかなり複雑な処理をしてるはず。

• 外接矩形や、座標データなどが必要なく、輪郭を表示だけすればいい場合、元の画像を膨張させた画像から縮小させた画像を引くことで簡単に輪郭を取得できる

わんくま同盟 東京勉強会 #84

わんくま同盟 東京勉強会 #84

わんくま同盟 東京勉強会 #84

まとめ

• 近すぎ、遠すぎて要らないデータを削除する

• 膨張・縮小処理で不定値による誤認識問題を解決

• しきい値処理で2値化

• 輪郭・外接矩形等をの取得

• 矩形の座標、サイズ、角度などによりジェスチャーを定義

わんくま同盟 東京勉強会 #84

最後に

• 画像処理を用いれば深度情報から様々なデータが取得出来るはず。

• どんな処理でどんなデータが取れるのかがわかれば、

アプリのアイデアも湧きやすいし、アイデアを実装に写すのにも役に立つはず。

• Kinectアプリに興味がある人は一緒に画像処理も勉強してみてはどうでしょうか

Recommended