プロジェクタキャリブレーション (projector calibration) |
2017-07-14 - 2018-11-20 (update) |
|
|
プロジェクタは,設定した画像を3次元空間に投影する装置です.光の進行方向はカメラとは逆ですが,投影先の3次元の位置と画像上の位置の関係は,カメラと同じように[link:カメラモデル]を使って表現できます.
*プロジェクタキャリブレーション とは
プロジェクタの内部パラメータと外部パラメータを求める処理を指します.他に色やピントのずれを求める処理を指す場合も有りまが,ここでは幾何的な部分についてのみ説明します.
まず,内部パラメータとは,プロジェクタの個体ごとに異なる焦点距離や画像中心のずれ,レンズ歪みの具合などを表すパラメータです.外部パラメータとは,プロジェクタの位置姿勢を表すパラメータです.一般的にはカメラを基準とした位置姿勢を求めることになります.そのためプロジェクタキャリブレーションは,プロジェクタ・カメラシステムのキャリブレーションとも呼びます.
プロジェクタキャリブレーションを行うことで,プロジェクタとカメラを使ったアクティブステレオやプロジェクションマッピングなどの応用が実現できます.
[link:カメラキャリブレーション]の時と同じく,平面のボードを利用する方法が一般的だと思います.ボードを使う方法は,例えば[1]や[2]の文献に紹介されています.具体的には,図1に示す様にボードに対してパターンを投影し,その見え方を手掛かりにキャリブレーションを行います.
{{small:マーカーとパターンの種類は,位置を認識できるものなら何でもよいです.[1],[2]の文献では市松模様を使う例が紹介されています.}}
[img:d7yn]
{{small:図1 カメラとプロジェクタの配置}}
次の動画は,プロジェクタからドット模様のパターンを投影し,それを画像上で検出した例を紹介しています.
[youtube:sC4fbthcUrA]
{{small:黒のマーカーの検出結果は青点で,パターンの検出結果は緑点で表示しています}}
{{small:投影するパターンは,ドットのサイズを大小変化させてコード化していて,投影元の画像上での位置との関係を対応付けられるようになっています.}}
[youtube:Npd0rKHBH_w]
{{small:[3]の文献で紹介されている方法で,マーカーに干渉しないようにパターンを投影します.}}
{{small:[1]D.Moreno, G.Taubin, "Simple, Accurate, and Robust Projector-Camera Calibration", 3D Imaging, Modeling, Processing, Visualization and Transmission (3DIMPVT), 2012}}
{{small:[2]松下康之(著), 古川泰隆(著), 川崎洋(著), 古川 亮 (著), 佐川立昌(著), 八木康史(編集),
斎藤英雄(編集), "コンピュータビジョン最先端ガイド5 (CVIMチュートリアルシリーズ)", アドコム・メディア, 2012}}
{{small:[3]L.Yang, J.M.Normand, G.Moreau, "Practical and precise projector-camera calibration", IEEE International Symposium on Mixed and Augmented Reality (ISMAR), 2016}}
*サンプルコード (C++)
ライブラリ:[link:simplesp]
サンプルコード:simplesp/sample/cv/dotpattern
プロジェクタから投影するパターンをWebカメラの画像上で検出します.
上記のデモ映像のようにボードの姿勢を変えて何枚か撮影することで,プロジェクタの内部パラメータと外部パラメータを推定します.
マーカーとして利用するドット模様の画像はsimplesp/data/markerにあります.紙に印刷して利用してください.
プロジェクタに投影する画像は,プログラムの実行時に生成されます.
サンプルプログラムの7行目に解像度を設定する部分があるので,使用するプロジェクタの解像度に合わせて書き換えておく必要があります.
{#const DotPatternParam ptn(1280, 720);#}
プログラムを実行した後,画像が保存されているのでそれをプロジェクタから投影されるように指定します.
WindowsPCの場合,ペイントの全画面表示の機能が便利です.
**撮影時の注意点
・撮影ごとにボードの配置は変える
{{small:同じ見え方の画像を何枚も撮影してもほとんど意味がありません.角度や位置のバリエーションを変えて撮影してください.}}
・ピンボケやブラーはできるだけ抑える
{{small:ドットの検出精度が落ちるような条件では,キャリブレーションの精度も悪くなります.}}
*アルゴリズム
ここでは,プロジェクタキャリブレーションの処理の手順を説明します.
1.カメラの画像上からマーカーの位置{$M_C$}とパターンの位置{$P_C$}を検出
2.検出結果とボード上のマーカーの位置{$M_B$}の情報からボード上のパターンの位置{$P_B$}を計算
3.ボード上のパターンの位置{$P_B$}とプロジェクタの画像上のパターンの位置{$P_P$}からプロジェクタのパラメータを計算
上記,”位置”の表記は,点群のそれぞれの位置と考えてください.
ここで登場する要素を,図2にまとめて示します.
[img:dz1m]
{{small:図2 プロジェクタキャリブレーションに登場する要素}}
**1.カメラの画像上からマーカーとパターンを検出
カメラの画像上にはマーカーとパターンの両方の情報が混ざっていて,少し検出が難しくなっています.そこで,まずは2つの情報を分離する方法を考えます.例えば,マーカーとパターンの色を変える方法や,パターンのON/OFFを切り替える方法が良く利用されます.それ以外にも,周波数やサイズのヒント使って分離できる場合もあります.説明は省略しますが,サンプルプログラムではドット模様のサイズが比較的小さいことを利用して,メディアンフィルタを使って分離させます.他にも,文献[3]にあるように,マーカーとパターンの干渉を回避させる方法も有効そうです.
**2.ボード上のパターンの位置を計算
キャリブレーションを行う上ために,3次元空間中の位置と画像上の位置が必要になります.パターンに注目した場合,プロジェクタの画像上での位置は既知なので,必要になるのは3次元空間中のボード上の位置です.
それを得る準備として,カメラの画像とボードとの間のホモグラフィを推定します.ホモグラフィは,{$M_C$}と{$M_B$}から計算できます.
次に,ホモグラフィ{$H$}を使って,カメラの画像上のパターンの位置{$P_C$}からボード上のパターンの位置{$P_B$}を計算します.
**3.カメラの画像上からマーカーとパターンを検出
ボード上のパターンの位置{$P_B$}とプロジェクタの画像上のパターンの位置{$P_P$}からプロジェクタのパラメータを計算します.この操作は,通常のカメラのキャリブレーションと同じ関数を使えば計算できます.
>> ご意見・ご質問など お気軽にご連絡ください.info