Kinect
      深度情報処理入門
 伊藤 伸男       @akatukisiden

2012/11/24 新しい.NETStyle 勉強会Ver
自己紹介
本名: 伊藤 伸男                    HN:        暁 紫電
年齢:  25歳                     twitter: @akatukisiden

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

   使用言語                興味分野
       C++                 Windows クライアントア
       C++/CLI              プリ
       C#                  画像処理
                            etc…
はじめに
   このセッションは2012年09月29日に
    首都圏コンピュータ技術者株式会社で行われた
    個人事業主文化祭というイベントで行ったセッショ
    ンに
    加筆修正したものです。

   KinectSDKのバージョンは1.5
   画像処理にはOpenCV 2.2を用いています。
アジェンダ
   Kinectとは
   Kinectで出来る事
   なぜ深度に注目するのか
   解説とデモ
   まとめ
Kinectとは
   Microsoftが販売するゲーム機
    「Xbox 360」用のコントローラー

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

   2010年11月発売
Kinect ハック
   もともとはXboxでしか使えなかったが、
    PC用のドライバーを開発・公開する人があらわれる
   PC用のKinectアプリ開発
     (Kinect ハック)が ブームになる

   2012年2月
     Kinect for Windows 販売
      Kinect for Windows SDK 公開
        (Windows PC専用 商用利用可能)
Kinectで出来る事
RGBカメラ




     ※サンプルアプリ Kinect Explorerの映像を撮影
深度センサー




                   ※サンプルアプリ Kinect Explorerの映像を撮
                   影
   0.8m~4m(通常モード) or 0.4m~3m(Nearモード)
   13bit
スケルトントラッキング
(簡易モーションキャプチャー)




          ※サンプルアプリ Kinect Explorerの映像を撮
          影
   全身20箇所の関節などの座標と向きを取得
   上半身10箇所のみの取得も可能
   2人分まで取得可能
ユーザーの認識




                ※サンプルアプリ Kinect Explorerの映像を撮
                影
   最大6人まで認識可能(3bit)
   深度データ13bitと一緒に16bitデータとして取得
マイク




 音声の取得
 音源方向の認識
      (指向性マイク×4)
セッションタイトルでもわかるように、
    今回は深度センサー、
   深度情報の扱い(画像処理)
   に特化した話をします。
スケルトンがあるのに
なぜ深度に注目するのか
   そもそもスケルトンは深度から計算してる

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

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




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

   Kinectの返す情報は、
    ユーザー情報3bit,深度情報13bitの計16bit
   深度情報のみを表示する場合は3bitシフトして表示
    する。



     1   1   1   1   1     1
                               9   8   7   6   5   4   3    2   1   0
     5   4   3   2   1     0




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

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

   コールバック関数の登録を別スレッドで行うことで
    コールバック関数の実行も別スレッドで実行される。
深度情報の取得コールバック関数は
通常UIスレッドで実行されてしまう。




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




                    深度情報の取得
                    画像の処理が
                    UIスレッドで実行されて
                    しまっている
コールバック関数の登録を別スレッドで行うと
それが実行されるのも別スレッドになる。




       //別スレッド


                 深度情報の取得
                 画像の処理が
                 別スレッドで実行されて
                 いる
認識深度の絞込み
   Kinectから近すぎて要らないデータ、
    遠すぎて要らないデータは認識の邪魔なので、
    認識する最大値、最小値を決めて取り除く

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

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

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

   輪郭データからは外接矩形を取得できる
不定値の対処

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

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

画像を不定値による穴が塞がるまで膨張させ
 その後同じだけ収縮することで正常に認識させるこ
 とが出来る。
※縮小するのは膨張で画像全体が広がったのを
  もとに戻すため
膨張・縮小処理
   膨張処理
       注目している画素を
        その画素とその周囲の画素のうち一番濃い色にする。




   縮小処理
       注目している画素を
        その画素とその周囲の画素のうち一番薄い色にする。
周囲の定義
周囲の定義は要件に応じて8近傍、4近傍、
斜め,etc を使い分ける
今回は8近傍を使用

 8近傍      4近傍      斜め
通常   →   膨張
膨張   →   縮小
ろくろ回しポーズ検出に挑戦
   しきい値を手の辺りになるように調整。
   最も大きい2つの外接矩形が以下の条件を
    みたす場合を検出状態とする。
       両方とも縦長である。 (Height>Width)
       重なってない
       Y軸が重なっている
       X軸は重なっていない。
角度付き外接矩形
   腕の角度などが取れるので
   工夫すれば様々なジェスチャーを取得可能
輪郭画像の簡易取得
   二値データからの輪郭取得は
    内側でかなり複雑な処理をしてるはず。

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

   輪郭部分だけではなく、内側にも膨張縮小は適応
    されているので、
    二値化すると等高線状の画像が得られる。
まとめ
   近すぎ、遠すぎて要らないデータを削除する
   膨張・縮小処理で不定値による誤認識問題を解
    決
   しきい値処理で2値化
   輪郭・外接矩形等をの取得
   矩形の座標、サイズ、
    角度などによりジェスチャーを定義
最後に
   画像処理を用いれば深度情報から
    様々なデータが取得出来るはず。

   どんな処理でどんなデータが取れるのかがわかれば、
    アプリのアイデアも湧きやすいし、
    アイデアを実装に写すのにも役に立つはず。

   Kinectアプリに興味がある人は
    一緒に画像処理も勉強してみてはどうでしょうか
お仕事募集中
       決まりました。

Itou.Nobuo@gmail.com

Kinect深度情報処理入門

  • 1.
    Kinect 深度情報処理入門 伊藤 伸男 @akatukisiden 2012/11/24 新しい.NETStyle 勉強会Ver
  • 2.
    自己紹介 本名: 伊藤 伸男 HN: 暁 紫電 年齢: 25歳 twitter: @akatukisiden 職業: フリープログラマー  使用言語  興味分野  C++  Windows クライアントア  C++/CLI プリ  C#  画像処理  etc…
  • 3.
    はじめに  このセッションは2012年09月29日に 首都圏コンピュータ技術者株式会社で行われた 個人事業主文化祭というイベントで行ったセッショ ンに 加筆修正したものです。  KinectSDKのバージョンは1.5  画像処理にはOpenCV 2.2を用いています。
  • 4.
    アジェンダ  Kinectとは  Kinectで出来る事  なぜ深度に注目するのか  解説とデモ  まとめ
  • 5.
    Kinectとは  Microsoftが販売するゲーム機 「Xbox 360」用のコントローラー  コントローラーを持つ必要が無く、身体の動きや、 ジェスチャー、音声などによる操作が可能なことが 特徴 NUI (Natural User Interface)  2010年11月発売
  • 6.
    Kinect ハック  もともとはXboxでしか使えなかったが、 PC用のドライバーを開発・公開する人があらわれる  PC用のKinectアプリ開発 (Kinect ハック)が ブームになる  2012年2月 Kinect for Windows 販売 Kinect for Windows SDK 公開 (Windows PC専用 商用利用可能)
  • 7.
  • 8.
    RGBカメラ ※サンプルアプリ Kinect Explorerの映像を撮影
  • 9.
    深度センサー ※サンプルアプリ Kinect Explorerの映像を撮 影  0.8m~4m(通常モード) or 0.4m~3m(Nearモード)  13bit
  • 10.
    スケルトントラッキング (簡易モーションキャプチャー) ※サンプルアプリ Kinect Explorerの映像を撮 影
  • 11.
    全身20箇所の関節などの座標と向きを取得  上半身10箇所のみの取得も可能  2人分まで取得可能
  • 12.
    ユーザーの認識 ※サンプルアプリ Kinect Explorerの映像を撮 影  最大6人まで認識可能(3bit)  深度データ13bitと一緒に16bitデータとして取得
  • 13.
  • 14.
    セッションタイトルでもわかるように、 今回は深度センサー、 深度情報の扱い(画像処理) に特化した話をします。
  • 15.
    スケルトンがあるのに なぜ深度に注目するのか  そもそもスケルトンは深度から計算してる  スケルトンでは体勢・距離・設置場所などに 制限がかかる (正面に配置 全身or 上半身が写る必要がある。)  深度+画像処理 (+RGBカメラ)なら 画像処理の知識次第で様々なデータや、 ジェスチャーが取得できるはず。
  • 16.
  • 17.
    深度情報の取得  Kinectの返す情報は、 ユーザー情報3bit,深度情報13bitの計16bit  深度情報のみを表示する場合は3bitシフトして表示 する。 1 1 1 1 1 1 9 8 7 6 5 4 3 2 1 0 5 4 3 2 1 0 深度情報(13bit) ユーザー情報(3bit)
  • 18.
    深度情報取得コールバック関数の 実行スレッド  深度情報の取得時に呼び出されるコールバック関数 は、 通常UIスレッドで実行されてしまう。  取得した深度情報は、表示するまでに様々な処理を 加える場合があり、これらの処理をUIスレッドで行 うと、 UIスレッドをブロックしてしまい、操作に対するレ スポンスが悪くなってしまうため、 深度情報の処理は別スレッドで処理を行いたい。  コールバック関数の登録を別スレッドで行うことで コールバック関数の実行も別スレッドで実行される。
  • 19.
  • 20.
    コールバック関数の登録を別スレッドで行うと それが実行されるのも別スレッドになる。 //別スレッド 深度情報の取得 画像の処理が 別スレッドで実行されて いる
  • 23.
    認識深度の絞込み  Kinectから近すぎて要らないデータ、 遠すぎて要らないデータは認識の邪魔なので、 認識する最大値、最小値を決めて取り除く  (画像処理ライブラリOpenCVを使用する場合) 処理内容によっては処理対象が 8bitの画像でなければならない場合があるので ついでに255で割って8bit化する
  • 25.
    しきい値処理で二値化(白黒画像化)  0~255(8bit化済み)の適当な値を基準にして 白黒2色の画像に変換する。  白黒画像であれば、輪郭データを抽出可能  輪郭データからは外接矩形を取得できる
  • 29.
    不定値の対処  光の反射や、Kinectとの角度などが理由で深度を上 手く取得できない箇所がある。(不定値)  これのせいでジェスチャーなど を思うように認識できない場合がある。 画像を不定値による穴が塞がるまで膨張させ その後同じだけ収縮することで正常に認識させるこ とが出来る。 ※縮小するのは膨張で画像全体が広がったのを もとに戻すため
  • 30.
    膨張・縮小処理  膨張処理  注目している画素を その画素とその周囲の画素のうち一番濃い色にする。  縮小処理  注目している画素を その画素とその周囲の画素のうち一番薄い色にする。
  • 31.
  • 32.
    通常 → 膨張
  • 33.
    膨張 → 縮小
  • 35.
    ろくろ回しポーズ検出に挑戦  しきい値を手の辺りになるように調整。  最も大きい2つの外接矩形が以下の条件を みたす場合を検出状態とする。  両方とも縦長である。 (Height>Width)  重なってない  Y軸が重なっている  X軸は重なっていない。
  • 37.
    角度付き外接矩形  腕の角度などが取れるので  工夫すれば様々なジェスチャーを取得可能
  • 39.
    輪郭画像の簡易取得  二値データからの輪郭取得は 内側でかなり複雑な処理をしてるはず。  外接矩形や、座標データなどが必要なく、 輪郭を表示だけすればいい場合、 元の画像を膨張させた画像から縮小させた画像を 引くことで簡単に輪郭を取得できる  輪郭部分だけではなく、内側にも膨張縮小は適応 されているので、 二値化すると等高線状の画像が得られる。
  • 43.
    まとめ  近すぎ、遠すぎて要らないデータを削除する  膨張・縮小処理で不定値による誤認識問題を解 決  しきい値処理で2値化  輪郭・外接矩形等をの取得  矩形の座標、サイズ、 角度などによりジェスチャーを定義
  • 44.
    最後に  画像処理を用いれば深度情報から 様々なデータが取得出来るはず。  どんな処理でどんなデータが取れるのかがわかれば、 アプリのアイデアも湧きやすいし、 アイデアを実装に写すのにも役に立つはず。  Kinectアプリに興味がある人は 一緒に画像処理も勉強してみてはどうでしょうか
  • 45.
    お仕事募集中 決まりました。 Itou.Nobuo@gmail.com