第9章
カメラを校正して距離推定の準備をする
チェッカーボードを撮影し、内部パラメーターとレンズ歪みを求めて校正の品質を確認します。
この章で学ぶこと
- 内部パラメーターと外部パラメーターを区別する
- チェッカーボードの交点からカメラを校正する
- 再投影誤差と撮影条件から校正結果を点検する
1. 何を求めるか
校正では、画像ができる仕組みを数値で表します。内部パラメーターの行列Kは、焦点距離に対応する fx, fy と主点 cx, cy を持ちます。ここでの単位はピクセルです。
K = [ fx 0 cx ]
[ 0 fy cy ]
[ 0 0 1 ]
レンズによる歪みも別の係数で表します。一方、ある物体に対するカメラの位置・向きは外部パラメーターです。校正の撮影ごとに外部パラメーターは変わっても、カメラのレンズ・解像度・フォーカスなどが同じなら、同じ内部パラメーターを使う前提で推定します。
2. チェッカーボードを印刷する
第6章でダウンロードしたコードを使います。
python make_targets.py
targets/checkerboard.png と、次章用の targets/marker-0.png ができます。チェッカーボードを白い余白ごと印刷し、平らな板に貼ってください。教材のパターンは 横10マス・縦7マス、内側の交点は横9個・縦6個です。コードで指定する (9, 6) はマスの数ではありません。
印刷後に1マスの一辺を定規で測ります。たとえば20mmなら 0.020m です。印刷ダイアログの倍率や画像のピクセル数から実寸を決めつけないでください。複数マスの長さを測って割ると、測定のばらつきを減らせます。縦横で同じ寸法かも確認します。
3. 同じカメラ設定で撮る
python opencv_basics.py --source 0 --show --max-frames 0 --output calibration-shots
s で15〜25枚を目安に保存します。ボード全体が写るようにしながら、画像の中央・端、近い・遠い、左右・上下の傾きを変えます。撮影のたびに静止させ、ぶれを避けてください。似た正面画像を連写するだけでは、校正に必要な変化が足りません。
カメラの解像度、ズーム、フォーカスを以後もそろえます。可能ならオートフォーカスを固定します。電子手ぶれ補正や自動クロップなどで画角が変わる機能にも注意します。広角・魚眼レンズでは、ここで使う通常の歪みモデルでは足りないことがあります。
4. 校正ファイルを作る
1マス20mmの場合の実行例です。自分で測った寸法に置き換えます。
python calibrate_camera.py --images calibration-shots/captures --square-m 0.020 --output calibration.npz
成功すると次ができます。
| 出力 | 内容 |
|---|---|
calibration.npz |
行列K、歪み係数、画像サイズ、マスの実寸など |
calibration.json |
全体と各画像の再投影誤差 |
calibration-corners/ |
検出した交点を描いた画像 |
交点の検出に失敗した画像は除外されます。成功画像が10枚未満なら処理を止めます。これは教材の最低条件であり、10枚あれば必ず高品質になるという意味ではありません。画像サイズが混ざっていても停止します。
中心となるAPIは次の3つです。入力は、既知の3次元交点と画像中の2次元交点の対応です。
found, corners = cv2.findChessboardCorners(gray, (9, 6))
corners = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
rms, K, dist, rvecs, tvecs = cv2.calibrateCamera(
object_points, image_points, image_size, None, None
)
APIの詳しい説明はOpenCVのカメラ校正チュートリアルで確認できます。
5. 結果を点検する
推定したカメラモデルで交点を画像へ写し直した位置と、検出した位置の差が再投影誤差です。教材のログは点ごとの2次元距離の二乗平均平方根(RMS)をピクセル単位で示します。
まず交点画像が正しいかを見て、他より誤差の大きい画像にぶれや反射がないか調べます。誤差を小さくするためだけに画像を捨てるのではなく、原因を確認して撮り直します。低い誤差でも、撮影角度が偏っていたり、実寸が間違っていたりすれば、実際の距離が正しいとは限りません。
次章で、校正には使っていないマーカーを既知の距離へ置き、定規による測定と比較します。解像度を変えた場合も、行列だけを無条件に使い回さず、同じ設定へ戻すか再校正してください。
やってみよう
- マスの数と内側交点の数が違う理由を、印刷したボードで確かめてください。
- 画像ごとの誤差と交点の描画を見比べ、再撮影が必要なものを選んでください。
- 画像を半分に縮めたのにKを変更しないと、どんな不整合が起きるでしょうか。
3では、画素で表した焦点距離と主点が新しい画像の尺度に合わなくなります。単純な縮小なら調整可能ですが、実機の解像度切り替えにはクロップなどもあり得るため、この教材では同じ設定で進めます。