狠狠撸

狠狠撸Share a Scribd company logo
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とは
?   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 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 上半身が写る必要がある。)

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




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

?   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

More Related Content

碍颈苍别肠迟深度情报処理入门

  • 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とは ? 碍颈苍别肠迟で出来る事 ? なぜ深度に注目するのか ? 解説とデモ ? まとめ
  • 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専用 商用利用可能)
  • 8. 搁骋叠カメラ ※サンプルアプリ 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データとして取得
  • 14. セッションタイトルでもわかるように、 今回は深度センサー、 深度情報の扱い(画像処理) に特化した話をします。
  • 15. スケルトンがあるのに なぜ深度に注目するのか ? そもそもスケルトンは深度から計算してる ? スケルトンでは体勢?距離?設置場所などに 制限がかかる (正面に配置 全身or 上半身が写る必要がある。) ? 深度+画像処理 (+搁骋叠カメラ)なら 画像処理の知識次第で様々なデータや、 ジェスチャーが取得できるはず。
  • 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スレッドをブロックしてしまい、操作に対するレ スポンスが悪くなってしまうため、 深度情報の処理は別スレッドで処理を行いたい。 ? コールバック関数の登録を別スレッドで行うことで コールバック関数の実行も別スレッドで実行される。
  • 20. コールバック関数の登録を別スレッドで行うと それが実行されるのも別スレッドになる。 //別スレッド 深度情報の取得 画像の処理が 別スレッドで実行されて いる
  • 23. 認識深度の絞込み ? Kinectから近すぎて要らないデータ、 遠すぎて要らないデータは認識の邪魔なので、 認識する最大値、最小値を決めて取り除く ? (画像処理ライブラリOpenCVを使用する場合) 処理内容によっては処理対象が 8bitの画像でなければならない場合があるので ついでに255で割って8bit化する
  • 25. しきい値処理で二値化(白黒画像化) ? 0~255(8bit化済み)の適当な値を基準にして 白黒2色の画像に変換する。 ? 白黒画像であれば、輪郭データを抽出可能 ? 輪郭データからは外接矩形を取得できる
  • 29. 不定値の対処 ? 光の反射や、Kinectとの角度などが理由で深度を上 手く取得できない箇所がある。(不定値) ? これのせいでジェスチャーなど を思うように認識できない場合がある。 ?画像を不定値による穴が塞がるまで膨张させ その後同じだけ収縮することで正常に認識させるこ とが出来る。 ※縮小するのは膨张で画像全体が広がったのを もとに戻すため
  • 30. 膨张?縮小処理 ? 膨张処理 ? 注目している画素を その画素とその周囲の画素のうち一番濃い色にする。 ? 縮小処理 ? 注目している画素を その画素とその周囲の画素のうち一番薄い色にする。
  • 32. 通常 → 膨张
  • 33. 膨张 → 縮小
  • 35. ろくろ回しポーズ検出に挑戦 ? しきい値を手の辺りになるように調整。 ? 最も大きい2つの外接矩形が以下の条件を みたす場合を検出状態とする。 ? 両方とも縦長である。 (Height>Width) ? 重なってない ? Y軸が重なっている ? X軸は重なっていない。
  • 37. 角度付き外接矩形 ? 腕の角度などが取れるので ? 工夫すれば様々なジェスチャーを取得可能
  • 39. 輪郭画像の簡易取得 ? 二値データからの輪郭取得は 内側でかなり複雑な処理をしてるはず。 ? 外接矩形や、座標データなどが必要なく、 輪郭を表示だけすればいい場合、 元の画像を膨张させた画像から縮小させた画像を 引くことで簡単に輪郭を取得できる ? 輪郭部分だけではなく、内側にも膨张縮小は適応 されているので、 二値化すると等高線状の画像が得られる。
  • 43. まとめ ? 近すぎ、遠すぎて要らないデータを削除する ? 膨张?縮小処理で不定値による誤認識問題を解 決 ? しきい値処理で2値化 ? 輪郭?外接矩形等をの取得 ? 矩形の座標、サイズ、 角度などによりジェスチャーを定義
  • 44. 最後に ? 画像処理を用いれば深度情報から 様々なデータが取得出来るはず。 ? どんな処理でどんなデータが取れるのかがわかれば、 アプリのアイデアも湧きやすいし、 アイデアを実装に写すのにも役に立つはず。 ? Kinectアプリに興味がある人は 一緒に画像処理も勉強してみてはどうでしょうか
  • 45. お仕事募集中 決まりました。 Itou.Nobuo@gmail.com