Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Kinect深度情報処理入門

15,073 views

Published on

  • Be the first to comment

Kinect深度情報処理入門

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

×