Kinectセンサはどういった原理で動いているのか?
今回からMicrosoftのKinectセンサの3D撮影の原理を紹介します。また、そのKinectセンサで撮影できる3Dデータはどういう構造のデータで、どういう撮影条件であれば安定して撮影できるかについても紹介します。これにより、その後に紹介していくRGBDセンサの各応用を理解するために必要な基礎的知識の準備となると思います。商用製品であるKinectは測定原理がすべて公開されているわけではありせんので、Primesenseが公開している技術資料などから予測できる範囲で紹介します。またその後、同じく動画で距離画像が撮影できる別方式である「ToF(Time of Flight)方式」の原理についても少し紹介します。
本稿を執筆時点(2013年11月)では、Microsoftが新しいXbox One向けの新Kinectの発売を発表済みであり、その新Kinectでは撮影方式がToF方式に変更されたものになることが判明しています。これ以降、新Kinectと現行販売されているKinectを呼び分けるため、便宜上PrimeSenseからデバイスの基本的な部分が提供されている現行のKinectを「Kinect」と、Xbox Oneに搭載が予定されているToF形式のものを「Kinect2」と、それぞれ呼び分ける事にします。
以前の回ですでに紹介したように、Kinect登場以前にも、対象に既知のパターンを投影してステレオ撮影を行う「アクティブステレオ法」により3D形状を撮影する3Dセンサ製品は数多く存在していましたが、いずれも高価であったり、静止画として1ショット撮影しかできない(つまりは動画として各フレームの3Dデータを撮影することはできない)製品がほとんどでした。これに対して30fpsによる動画での距離画像撮影を安価で実現できた初めての商用3DセンサがKinectです。それではまずは3D撮影の原理を紹介していくことにしましょう。
Kinectの3D撮影の原理
Kinectセンサは、赤外線レーザーで構造化光の単一のパターンを赤外線カメラで対象物体に投影した状態で対象を撮影し、(工場出荷時にキャリブレーションしておいた)パラメータを用いて三角測量により画像上の各点のデプスを算出する3Dセンサです。投影しているパターンは赤外性(Infra Red)レーザーで投影されているので、我々の目には見えません。
以下の動画は、赤外線領域も撮影できるカメラにより、Kinectが投影しているパターンを撮影した動画です。
Kinectの撮影パターン |
Kinectは、この動画で見られるような単一の投影パターン(ランダムなドットがちりばめられた大きな四角形パターン)を常に対象表面に投影しておき、撮影した画像からパターン内の各場所の移動量を画像処理でとらえることにより、赤外線カメラで撮影した動画のすべてのフレームにおいて3次元計測を行うことを実現しています。以前、紹介した平行等位ステレオと同じく、デプスの値の違いが水平直線(エピポーラ線)上での左右のシフト量に対応します(下図:Kinectの3D撮影の原理を参照)。
Kinectの投影パターンは単なるランダムなまだら模様で規則性などないように見えますが、このパターン中には小さい局所的なパターンが連続的に多数埋め込まれており、その局所パターンの位置をKinect内部の計算チップで高速パターンマッチングにより特定したのち、そのパターンの場所が画像上で左右にどれだけシフトしたかを計算することでデプスを算出していると思われます(繰り返しておきますが、あくまで予想です)。
Kinectに限りませんが、アクティブステレオ法の処理は「準備(キャリブレーション)」と「テスト(実際の撮影)」の2段階構成です。まずキャリブレーションの処理では、既知のパターンについて「パターン中の各点がどれだけ移動(シフト)すると、デプスがどういった値に変化するか」というパラメータを、単純で正確な物体(平面や立方体など)を撮影することで、カメラ歪みも補正しながらあらかじめ求めておきます。そしてテスト時には、撮影した画像の各点が既知パターンのどの位置に相当するかを画像処理(テンプレートマッチングなど)で求め、あとはキャリブレーションで求めておいたパラメータからその画素のデプスの値が直接計算できるという処理の流れです。