OpenPose と 3D再構成 – Part 2: カメラキャリブレーション

OpenPose で人の動きを取得し、3D再構成するシリーズの第2回です。Part 1 では OpenPose を導入して2Dキーポイントを取得しました。今回は、複数カメラの2Dキーポイントを正確な3Dに変換するために不可欠なカメラキャリブレーションを扱います。Part 1 を未見の方は先にそちらから(本記事は OpenPose が動く前提です)。

シリーズ構成: OpenPoseセットアップ、カメラキャリブレーション、3D再構成、キネマティクス、キネティクス
全5回シリーズ。本記事は Part 2 です。

カメラキャリブレーションは、次の4つのマイルストーンで進めます。

  1. 放射・接線方向の歪み(Radial & tangential distortion)
  2. カメラの内部・外部パラメータ(Intrinsics & extrinsics)
  3. 投影行列(Projection matrix)
  4. バンドル調整(Bundle adjustment)

1. 放射・接線方向の歪み

カメラのレンズは直線を歪ませます(フレーム端で壁やチェッカーボードが湾曲して見える)。歪みはフレームの端ほど大きく、補正しないと以降の精度が下がります。MATLAB・Python/OpenCV など多くのライブラリで補正できますが、本チュートリアルでは、最適化を対話的に可視化できて扱いやすい MATLAB の Camera Calibrator アプリを使います。

放射(樽型)歪みを示す3枚のカメラフレーム。端で壁やチェッカーボードが湾曲
放射・接線方向の歪み。端ほど湾曲が強くなります。

MATLAB で Apps → Camera Calibrator(無ければインストール)。チェッカーボードのフレームを追加します。撮影時は、ボードをフレーム内で動かし、特に端に持っていき、様々な角度に傾けると、係数を精度よく推定できます。パターンは Checkerboard を選び、マスのサイズ(ここでは 25 mm)を入力。MATLAB が各フレームの角(コーナー)を検出します。

MATLAB Camera Calibrator が43枚のチェッカーボードを検出中
Camera Calibrator がチェッカーボードを検出(デモは43フレーム)。

Options で放射歪み係数を2つか3つ選び(歪みが強ければ3)、必要なら接線歪み/スキューも追加します(ここでは放射のみ)。Calibrate を押すと、再投影誤差の棒グラフ(このデモは平均誤差 0.51 px)とチェッカーボード姿勢の3D表示が出ます。しきい値をドラッグして誤差の大きいフレームを除外し、再計算。納得したらパラメータをエクスポートすると、歪み係数とカメラの内部パラメータ行列が得られます(次で使います)。

MATLABの再投影誤差グラフと、検出点・再投影点の表示(平均誤差0.51ピクセル)
検出点(緑)、原点(黄)、再投影点(赤)と、フレームごとの再投影誤差。

2. 内部・外部パラメータ

内部パラメータ(Intrinsics)はカメラ内部の値で、焦点距離(焦点から像面までの距離)と主点(像面のx/y中心)です。これらを内部パラメータ行列にまとめます(Camera Calibrator が出力)。

外部パラメータ(Extrinsics)は、世界座標系に対するカメラの姿勢で、回転行列並進ベクトル(カメラがどれだけ離れ、どの向きを見ているか)で表します。内部パラメータと歪み係数があれば、OpenCV の cv2.undistortPoints に「点・内部パラメータ行列・歪み係数」を渡して2D点の歪みを補正できます。

12台のカメラそれぞれについて cv2.undistortPoints を呼ぶPythonコード
12台のカメラごとに cv2.undistortPoints で2D点を歪み補正。

3. 投影行列

投影行列は、内部と外部パラメータを1つの 3×4 行列にまとめたもので、3Dの世界座標点を2Dの画像点に対応づけます。求め方は主に2つ:

  • チェッカーボード法 — 外部パラメータと歪みを同時に計算できるが、全カメラが同じチェッカーボードを同時に見る必要がある。被験者を360度囲むカメラ配置では非現実的。
  • キャリブレーションケージ(校正枠)3D座標が既知の点を、全カメラから同時に見える剛体。本チュートリアルはこちら。
投影行列の式(内部×外部パラメータ)と、物理的なキャリブレーションケージ
投影行列 = 内部 × 外部パラメータ。右は既知の3D基準点を持つキャリブレーションケージ。

ケージでは各基準点の3D座標(例: (0,0,0)、(0,50,0)、(0,100,0)。マーカー間50 cm、ポール間100 cm)と、各カメラでの対応する2D画像点 (u, v) が分かります。このデモは12台のカメラ・12基準点。手順:

  1. 3Dと2D座標を標準化(DLTの解の品質が上がる)。
  2. 各点の3D↔2D対応を DLT(Direct Linear Transform)の式に整形し、1点あたり2行(12点で24行)を積み上げて大きな行列に。
  3. 特異値分解(SVD)を適用。最後の成分から投影行列が得られる。
  4. 逆標準化して最終的な投影行列を得る。

これをカメラごとに繰り返します。(動画のDLT・再構成コードは、著者がクレジットしているオープンソースの GitHub リポジトリを基に改変したものです。)

4. バンドル調整

最後にバンドル調整で投影行列を精密化します。最小二乗最適化(SciPy の least_squares)で、既知の3D校正点と、全カメラ視点から再構成した3D点との誤差を最小化します。結果として、最適化された投影行列(各 3×4・12パラメータ)がカメラ台数分(ここでは12台)得られます。

バンドル調整は3D再構成に依存するため、ここでは設定までにとどめ、詳細は Part 3 で扱います。

デモのセットアップ

全体を通して、被験者を約360度囲む12台のカメラ、既知3D点を持つキャリブレーションケージ(マーカー間50 cm、ポール間100 cm)、25 mm のチェッカーボード(歪み補正は43フレーム)を使用しています。

次回

歪みを補正し、投影行列を校正できたら、いよいよ Part 3 は3D再構成です。全カメラの2Dキーポイントを三角測量して3Dの動きに復元します。見逃さないよう、YouTube のチャンネル登録をぜひ。


著者について

Takashi Fukushima — スポーツ・運動科学 × Human Pose Estimation × Computer Vision × XR を横断して研究・開発しています。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール