Kinect プログラミングの道しるべ

Kinect プログラミングの道しるべ
橋本 直
独立行政法人科学技術振興機構/工学ナビ
[email protected]
Kinect は,家庭用ゲーム機である Xbox 用の外部機器として販売されているゲームデバイスです.プレイヤ
ーの位置やジェスチャ,声,顔を認識することができ,人の身体を丸ごとコントローラ化することができます.
Kinect は USB デバイスなので,PC に接続して使うこともできます.本稿では,Kinect プログラミングを始
めるための道しるべとなる情報を集めましたので,参考にしてください.
Kinect とは
Kinect は,普通のカラーカメラに加え,赤外線カメラと赤外線レーザプロジェクタを搭載しています.赤外
線レーザプロジェクタから空間に投影された見えない赤外線のパターンを,赤外線カメラで読み取ることによっ
て,奥行きを計測しています(この手法を LightCoding と呼びます)
.デプスカメラ自体は以前から存在してい
ましたが,家庭用ゲーム機の外部機器として売れるほど「安価で」
「安定した」ものが登場した,ということで一
躍注目の的となりました.
赤外線レーザプロジェクタ
赤外線カメラ
カラーカメラ
図1 Kinect の外観
Kinect の入出力デバイス
Kinect に搭載されている入出力デバイスの一覧を表1に示します.Kinect はカメラ以外にも,マイクや加速
度センサなどを搭載しています.マイクは音声を取るだけでなく,音源の位置を推定するために4個搭載されて
います.また,本体を水平にするために,傾きを検知するための加速度センサと,上下の傾きを修正するための
モータが搭載されています.本体の動作状態を表示するために LED が付いていますが,これもプログラムから
コントロールできる仕様になっています.
表1 Kinect の入出力デバイス
入出力デバイス
取得または制御できる情報
カラーカメラ
カラー画像
(視野角度は垂直方向 43°,水平方向 57°)
赤外線カメラ + 赤外線レーザプロジェクタ
赤外線画像
深度画像 (距離画像とも言う)
マイクアレイ(4個)
音声,音源位置
3軸加速度センサ
本体の傾き情報
LED
点灯制御(緑・赤・オレンジ)
モータ(台座内)
本体の傾きの制御(±28deg)
さまざまな画像情報
Kinect はデプスカメラとしての使い方がメインになります.ここでは Kinect で利用する主な画像情報につい
て説明します.
カラー画像
ごく一般的な画像データです.画素ごとにRGB(赤・緑・青)の色情報
を持ちます.サイズは 640x480.
深度画像
画素ごとに奥行き方向の距離情報を持つ画像データです.距離画像とも呼
びます.この情報をもとに,物体までの距離や,物体の形状を知ることが
できます.サイズは 640x480.
赤外線画像
赤外線カメラで撮影されたグレイスケールの画像です.赤外線プロジェク
タから投影されたドットパターンを見ることができます.サイズは
640x480.赤外線ドットパターンの投光は OFF にできないようなので,
赤外線カメラとして使いたい場合は何かしら工夫が必要です.
人物の形状データ
深度画像から人物領域のみを抽出して作成した画像データです.ライブラ
リによってデータ表現が異なりますが,基本的に,画素値をユーザ ID とす
るような2次元の画像データです.このデータを使えば,カメラ画像から
人物領域のみを切り出すこともできます.
骨格情報
人物領域の情報をもとに計算された関節の位置情報です.ボーンあるいは
スケルトンとも呼びます.頭・手・肩・胴・脚などの関節について,画像
上の座標値(x,y)と,空間中の座標値(X,Y,Z)の両方を得ることができ
ます.
ドライバと開発環境
Kinect を PC で使えるようにするためのドライバと,それを用いたプログラム開発環境(ライブラリ)は大
きく分けて3種類に分けられます.それぞれ利用可能な OS,言語,機能が異なりますので,目的と環境に合わ
せて選んでください.また,複数インストールすると,競合する場合がありますので注意してください.
(A)Kinect for Windows SDK(公式 SDK)
概要
Kinect プログラミングのための,マイクロソフト公式の SDK.Kinect 用ドライバとプログラ
ミング環境を含む.
配布サイト
http://kinectforwindows.org/
対応 OS
Windows7
言語
C++,C#
できること
カメラ画像/深度画像の取得
ユーザ検出
スケルトントラッキング
チルトモータ制御,
音源位置推定
ビームフォーミング(特定方向の音声認識)
ストリームの保存
ノイズ除去
性能
深度画像の最大画素数:640x480
取得可能範囲:80cm~4m
同時ユーザ認識数:最大6人
同時スケルトントラッキング数:最大2人
検出可能な関節数:20 箇所
特徴
・スケルトントラッキングをするためのキャリブレーションポーズをとる必要がない
・音声処理 API を持っている
・トラッキングの精度が高く,高速に動作
拡張
Kinect for Windows SDK にジェスチャ認識,ポーズ認識を追加できる C#のオープンソース
ライブラリとして,Kinect ToolKit(http://kinecttoolkit.codeplex.com/)がある.認識でき
るポーズは,ポーズなし,手を合わせたポーズ,左手を頭より上に挙げたポーズ,右手を頭より
上に挙げたポーズ,左手であいさつ,右手であいさつ,など.
(B)OpenNI
概要
Kinect の深度センサを開発した PrimeSense 社が中心となって進めているプロジェクト(NI は
Natural Interaction の略)
.NITE と呼ばれるミドルウェアがあり,通常これとセットで使う.
配布サイト
http://openni.org
対応 OS
Windows,Mac OS X,Linux
言語
C++,C#,Java,Processing,Python,AIR
できること
カメラ画像/深度画像/赤外線画像の取得
深度画像に位置合わせをしたカメラ画像の取得
ユーザ検出
スケルトントラッキング
ハンドトラッキング
ジェスチャ認識
録画と再生
性能
深度画像の最大画素数:1024x768
取得可能範囲:50cm~9m
同時ユーザ認識数:最大 15 人
同時スケルトントラッキング数:6人程度?
検出可能な関節数:15 箇所
特徴
・デプスカメラ Xtion Pro にも対応
・OpenCV との連携あり
備考
OpenNI のミドルウェアである NITE には,スケルトントラッキング,ハンドトラッキング,ジ
ェスチャ認識機能が含まれる.認識できるのは,手の静止,手の前後運動,手の円運動,手を軽
く振る運動,手の上下左右のスワイプなど.
派生
さまざまなラッパーが存在する.
ONIPY
Python ラッパー
ofxOpenNI
openFrameworks アドオン
OpenNI Unity Wrapper
Unity
simple-openni
Processing ラッパー
kinectas
AIR アプリケーションでスケルトントラッキング
(C)libfreenect
概要
OpenKinect というプロジェクトで開発されているドライバ.
配布サイト
http://github.com/openkinect/libfreenect
対応 OS
Windows,Mac OS X,Linux
言語
C,C++
できること
カメラ画像/深度画像/赤外線画像の取得
深度画像に位置合わせをしたカメラ画像の取得
加速度センサの値の取得
チルトモータの制御
LED の制御
特徴
スケルトントラッキングなどの解析機能は持たないが,各センサの生データをシンプルかつ高速
に取得することができる.
派生
Python,ActionScript,C#のラッパーが存在する
flKinect http://kimulabo.jp/
Kinect を使うためのソケットサーバーアプリケーション+Action Script クラス
参考文献
Kinect プログラミングのための参考になる書籍を紹介します.
●KINECT センサープログラミング(中村薫 | 秀和システム)
最初に出版された Kinect 本です.C++および C#における OpenNI と NITE を使ったプログラミングについて
解説しています.OpenNI でのプログラミングをやる場合は頼もしいリファレンスになります.
●キネクト ハッカーズマニュアル(西林 孝,小野 憲史 | ラトルズ)
Kinectの開発環境の比較,
インストール方法,
OpenNIプログラミング,
OpenCVとの連携,
openFrameworks
や ActionScript での Kinect の使い方などについて,広く浅く解説しています.世の中で発表されている作例
なども紹介されているので,Kinect プログラミングの雰囲気を知るには良い本です.本稿における開発環境の
比較の部分は,この本を参考にしました.
●KINECT センサー画像処理プログラミング (谷尻 豊寿|カットシステム)
公式 SDK および OpenNI を用いた C++でのプログラミングについて,こってり書いてあります.公式 SDK を
使ったコードについて知りたければこの本がおすすめです.
●フィジカルコンピューティングを仕事にする(小林茂ほか|ワークスコーポレーション)
Web カメラ,マイク,Wii リモコン,Kinect,Arduino などのデバイスを使ったものづくりについて書かれた
本です.Kinect と Flash の連携について,ソケットサーバを自分で作る方法と,kinectas を使う方法の2種類
が紹介されています.実際のビジネスでの活用事例の紹介もあり,興味深いです.
参考 Web サイト
わからないことは Google で調べればかなりの量の情報がヒットしますが,有名どころを紹介しておき
ます.
●かおるんダイアリー http://d.hatena.ne.jp/kaorun55/
書籍「KINECT センサープログラミング」の著者・中村薫氏によるブログ.最新の Kinect 界隈の動向を知るの
に良い.同氏の Twitter も参考になる(@ kaorun55)
.
●totakke website http://www.cyber.t.u-tokyo.ac.jp/~take/kinect/
東京大学・竹内俊貴氏の Web サイト.Kinect のプログラミング環境のセットアップ手順などの詳しい解説があ
る.これらの情報は Kinect Wiki(http://www.kinect-wiki.info/)のほうに順次移行する模様.
●Kosaka laboratory http://www.kosaka-lab.com/tips/
神奈川工科大学・小坂崇之先生の研究室の Web サイト.OpenNI と公式 SDK(特に XNA での開発)の TIPS
が豊富にある.Kinect プログラミングのデバッグのために開発された KINECT DOLL は必見.
●C#開発者が“Kinect ハック”に挑戦してみた - @IT
http://www.atmarkit.co.jp/fdotnet/special/kinecthack01/kinecthack01_02.html
有名どころの Kinect 作品の動画の紹介と,OpenNI + C#でのプログラミングの導入までの解説.ざっと雰囲気
を知るには良い記事.
Kinect ソケットサーバ KineX
現在,私の研究プロジェクトでも,Kinect の骨格データ(2次元
および3次元)をネットワーク経由で放流するソケットサーバを作成
しています.これを用いれば,ソケット通信が行える言語およびハー
ドウェア(例えば,Flash やスマートフォン)において,Kinect を
使ったアプリケーションを作成することができます.
・KineX 配布サイト
http://kougaku-navi.net/kinex/
・公式 SDK のドライバを使用しています.KinectSDK v1.0 beta2 をインストールしてください.
http://kinectforwindows.org/download/