Camera calibration
カメラキャリブレーションは、既知のキャリブレーション対象を撮影した画像から、内部パラメータ行列 とレンズの歪みパラメータを求める処理である。正確なキャリブレーションがなければ、三角測量、ポーズ推定、エピポーラ探索など、以降のあらゆる幾何計算は系統的に誤ったものになる。
Zhangの方法
Zhangの方法(1999年)は標準的なキャリブレーション手順である。これは、複数の視点から撮影された平面チェッカーボードの画像を使用する。各画像は、既知の3Dボードコーナーと検出された2D画像コーナー間の対応関係を提供し、ホモグラフィ(画像からボードへの写像)と内部パラメータの両方に制約を与える。手順は以下の通り:
- 異なる姿勢で撮影された 枚の画像でチェッカーボードのコーナーを検出する。
- ボード平面と各画像との間のホモグラフィ を計算する。
- 各 から に関する制約を、 かつ を満たす を用いて抽出する。
- 内部パラメータについて線形システムを解く。
- すべてのパラメータ(内部+外部+歪み)を非線形最小二乗法で精緻化する。
制約の由来。 と書く。 かつ であり、 が正規直交であることから、各視点は対称行列 の成分に関する2つの線形方程式を生む:
は6個の未知数を持つ(スキューをゼロと仮定する場合は5個)ため、3視点で十分である。 はその後、コレスキー分解のような手法によって から復元される。これが、ボードを異なる姿勢で撮影する必要がある理由である — 平行な視点は冗長な制約しか与えない。
レンズ歪みモデル
実際のレンズは理想的なピンホールモデルから逸脱する。標準的な2つのモデル:
**半径方向歪み(radial distortion)**は直線を曲線に見せる:
ここで は主点からの距離の二乗である。 は樽型歪み(barrel distortion)を、 は糸巻き型歪み(pincushion distortion)を与える。広角レンズは大きな を持つ。
**接線方向歪み(tangential distortion)**は、レンズが画像平面に完全に平行でないことによって生じる:
実際には、(場合によっては )は と同時に推定される。OpenCVは cv::calibrateCamera() でこれを直接実装している。
キャリブレーション品質の判定
標準的な品質指標は、キャリブレーションが返すRMS再投影誤差である。推定パラメータでボードのコーナーを再投影し、ピクセル残差を測定する。単一の数値だけでなく、以下も確認すること:
- 残差が画像全体に均等に分布しているか — コーナー部分での偏りは、不適切な歪みモデル(例えば魚眼レンズを半径方向・接線方向モデルに強制的に当てはめた場合)を示している。
- ボードが画像のすべての領域、特にコーナーやエッジに現れているか — この領域で歪みが最も強く、そうでなければ制約が不十分になる。
- 傾きを含む視点が十分にあるか(正面からの撮影だけではなく) — これにより焦点距離と主点の相関が解消される。
よくある落とし穴
- 撮影中のモーションブラーとローリングシャッターはコーナー検出を損なう。各撮影時にはボード(またはカメラ)を静止させること。
- 平面でないボード: カードボードに貼った印刷紙は反ってしまい、歪みの推定値がその反りを吸収してしまう。剛性のある平らなターゲットを使用すること。
- 画像の境界付近の姿勢が少なすぎること — 高次の半径方向項がその領域に過剰適合し、カバーされていない範囲で大きく外れた値を出す。
- ある焦点/ズーム設定でキャリブレーションし、別の設定で運用すること: 内部パラメータは焦点によって変化する。レンズを固定し、ハードウェア設定が変わるたびに再キャリブレーションすること。
SLAMにおける意義
SLAMシステムは、歪みが補正され、キャリブレーション済みの観測が幾何ソルバーに供給されることを前提としている。画像境界における数ピクセルの未補正歪みが再投影誤差を支配し、マップを損なうことがある。キャリブレーションは、後で出会うより難しい問題のテンプレートでもある — カメラ-IMUやカメラ-LiDARの外部パラメータキャリブレーションは、同じ「既知のターゲット+非線形精緻化」というパターンに従う。実践的には、チェッカーボードで自分のカメラをキャリブレーションすることは、この分野における最良の最初の演習の一つである。