今回の概要は
このように Kinect を複数台用意し、深度画像を
このように位置合わせして表示することです。
興味ある方はお付き合い下さい。
…
はい、タイトルから読める通り ARToolkit を使ってセンサの外部キャリブレーションを行います。
(外部キャリブレーションとは、センサの外部パラメータを求める操作のことです。)
カメラキャリブレーションについて詳しく知りたい方はコチラ↓
OpenCV カメラキャリブレーションと3次元再構成
簡単にまとめますと
内部パラメータ、レンズのひずみ係数を求める操作は直感的ではないですが数式は簡単です。
外部パラメータを求める操作は直感的なので理解は簡単ですが数式が複雑です。
外部キャリブレーションにて2次元の画像情報を元に3次元の姿勢行列を求めるのですが
これには非線形最小2乗法というものを使います。(反復して解に近づく計算方法)
で、私はそんな面倒くさい計算をしたくないがために今回 ARToolkit を使うことにしました。
ところでみなさんは AR をご存知でしょうか?
AR について詳しく知りたい方はコチラ↓
@IT - いまさら聞けないAR(拡張現実)の基礎知識
上記リンク先では AR のことを
現実世界を補う「何か」を追加することで、目の前にある現実以上の情報を提示する技術や、その技術によって表される環境そのもの
と紹介されていますね。
そして ARToolkit ではマーカーのカメラ座標系での姿勢行列を求めています。
これがまさにカメラの外部キャリブレーションでして、これで問題がすべて解決します。
そこで私は Kinect のカラーカメラ画像を入力に
マーカーの姿勢行列の逆行列(カメラの姿勢行列)を出力するアプリを製作しました。
キューブマーカーなのでセンサ配置について制約はありません。
アプリ実行時の様子
(モザイクの理由ですが、6畳という生活空間すべてをネットに晒す気になれませんでしたので…
いつかもっと広い空間で暮らしてみせます。ここに宣言します。)
この ARToolkit の Kinect 対応は誰が作っても同じになるはずなので、こちらは公開します。
Kinect を所持していて ARToolkit 試してみたい、という方には役に立つプロジェクトになると思います。
はい、出力されたファイルにはそれぞれの Kinect を識別するIDが打たれているので
これを読み込んで、外部キャリブレーション後のそれぞれの深度画像を表示するアプリを製作しました。
深度画像に対して手の平が垂直となると指の本数などの識別ができなくなりますが
複数のセンサでオクルージョン問題を解決することでこれを回避出来ます。
それを確信する結果を目の当たりにすることができるアプリです。
この距離画像の表示を行うアプリの方は公開しません。
さてさて、LeapMotion のデータでこういうことをしたかったのですが
API からは深度画像取れないそうですし、不具合が相次いで手元に届く年が不明なので
しばらくは Kinect で頑張って成果を出してみようと思います。
前回にお話した指、手の姿勢推定を行うライブラリは、肝となる計算部分の実装を終えました。
別のライブラリの開発に入ります。(今回は入力データの確認といった作業になります。)
それでは次回の更新をお楽しみに!
2013/05/12 初記。