5 カメラキャリブレーション
これまで本書で示してきた結果はすべて画素単位である:エッジは第 312.46 列に位置し、円の中心は 0.8 画素ずれている。しかし生産ラインの合否基準が画素で記載されることはない——図面の寸法単位はミリメートル、公差は ±0.02 mm であり、ロボットアームはワーク座標系での位置を必要とする。カメラキャリブレーション(camera calibration)は「画素」から「ミリメートル」への架け橋である:カメラ自身の結像パラメータを測定することで、すべての画素座標を物理的な意味を持つ幾何量に換算できるようになる。キャリブレーションがなければ、チャプター 21 の計測はすべて画素の遊びに過ぎない。またキャリブレーションが不適切であれば、どれほど優れたアルゴリズムでもレンズの歪曲収差をワークの変形として出力してしまう。
本章では3つの疑問に答える:実在のカメラの結像過程は数学的にどのように記述されるか(ピンホールモデル+内部パラメータ+歪曲収差);キャリブレーションプレートの複数の画像からこれらのパラメータを逆算するにはどうすればよいか(張氏キャリブレーションの原理と手順);そして最も見落とされやすい点として、キャリブレーション結果が信頼できるかどうかをどう検証するか。前半4節を通して、「真値が既知の」合成実験を行う:パラメータ既知の仮想カメラを自作し、キャリブレーションプレートを「撮影」させる(図 5.1)。次にSciVisionを用いてパラメータを算出し、真値と逐一照合する——実在のカメラの内部パラメータの真値を知ることはできないため、合成真値を用いなければ項目ごとの検証は不可能である。最後の節では実在のキャリブレーションプレートに対象を移し、序盤の「画素→ミリメートル」の架け橋を、実写したドットターゲットの9点座標キャリブレーションで具体化する(セクション 5.5)。
5.1 完全結像モデル
チャプター 3 でピンホールモデルの直感的な説明をした:空間上の点、レンズの光学中心、像点は一直線に並ぶ。チャプター 2 の同次座標を用いて行列形式で記述すると、世界点 \((X,Y,Z)\) が画素 \((u,v)\) に投影される過程は次のようになる。
\[ s\begin{bmatrix}u\\ v\\ 1\end{bmatrix} =\underbrace{\begin{bmatrix}f_x & 0 & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1\end{bmatrix}}_{K} \begin{bmatrix}R & \mathbf t\end{bmatrix} \begin{bmatrix}X\\ Y\\ Z\\ 1\end{bmatrix}. \]
右辺の \([R\ \,\mathbf t]\) は外部パラメータ(extrinsics)であり、世界座標系に対するカメラの姿勢を表す。カメラの位置を変えるたびにこの値は変化する。左辺の \(K\) は内部パラメータ(intrinsics)行列であり、カメラとレンズ自身のみに依存する。\(f_x,f_y\) は画素単位の焦点距離である(物理的な焦点距離を、画素の横方向・縦方向の寸法で割った値。正方形画素の場合は両者は等しい)。\((c_x,c_y)\) は主点(principal point)であり、光軸がセンサと交わる点を指す。組立公差の影響により、通常は画像の厳密な中心には位置しない。内部パラメータの意味は一言でまとめられる:\(f_x\) が「規格化座標」(水平画角の正接)を画素に変換し、\(c_x\) が原点を画像の左上隅に移動する。\(K\) が既知であれば、画素座標と光線の方向を相互に換算できる。
実在のレンズには最後のピースが欠けている:それが歪曲収差(distortion)である。レンズ群の倍率は画角によって変化するため、像点はピンホールモデルの予測位置から径方向にずれる。Brownの径方向モデルでは、規格化座標の多項式でこのずれを記述する。
\[ x_d = x_u\,(1+k_1 r^2 + k_2 r^4),\qquad y_d = y_u\,(1+k_1 r^2 + k_2 r^4),\qquad r^2=x_u^2+y_u^2, \]
ここで \((x_u,y_u)\) は理想的な(歪曲のない)規格化座標、\((x_d,y_d)\) は実際の結像位置である。\(k_1<0\) のとき倍率は画角の端部に向かって減少し、直線は外側に凸に湾曲して糸巻き型(barrel)の歪曲となる。\(k_1>0\) のときは内側に凹に湾曲してたる型(pincushion)の歪曲となる。図 5.2 は規則的な格子画像で両者を可視化したものである:本章の仮想カメラの歪曲 \(k_1=-0.18,\ k_2=0.05\) を適用すると、画像端部付近の「直線」は明らかに湾曲している。湾曲の程度は定量化できる——画像上部の1本の水平格子線上に61点の解析的なサンプル点をとり、直交回帰を実行すると、歪曲後の各点と回帰直線との偏差は最大で 4.678 px、RMSは 2.249 px となる。チャプター 14 の0.1 pxレベルのサブピクセル位置決め精度と比較すると、これは1.5桁以上大きな系統誤差である:歪曲収差を補正しなければ、サブピクセル精度は意味をなさない。
完全なBrownモデルには、レンズ群とセンサが厳密に平行でない場合に生じる接線方向歪曲項 \(p_1,p_2\) も含まれる。マシンビジョン用レンズの組立精度は高いため、接線方向成分は通常径方向成分より1桁以上小さい。そのため本章の実験では径方向の前2次項 \(k_1,k_2\) のみを用いる——これはほとんどの工業キャリブレーションのデフォルト設定でもある。SciVisionのキャリブレーション出力にも同様に \(p_1,p_2\) の項が確保されている(セクション 5.6 参照)。
5.2 キャリブレーションの原理
キャリブレーションで推定すべき未知量は \(f_x,f_y,c_x,c_y\) と \(k_1,k_2\)、さらに各画像ごとの外部パラメータである。直接的な考え方としては、既知の3次元構造体を撮影して逆算する方法があるが、3次元キャリブレーションターゲットは製造コストが高い。張正友の手法 (Zhang 2000) は平面ターゲットのみでこの問題を解き、現在でも工業キャリブレーションの主流となっている。その考え方は3段階に分かれる。
第一段階:各姿勢ごとにホモグラフィを求める。平面ターゲット上の点は \(Z=0\) を満たす。これを投影方程式に代入すると \([R\ \,\mathbf t]\) の列は3つだけになり、ターゲット平面から画像への写像は3×3のホモグラフィ(homography)行列 \(H = K\,[\mathbf r_1\ \mathbf r_2\ \mathbf t]\)(スケールを除く)に縮退する。各画像ごとに点対応を用いれば、自身の \(H\) を解くことができる。
第二段階:複数の姿勢を連立させて内部パラメータの初期値を解く。 \(\mathbf r_1,\mathbf r_2\) は回転行列の列であるため、正規直交でなければならない——これにより各 \(H\) ごとに \(K\) に関する2つの拘束条件が課される。内部パラメータは4つの未知数なので、3つの異なる姿勢のターゲットがあれば閉形式解を求めるのに十分である。姿勢が多いほど、最小二乗解は安定する。
第三段階:非線形精密化。閉形式解は歪曲収差を考慮していないため、初期値としてのみ用いられる。最終的な結果は非線形最適化によって得られる:歪曲係数とすべての姿勢の外部パラメータをまとめてパラメータベクトルに格納し、再投影誤差(reprojection error)を最小化する。再投影誤差とは、世界点を現在のパラメータで画像に再投影したものと、実測された点の位置との差である。
\[ \text{RMSE}=\sqrt{\frac{1}{N}\sum_{i=1}^{M}\sum_{j=1}^{N_i}\bigl\|\mathbf m_{ij}-\hat{\mathbf m}(K,k_1,k_2,R_i,\mathbf t_i,\mathbf M_j)\bigr\|^2}, \]
ここで \(\mathbf m_{ij}\) は第 \(i\) 画像中の第 \(j\) ターゲット点の実測画素座標、\(\hat{\mathbf m}(\cdot)\) は(歪曲を含む)完全結像モデルによる予測値、\(N\) は総点数である。この量はキャリブレーション品質の主要な指標でもある:「このパラメータセットが結像過程をどの程度説明できているか」を直接的に表している。
なぜキャリブレーションプレートを複数の角度に傾ける必要があるのか?ターゲットが常にカメラに正対している場合を想像してほしい:カメラを2倍遠ざけて焦点距離を2倍にしても、得られる画像は全く同じになる——正対姿勢では焦点距離 \(f\) と距離 \(Z\) を区別できない。焦点距離方向の情報が存在しないのである。傾いた姿勢はこの縮退を解消する:ターゲットの近端と遠端の透視投影による縮小量は \(f\) と傾き角の両方で決まるため、焦点距離が可観測になる。これは可観測性(observability)の直感を最も素朴に示す例である:パラメータを精度よくキャリブレーションできるかどうかは、最適化器の性能ではなく、データにそのパラメータの情報が含まれているかどうかに依存する。
5.3 ゴールドスタンダード実験:真値既知の合成キャリブレーション
実在のキャリブレーションには根本的な難点がある:真値が決してわからないことである。\(f_x=1226.3\) という結果が得られたとして、それが真の焦点距離からどれだけ離れているか?誰も答えられない——カメラの「真の内部パラメータ」そのものを調べる手段がないのである。そのためキャリブレーションアルゴリズムを検証するゴールドスタンダードは合成実験である:パラメータ既知の仮想カメラを自作し、キャリブレーションプレートを「撮影」させ、キャリブレーションアルゴリズムをブラックボックスとして入力し、出力と真値を逐一照合する。この手法はアルゴリズムの検証だけでなく、インターフェースに対する理解が正しいかどうかの検証にも用いられる——本章 セクション 5.6 の2つの工学的な発見は、まさにこの手法で発見されたものである。
仮想カメラの真値は \(f_x=f_y=600\)(640×480 解像度で水平画角は約56°)、\(c_x=326,\ c_y=243\)(主点を画像中心から意図的にずらした)、\(k_1=-0.18,\ k_2=0.05\)(中程度の強さの糸巻き型歪曲)とした。キャリブレーションプレートは9×7のドット格子、間隔10 mmとし、4つの姿勢をとらせた:正対、X軸回りに20°ピッチ、Y軸回りに−20°ヨー、複合姿勢(−15°/15°/10°)。各投影点には標準偏差0.1 pxのガウシアンノイズを重畳し(乱数シードを固定して再現性を確保)、実際のドット中心抽出の精度を模擬した。4×63=252個の点対をSciVisionの CameraCalibrate に入力した結果は以下の通りである。
| パラメータ | 真値 | キャリブレーション値 | 誤差 |
|---|---|---|---|
| \(f_x\) | 600.0000 | 598.5707 | \(-1.4293\) |
| \(f_y\) | 600.0000 | 598.5468 | \(-1.4532\) |
| \(c_x\) | 326.0000 | 325.5661 | \(-0.4339\) |
| \(c_y\) | 243.0000 | 243.2207 | \(+0.2207\) |
| \(k_1\) | \(-0.1800\) | \(-0.1832\) | \(-0.0032\) |
| \(k_2\) | \(0.0500\) | \(0.0663\) | \(+0.0163\) |
表を項目ごとに読み解く。焦点距離の誤差は約1.43 px、相対誤差は 0.24% であり——ほとんどの計測用途には十分な精度である。主点の誤差は0.5画素未満である。再投影RMSEは 0.1384 px であるのに対し、点抽出ノイズによる理論的な下限は \(\sqrt2\times0.1\approx0.1414\) px である:フィッティング残差はノイズレベルに張りついており、モデルがデータ中の系統的な情報をすべて抽出し尽くし、残りは自身で注入したランダムノイズのみであることを意味する。
なぜノイズ下限は \(\sqrt2\,\sigma\) なのか?再投影誤差は2次元残差ベクトルの大きさを統計している。\(u,v\) の2方向それぞれが分散 \(\sigma^2\) を寄与するため、大きさの二乗平均平方根は \(\sqrt{2}\,\sigma\) となる。RMSEがこの値をわずかに下回っている(0.1384 < 0.1414)ことは不思議ではない:モデルには数十個の自由パラメータがあり、それらがランダムノイズの一部を副次的に吸収するためである——これは「ノイズレベルまでフィッティングされた」正常な兆候である。逆にノイズ下限を大幅に下回る結果は、過学習の疑いがあるため注意が必要である。
唯一見栄えの悪い項目は \(k_2\) である:誤差は0.0163であり、真値に対して33%ずれている。これはアルゴリズムの失敗ではなく、データの限界である——\(k_2\) は \(r^4\) に乗じられるため、画角の最も端部の点のみがこのパラメータに影響を与える。本実験ではターゲットの投影が画像の四隅まで達していなかったため、\(k_2\) は弱可観測な状態にあった:既存のデータがカバーする \(r\) の範囲内では、多くの \((k_1,k_2)\) の組み合わせがほぼ等価になるのである。再投影RMSEが悪化していないことに注意してほしい——データがカバーする領域内では、このわずかにずれたパラメータセットと真値の予測は区別できない。この事実の教育的価値は実験そのものを上回る:パラメータの可観測性はターゲットのカバー範囲と傾きの多様性によって決まる。\(k_2\) を精度よくキャリブレーションするには、ターゲットの点を画像の四隅まで配置する必要がある。同様の理由から、キャリブレーションの良し悪しを評価する際には、パラメータの数値そのものを信じるのではなく、再投影RMSEと複数回の再キャリブレーションの一致性を重視すべきである——実在のキャリブレーションでは照合する真値表がない上に、弱可観測な方向に沿ってパラメータが自由にドリフトする可能性があるからである。
5.4 歪曲収差補正
パラメータが得られたら、次の段階は画像から歪曲収差を除去することである。画像を補正する正しい方法は逆写像(inverse mapping)である:出力(歪曲なし)画像の各画素 \((u,v)\) について、順方向の歪曲モデルを用いて元の歪曲画像中の対応位置 \(F(u,v)\) を算出し、チャプター 2 で紹介した双線形補間でグレースケール値を取得する。方向を逆にしてはならない——入力画素から順方向に出力に「散乱」させると、落点が整数格子上にならないため、出力画像に穴が生じてしまう。逆写像は出力の各画素がちょうど1回ずつ割り当てられることを保証する。代償として1画素ごとに1回のモデル計算と1回の補間が必要になるが、これはあらかじめルックアップテーブルとして計算しておくことが十分可能である。
まず純粋なモデルを用いて実装を検証する:糸巻き型歪曲の格子画像に対し、手書きの逆写像+双線形補間による補正を適用すると、上部格子線の直交偏差は最大4.678 pxから 0.000000 px に減少した(解析的サンプル点、ノイズなし——機械精度でゼロになった)。これにより逆写像と補間の実装が厳密に正しいことが証明された。図 5.3 (a) は補正後の画像であり、湾曲していた格子線が再び真っ直ぐになっている。
SciVisionは工学的なアプローチを採用している。正対姿勢の63点の点対に対し、単平面歪曲キャリブレーション DistortionCalibrate を呼び出すと Rms = 0.1493 が返される。出力されたキャリブレーション行列は2つの用途に使われる。1つ目は点補正である:PointProject を用いて歪曲した画素座標を補正後の画素座標に変換すると、ターゲットの最上行9点の共直線性偏差は補正前の 1.635 px から 0.121 px に減少する——これは0.1 pxの点抽出ノイズレベルに近づいており、歪曲による系統的な湾曲がほぼ除去されたことを意味する。全63点の補正後の点を世界格子にアフィンフィッティングすると、残差RMSEはわずか 0.0329 mm、最大で 0.0782 mm となり、補正後の像面とターゲット面は線形変換のみで関係付けられることを示している——これにより画素を比例換算でミリメートルに変換できるようになる。2つ目は画像補正である:DistortionCorrection は直接歪曲のない画像を出力する(図 5.3 (b))。手書き実装の結果と視覚的に一致している。
5.5 実在するキャリブレーションボード:九点座標キャリブレーション
前の4節では、真値が既知の仮想カメラを用いて内部パラメータと歪みのキャリブレーションを行った——これは意図的なものである:実在するカメラの内部パラメータは照会先が存在しないため、合成された真値によってのみ項目ごとの照合が可能となる(セクション 5.3)。しかし本章冒頭の「画素→ミリメートル」の橋には、より直接的で、実在するキャリブレーションボード上で完全に実行可能な別の実装経路——九点座標キャリブレーションが存在する。この手法は内部パラメータを推定せず、平面ターゲット上のいくつかの既知点を用いて「画素座標→ターゲット座標系」の平面変換を直接推定するもので、ロボットのハンドアイ位置合わせで最も一般的に用いられるキャリブレーション形式である(SDKマニュアル4.2)。
本節のサンプル画像はSmart3に付属する「九点キャリブレーション」サンプルソリューションから取得した:\(1571\times1053\)のグレースケール画像上の3×3の暗いドットターゲットである(図 5.4)。手順は2段階に分かれる。点抽出:まずSDKのドットボード自動点検出FindImageCorners(gridType=1)を試したが、このようにわずか9点しかない疎なターゲットでは122101001(点検出失敗)を返した——自動点検出は密なチェスボード/ドットアレイ向けに設計されており、点が少なすぎると性能が劣化する。そこで、暗いブロブの連結成分重心による決定論的な点抽出に切り替えたところ、平均格子間隔236.2 px(行方向236.19、列方向236.23。ターゲットがほぼ正面を向いており、透視歪みがほとんどないことを示す)の9つの円中心を安定して取得できた。キャリブレーション:9つの画素重心とターゲットの単位格子座標\((-1,1)\dots(1,-1)\)(1格子あたり1世界単位)をPointCalibrateに入力し、\(3\times3\)の平面キャリブレーション行列
\[ M=\begin{bmatrix}0.004233 & \approx\!0 & -3.0255\\[2pt] \approx\!0 & -0.004234 & 2.3963\\[2pt] 0 & 0 & 1\end{bmatrix}, \]
を得た。画素スケールは\(s_x=0.0042332,\ s_y=0.0042338\)世界単位/画素(すなわち236.2 pxが1格子間隔に対応する)である。9点を\(M\)でターゲット座標に逆投影したところ、フィッティング残差RMSはわずか0.000106 世界単位(約0.025 px)、最大点偏差は0.000147 世界単位(約0.035 px)であった。このターゲットはソフトウェアでレンダリングされた理想的なドットアレイであり、レンズ歪みがないため、残差がサブピクセル点抽出精度に張り付くのは当然である——この例の価値は、実画像上で「画素→座標系」の完全なクローズドループを実証する点にある。
より説得力のあるのは交差検証である:このサンプルソリューションには、SDKのグラフィカルインターフェースが当初算出したキャリブレーション結果(calib_data.xml)が付属しており、その行列は\(a_{11}=0.004233,\ a_{22}=-0.004236,\ t_x=-3.027629,\ t_y=2.398271\)、スケールは\((0.0042328,0.00423579)\)である。コードによって独立に点抽出、独立にキャリブレーションを行ったところ、線形係数とスケールはこれらと\(10^{-6}\)のオーダーで一致し、並進項は点抽出方法の違い(インターフェースでは円中心を半画素に丸めている)により約0.002 世界単位異なった——自作のパイプラインが市販のインターフェースの結果を再現できたことは、インターフェースの理解を実践的なものにする別の検証となる。
CalibImage/0.bmp)。灰色の十字は自作の重心抽出による9つの円中心を示す;これら9点をPointCalibrateでフィッティングすることで画素→ターゲット座標系の平面変換が得られ、サンプルに付属するSDKインターフェースのキャリブレーション結果を再現した。
なぜ内部パラメータ/歪みキャリブレーションは合成データを用い、座標キャリブレーションは実在するボードを用いるのか?両者の検収方法は根本的に異なる:内部パラメータキャリブレーションのゴールドスタンダードは真値との照合であるが、実在するカメラの真値は未知であるため、合成データを用いる必要がある(セクション 5.3)。一方、九点座標キャリブレーションの出力は単なる「画素→座標系」の平面変換であり、その品質はフィッティング残差と既知の解の再現によって検収でき、カメラの真値に依存しない——したがって実在するターゲット上で実行可能かつ、実行すべきである。本章はこれにより二つに分かれる:可観測性と精度分析は合成データ側で、実画像上の点抽出と座標キャリブレーションは実データ側で行われる。
5.6 SciVisionの実装
多ポーズ内部パラメータキャリブレーションはSCIMV::SciSvCalibration::CameraCalibrateによって実行され、セクション 5.2 のZhangの手順に対応する。各ポーズの点対応を順に2つの配列に連結し、インデックス配列によって各ビューの点数を宣言する:
SCIMV::SciSvCalibration calib;
SciPointArray allImg, allObj; // 4つのポーズの画像点/世界点を順に連結
SciVarArray ptsIndex; // 各ポーズの点数(本例では4つの63)
for (int p = 0; p < 4; ++p) {
for (size_t k = 0; k < wX.size(); ++k) {
SciPoint ip(imU[p][k], imV[p][k]), op(wX[k], wY[k]);
allImg.Append(ip); allObj.Append(op);
}
SciVar n((long)wX.size());
ptsIndex.Append(n);
}
SciMatrix camMat;
double rmsC = -1;
long rc = calib.CameraCalibrate(allObj, allImg, ptsIndex,
/*W*/ 640, /*H*/ 480, &camMat, &rmsC);allObjはターゲット平面の座標(単位はmm、平面ターゲットは\(Z=0\)なので2次元点のみを入力する)、allImgは対応する画素座標である。ptsIndexは平坦な配列を各ビューに分割し、画像の幅と高さは内部パラメータの初期値に用いられる。出力はパラメータ行列camMatと再投影RMSEである。表 5.1 のすべての数値はこの1回の呼び出しによるものである。
このインターフェースは使用中に2つのドキュメントの問題を露呈したので、そのまま記録する——これらはエンジニアが市販のSDKを統合する際に実際に遭遇する状況そのものである。第一に、cameraParam行列の要素配置がヘッダーファイルに記載されていない。 合成実験の真値から実際の配置を逆推定した:第0行は\([\,\_,\ f_x,\ c_x,\ f_y,\ c_y\,]\)、第1行は\([\,k_1,\ k_2,\ p_1,\ p_2,\ \_\,]\)である——真値と照合しなければ、\(f_y\)と\(c_x\)を読み間違えてもすぐには気づかない可能性がある。第二に、PointProjectの動作がヘッダーファイルの記述と一致しない。 ドキュメントでは世界座標を返すとされているが、歪みキャリブレーション行列と共に使用した場合、実際に返されるのは補正後の画素座標である。当初ドキュメントの記述に従って出力を世界格子(単位mm)から直接減算したところ、427 mmという荒謬な「残差」が得られた;出力の次元を追跡して確認した後、セクション 5.4 の「補正点から世界格子へのアフィンフィッティングを行う」検証スキームに再設計した。両方の発見は同じエンジニアリングの習慣を示唆している:インターフェースの理解は、答えが未知の生産ラインで使用する前に、答えが既知のデータで検証されなければならない——これがゴールドスタンダード実験の別の価値である。
セクション 5.5 の実ボード座標キャリブレーションは、同じモジュールの別のインターフェースPointCalibrate(imagePoint, worldPoint, type, …)を使用する:\(N\!\ge\!4\)組の画素点とターゲット点を入力し、\(3\times3\)の平面変換行列、画素スケール\(s_x,s_y\)、フィッティング残差を出力する。type=0/1/2はそれぞれ平面/傾斜/相似(ヘルマート)キャリブレーションに対応する;自動点検出が失敗した場合は決定論的な重心点抽出で入力側を補えばよい。SciSvCalibrationモジュールは、位置合わせ/レジストレーションやハンドアイキャリブレーションなどの拡張シナリオもカバーしている(SDKマニュアル4.3):カメラ座標系と運動プラットフォーム座標系を関連付けてこそ、キャリブレーション結果がマニピュレータを駆動できる。これらの内容は@sec-3d_imaging_overview の3次元計測と共に「キャリブレーションチェーン」の下流に属するため、ここでは展開しない。本章のすべての実験画像と数値を生成する実行可能な完全なプロジェクトはcode/camera_calibration/に配置されている。
産業事例:キャリブレーションが「期限切れ」になる理由
ある構造部品計測ステーションは稼働開始時の検収をスムーズに通過したが、3か月後の抜き取り検査で0.03 mmの系統的偏差が発見された。原因は、ラインの温度上昇により鏡筒が熱膨張して焦点面がドリフトし、等価焦点距離が変化したこと、さらに搬送ラインの振動によりカメラブラケットがわずかに回転したことである——プログラムは1行も変更していないのに、内部パラメータと外部パラメータの両方が「期限切れ」になった。対策は2段階に分かれる。1つ目は定期的な再キャリブレーションであり、四半期ごとまたは大規模メンテナンスの節目に完全なキャリブレーションを再実施する。もう1つははるかに低コストな日常的な検査である:視野内に寸法が既知の標準器を固定し、シフトごとに1回計測し、閾値を超えた場合にのみ再キャリブレーションをトリガーする。検証はキャリブレーションよりもはるかに安価である:1回の計測を1つの数値と照合するだけで、「キャリブレーションがまだ信頼できるか」を回答できる。高精度な環境ではこの検査を設備の日常点検表に記載すべきである——キャリブレーションパラメータはソフトウェア設定ではなく、温度と振動によってゆっくりとドリフトする物理的な計測結果である。
5.7 まとめ
- 完全な結像モデル = ピンホール + 内部パラメータ + 歪み:内部パラメータ行列は光線方向を画素に変換し、Brownの径方向モデル\(x_d=x_u(1+k_1r^2+k_2r^4)\)は実際のレンズがピンホールから逸脱する様子を記述する。本章の\(k_1=-0.18\)の樽型歪みにより、直線は4.678 px曲がった——歪み補正を行わなければ、サブピクセル位置決めは無意味である。
- Zhangの手法の手順は「ホモグラフィ → 閉形式初期値 → 非線形精緻化」である:平面ターゲットの各ポーズは1つのホモグラフィと2つの内部パラメータ制約を寄与し、多ポーズを連立させて初期値を解き、最終的に再投影誤差を最小化する。ターゲットは複数の角度に傾ける必要がある——正面のポーズでは焦点距離と距離を区別できない。
- 合成ゴールドスタンダード実験はキャリブレーションを検証するゴールドスタンダードである:真値が既知であってこそ、項目ごとの照合が可能となる。本章の実験では、焦点距離誤差は0.24%、再投影RMSE 0.1384 pxは\(\sqrt2\sigma=0.1414\) pxのノイズフロアに張り付いており、情報が完全に抽出されたことを示す;一方、\(k_2\)の誤差が大きいことは、ターゲットの被覆不足による可観測性の弱さを露呈している。
- キャリブレーションの評価はパラメータの数値自体ではなく、再投影RMSEと再現一致性によって行う:実際のキャリブレーションには照合すべき真値が存在せず、可観測性の弱い方向ではパラメータがドリフトする;画像補正には逆写像 + 双線形補間を用い、補正品質は共線性(1.635 → 0.121 px)などの幾何不変量によって定量的に検収できる。
- インターフェースの理解もゴールドスタンダード実験を通過しなければならない:パラメータ行列の配置と
PointProjectの出力量子は、いずれも真値との照合によって初めて確認された——ドキュメントと実装が一致しない場合、答えが既知のデータが唯一の裁定者となる。 - 実在するボード上で完全に実行されるのは九点座標キャリブレーションである:Smart3で実撮影した3×3ドットターゲットに対して自作の重心点抽出を行い(自動点検出は9点の疎なターゲットでは失敗する)、
PointCalibrateで画素→ターゲット平面変換をフィッティングしたところ、残差は約0.025 pxとなり、線形係数とスケールはサンプルに付属するSDKインターフェースの解を\(10^{-6}\)のオーダーで再現した——内部パラメータキャリブレーションは合成真値によって検証し、座標キャリブレーションは実データと既知の解の再現によって検証するという、それぞれの用途に応じた手法が用いられている。
カメラキャリブレーション(より完全な歪みモデル、不確かさ分析、3次元キャリブレーションを含む)の体系的な解説については、Stegerらの著作(Steger, Ulrich, と Wiedemann 2018)をさらに参照されたい;Zhangの元の論文(Zhang 2000)自体も非常に読みやすい。歪みと内部パラメータの現代的な処理は2つの古典に遡ることができる:Brown(Brown 1971)は近景写真測量において現在でも使用されている径方向/接線方向歪みモデルを提示しており、本章の\(k_1,k_2,p_1,p_2\)はこれに由来する。一方、Tsai(Tsai 1987)は単一のターゲット画像に基づく高精度3次元計測向けの2段階キャリブレーション法を提案し、Zhangの手法以前の産業界の主流であった。本章のカメラ座標系を運動プラットフォームに関連付ける拡張シナリオ(SDKマニュアル4.3)は正にハンドアイキャリブレーションであり、その基礎的なアルゴリズムはTsaiとLenz(Tsai と Lenz 1989)によって与えられている——ロボットの複数の既知のポーズでの結像から、カメラとエンドエフェクタ間の剛体変換を求解する。






