プロジェクタとカメラのキャリブレーションソフトを書いてみた
今回は、以前からGitHubで公開しているプロカムキャリブレーションのソフトウェアについて軽い紹介記事を書いてみます。
もくじ
余談
最近プロジェクタから画像を映す行為は「投影」ではなく「投写」と言う方が正しいのではないか、という議論を耳にしました。 どちらも英語にすると"projection"なので、文献調査のときはあまり気にしていなかったのですが、プロジェクタを作っている企業のページを見て回ると確かにどこも「投写」を使っているようです。
ということでこの記事では「投写」の方を使って書いていきます。 以前の記事で「投影」と書いてしまっている箇所もあると思いますが、そこは目をつむってください。
ちなみに「再投影誤差(re-projection error)」は意味合い的に「投影」で合っている気がするので、そのまま使っていくことにします。
1. プロカムシステムのキャリブレーションとは?
今回作成したのは、プロジェクタとカメラを使ったシステム(いわゆるプロカムシステム)においてプロジェクタとカメラの幾何較正を行うためのソフトウェアです。
プロジェクションマッピング(特に動的なオブジェクトに対するプロジェクションマッピング)や計測パターンを使った形状計測などでは、しばしばプロジェクタとカメラを併用したシステムを組むことがあります。 プロジェクタから何かしらのパターン画像を投写した様子をカメラから撮影し、画像処理にかけることで、オブジェクトの位置姿勢を追跡したり物体の精密な形状を計算したりということが可能になるからです。
そして、こうした処理を行うためにはプロジェクタの投写領域・カメラの画角・カメラの歪み・プロジェクタの歪み・プロジェクタとカメラの位置関係といった情報が必要になります。
今回のソフトウェアは事前にこれらのパラメータを較正しておくためのものです。
2. キャリブレーションの原理
2.1. 基本的な考え方
基本的な考え方はカメラキャリブレーションと全く同じです。 カメラキャリブレーションの原理については以前の記事で詳しく説明しているのでよければ読んでみてください。
まず前提として、使用するカメラはレンズ歪みを考慮したピンホールカメラモデルで表現できるものと仮定します。 つまりピンホールの一点に集まってきた光を平面状の撮像素子に写し込んでいるようなモデルであると考えます。
またプロジェクタも光の進行方向が逆であるカメラモデルとして表現できると仮定します。
するとプロカムシステムのキャリブレーションはステレオカメラのキャリブレーションと全く同じものであると考えることができます。 つまり「相対位置がわかっているマーカー群(チェッカーボードやドットパターン)を2台のカメラで撮影したときにどう写り込むのか」という情報をたくさん集めて、再投影誤差を最小にするようなカメラパラメータを求めればいいわけです。
2.2. 投写画像との対応点の取得
ここで問題になるのが、プロジェクタの方の「マーカーがどう写り込むのか」の情報をどうやって計算するのかという点です。 普通はチェッカーボードやドットパターンの板をカメラで撮影して画像処理にかけることで計算するわけですが、プロジェクタは画像を撮影する機器ではなく画像を投写する機器なのでそれができません。
そこでよく利用されるのがプロジェクタからパターン画像を投写する方法です。 結局は「相対位置がわかっているマーカー群と画像平面上の対応関係」がわかればいいので、パターン画像を投写したときにマーカー群の上にどのようにパターン画像が乗るのかを調べることで同等の情報が得られます。
今回のソフトウェアでは、チェッカーボードの上にグレイコードパターンを投写することで、チェッカーボードの各コーナーと投写画像の二次元座標の対応関係を取得しています。 グレイコードを使った空間コード化法については以前の記事で解説しているのでこちらを参照してください。
しかし、単にチェッカーボードのコーナーが含まれている画素のグレイコードをデコードしても、計算される二次元座標は整数値つまりピクセル精度になってしまいますし、細かいグレイコードパターンを投写したときはデコード自体に失敗する可能性もそこそこ高いです。
そこで今回は以下の論文に従ってローカルホモグラフィーを計算する方法を採用しました。
MORENO, Daniel; TAUBIN, Gabriel. Simple, accurate, and robust projector-camera calibration. In: 3D Imaging, Modeling, Processing, Visualization and Transmission (3DIMPVT), 2012 Second International Conference on. IEEE, 2012. p. 464-471.
コーナー周辺の一定範囲の画素でグレイコードをデコードし、その狭い領域についてカメラ画像平面から投写画像へのホモグラフィーを計算することで、コーナーと対応する投写画像上の二次元座標を計算しています。
こうしておけば、コーナー周辺の一定数以上の画素でデコードに成功しさえすれば二次元座標をサブピクセル精度で推定できるので、そこそこロバストに機能するようになります。
2.3. 計測回数について
ちなみにもとの論文ではチェッカーボードの姿勢を変えずに1度だけグレイコードを投写することでキャリブレーションを行っています。 いわゆるone-shot系の手法です。
原理上、求めたいパラメータの数 < 取得された対応関係の数 × 2 であれば1度の撮影でキャリブレーションすることは可能なのです。
しかし、この手法ではカメラの画角とカメラの設置位置のトレードオフをホモグラフィーの歪み具合だけから推定することになるので精度が悪化します。 カメラの画角と設置位置をうまく推定できないということは、チェッカーボードを設置した場所以外の奥行きに物を置いたときに矛盾が生じてくるということです。
もとの論文は比較的小さなオブジェクトの形状計測を目標としているので、狭い領域で近似的に使えるパラメータさえ求まれば良いというモチベーションなのかもしれませんが、一般的なユースケースでは正確なパラメータを計算したいところです。 そこで、今回のソフトウェアではチェッカーボードの姿勢を変えながら複数回撮影することを前提に実装しています。
3. ソフトの使い方
使い方についてはREADME.mdを参照してください。 拙い英語ですが、割と丁寧に書いたので頑張れば読み取れるはずです笑。
以上、自前のプロカムキャリブレーションソフトについて解説してみました。