カメラキャリブレーションの基礎 - 内部パラメータと歪み補正の実践ガイド
カメラキャリブレーションとは - なぜ必要なのか
カメラキャリブレーション (Camera Calibration) は、カメラの光学的・幾何学的特性を数学的に記述するパラメータを推定する処理です。3D 空間の点が 2D 画像上のどの位置に投影されるかを正確に予測するために不可欠であり、コンピュータビジョンのほぼすべてのタスクの基盤となります。
キャリブレーションが必要な場面:
- 3D 計測: ステレオビジョンや Structure from Motion で正確な距離を計測する
- AR (拡張現実): 仮想オブジェクトを現実世界に正確に配置する
- 自動運転: カメラ画像から障害物までの距離を推定する
- ロボットビジョン: ロボットアームの座標系とカメラ座標系を対応付ける
- 歪み補正: 広角レンズの樽型歪みを除去して正確な画像を得る
カメラパラメータの分類:
- 内部パラメータ (Intrinsic): 焦点距離、主点、歪み係数。カメラ固有の光学特性
- 外部パラメータ (Extrinsic): 回転行列と並進ベクトル。カメラの位置と姿勢
内部パラメータはカメラとレンズの組み合わせが変わらない限り一定ですが、ズームレンズの場合は焦点距離ごとにキャリブレーションが必要です。外部パラメータはカメラが移動するたびに変化します。一般的なキャリブレーションでは、既知のパターン (チェスボード等) を複数角度から撮影し、対応点から全パラメータを同時推定します。
ピンホールカメラモデル - 投影の数学的記述
ピンホールカメラモデルは、レンズの厚みを無視し、光が 1 点 (ピンホール) を通過して像面に投影される理想的なカメラを数学的に記述します。実際のカメラの近似モデルとして広く使用されます。
投影方程式: 3D 空間の点 (X, Y, Z) が画像上の点 (u, v) に投影される関係は、以下の行列方程式で表されます。
s[u, v, 1]^T = K[R|t][X, Y, Z, 1]^T
ここで K は内部パラメータ行列 (カメラ行列)、[R|t] は外部パラメータ (3x4 行列)、s はスケール因子です。
内部パラメータ行列 K:
K = [[fx, 0, cx], [0, fy, cy], [0, 0, 1]]
- fx, fy: ピクセル単位の焦点距離。fx = f × sx (f: 物理焦点距離 mm、sx: x 方向のピクセル密度 pixel/mm)
- cx, cy: 主点 (光軸と像面の交点) のピクセル座標。理想的には画像中心だが、実際は数ピクセルずれる
一般的なカメラの内部パラメータ例: iPhone 14 Pro (メインカメラ): fx ≈ 3,000 px、cx ≈ 2,016 px、cy ≈ 1,512 px (4,032 × 3,024解像度)。GoPro Hero 11: fx ≈ 1,500 px (広角のため焦点距離が短い)。産業用カメラ (5MP、8mm レンズ): fx ≈ 2,800 px。
焦点距離が大きいほど望遠 (狭い画角)、小さいほど広角 (広い画角) になります。主点のずれが大きい場合はレンズの取り付け精度に問題がある可能性があります。
レンズ歪みモデル - 放射歪みと接線歪み
実際のレンズは理想的なピンホールモデルからの逸脱 (歪み) を生じます。歪みを正確にモデル化し補正することで、計測精度が大幅に向上します。OpenCV では 5 つの歪み係数 (k1, k2, p1, p2, k3) を標準的に使用します。
放射歪み (Radial Distortion): レンズの中心からの距離に応じて発生する歪みです。光軸から離れるほど歪みが大きくなります。
- 樽型歪み (Barrel): k1 < 0。画像の周辺部が外側に膨らむ。広角レンズで顕著
- 糸巻き型歪み (Pincushion): k1 > 0。画像の周辺部が内側に凹む。望遠レンズで発生
x_distorted = x(1 + k1*r² + k2*r⁴ + k3*r⁶)
y_distorted = y(1 + k1*r² + k2*r⁴ + k3*r⁶)
ここで r² = x² + y² (正規化座標での中心からの距離)。一般的な値: 広角レンズ k1 ≈ -0.3、標準レンズ k1 ≈ -0.05、望遠レンズ k1 ≈ 0.01。
接線歪み (Tangential Distortion): レンズとセンサーが完全に平行でない場合に発生する歪みです。製造精度に依存し、通常は放射歪みより小さい値です。
x_distorted = x + 2*p1*x*y + p2*(r² + 2*x²)
y_distorted = y + p1*(r² + 2*y²) + 2*p2*x*y
一般的な値: p1, p2 ≈ ±0.001。高品質なレンズでは無視できるレベルですが、安価なレンズや Web カメラでは補正が必要です。GoPro のような超広角レンズでは、さらに高次の歪み係数 (k4, k5, k6) や薄プリズムモデルが必要になる場合があります。
Zhang 法によるキャリブレーション手順
Zhang 法 (2000) は、平面パターン (チェスボード) を複数角度から撮影するだけでカメラの全パラメータを推定できる実用的な手法です。特別な装置が不要で、OpenCV に完全実装されているため、最も広く使用されるキャリブレーション手法です。
必要な機材:
- チェスボードパターン (推奨: 9x6 または 10x7 の内部コーナー数)
- パターンは平面性が重要。厚紙やアクリル板に貼り付ける
- マス目のサイズを正確に測定する (例: 25mm)
撮影のガイドライン:
- 最低 10 枚、推奨 20-30 枚の画像を撮影する
- パターンを様々な角度 (±45° 程度) で傾ける
- 画像全体にパターンが分布するよう、位置を変えて撮影する
- パターンが画像の端にも来るようにする (歪み推定に重要)
- ピントが合った鮮明な画像を使用する
OpenCV での実装手順:
cv2.findChessboardCorners()でコーナーを検出するcv2.cornerSubPix()でサブピクセル精度に補正する- 3D 点 (チェスボード上の既知座標) と 2D 点 (検出されたコーナー) の対応を構築する
cv2.calibrateCamera()で全パラメータを同時推定する
再投影誤差の評価: キャリブレーション結果の品質は再投影誤差 (Reprojection Error) で評価します。推定パラメータで 3D 点を画像に再投影し、検出点との距離を計算します。良好なキャリブレーションでは 0.1-0.5 ピクセル、許容範囲は 1.0 ピクセル以下です。1.0 を超える場合は撮影条件やパターン検出を見直す必要があります。
歪み補正の実装と応用
キャリブレーションで得られた歪み係数を使って、撮影画像の歪みを除去する処理を解説します。歪み補正は 3D 計測の前処理として必須であり、正確な補正が後続処理の精度を決定します。
OpenCV での歪み補正:
- 方法 1:
cv2.undistort(img, K, dist_coeffs)- 最もシンプル。毎フレーム再計算するため動画処理では非効率 - 方法 2:
cv2.initUndistortRectifyMap()+cv2.remap()- マップを事前計算して再利用。動画処理に最適。マップ計算は 1 回のみで、remap は高速 (1080p で約 3ms)
補正後の画像サイズ: 歪み補正により画像の端が欠けるため、cv2.getOptimalNewCameraMatrix() で新しいカメラ行列を計算します。alpha=0 で黒い領域を完全に除去 (画像が小さくなる)、alpha=1 で全ピクセルを保持 (黒い領域が残る) します。用途に応じて alpha を 0-1 の間で調整します。
魚眼レンズの補正: 通常の歪みモデルでは 180° 以上の画角を持つ魚眼レンズに対応できません。OpenCV の cv2.fisheye モジュールは等距離射影モデルを使用し、超広角レンズのキャリブレーションと補正に対応しています。cv2.fisheye.calibrate() と cv2.fisheye.undistortImage() を使用します。
キャリブレーション結果の保存: 推定したパラメータは YAML または JSON 形式で保存し、アプリケーションで読み込んで使用します。OpenCV の cv2.FileStorage クラスで簡単に保存・読み込みが可能です。カメラとレンズの組み合わせが変わらない限り、一度のキャリブレーションで長期間使用できます。
高精度キャリブレーションのテクニックとトラブルシューティング
産業用途や研究用途で要求される高精度なキャリブレーション (再投影誤差 0.1 ピクセル以下) を実現するためのテクニックと、よくある問題の解決策を解説します。
高精度化のテクニック:
- パターンの品質: レーザープリンターで印刷したパターンは歪みがある場合がある。高精度が必要な場合はガラス基板にエッチングしたパターンを使用する
- 照明条件: 均一な拡散照明下で撮影する。直射光や影はコーナー検出精度を低下させる
- 撮影枚数: 50 枚以上の画像を使用すると統計的に安定した推定が得られる
- パターンの配置: 画像の四隅にもパターンが来るようにする。中央付近のみでは歪み係数の推定精度が低下する
- 固定パラメータ: fx = fy (正方ピクセル) を仮定できる場合は
cv2.CALIB_FIX_ASPECT_RATIOフラグで制約を加える
トラブルシューティング:
- 再投影誤差が大きい (> 1.0px): ブレた画像、パターンが平面でない、コーナー検出の誤りが原因。画像を 1 枚ずつ確認し、誤差の大きい画像を除外する
- 焦点距離が異常値: パターンが画像に対して小さすぎる、または角度変化が不十分。パターンが画像面積の 20% 以上を占めるようにする
- 歪み係数が不安定: 画像枚数が不足、またはパターンが画像中央に集中している。画像端にもパターンを配置する
自動キャリブレーション: SLAM (Simultaneous Localization and Mapping) システムでは、特徴点の追跡から自動的にカメラパラメータを推定するセルフキャリブレーションが使用されます。ORB-SLAM3 や COLMAP は、シーン内の自然な特徴点から内部パラメータを推定する機能を持っています。精度はパターンベースに劣りますが、事前準備なしで利用できる利点があります。