「3次元における直線 Li(i=0,1,⋯,n−1) の尤もらしい交点 p を最小自乗法で求める」
これは、位置と姿勢が既知である多視点画像における対応点3次元位置を推定する際にしばしば用いられる議論だ(下図参照)。3次元空間中では一般的に複数の直線の交点は一意には定まらず、いわゆる “ねじれ” の関係になる。その際、できるだけ誤差を抑えるために、各直線が最接近する点を採用する事が望ましい。
![]() |
複数カメラの視線を基に被写体の3次元座標を得るイメージ. カメラ光学中心から各対応点を貫く直線の交点が3次元位置となる. |
直線 Li が通る点を bi 、傾き(方向)を di とすると、Li 上の任意の点はパラメータ ti を用いて
Li(ti)=tidi+biと表す事ができる。
また、直線上の座標 Li(ti) と点 p の距離の自乗 fi(ti,p) は以下のようになる。
fi(ti,p)=|Li(ti)−p|2=|tidi+bi−p|2
ここで、すべての直線上の点 Li(ti) から p までの距離自乗の総和を
F(t0,⋯,ti−1,ti,ti+1,⋯,tn−1,p)=12n−1∑i=0|tidi+bi−p|2=12n−1∑i=0(tidi+bi−p)t(tidi+bi−p)と置き、関数 F(t0,⋯,ti−1,ti,ti+1,⋯,tn−1,p) の最小化問題を解く。
まず、上式を各 ti で偏微分して 0 と置き、
∂∂tiF(t0,⋯,ti−1,ti,ti+1,⋯,tn−1,p)=∂∂ti[12n−1∑i=0(tidi+(bi−p))t(tidi+(bi−p))]=∂∂ti[12n−1∑i=0t2idtidi+n−1∑i=0tidti(bi−p)+12n−1∑i=0(bi−p)t(bi−p)]=tidtidi+dti(bi−p)=0
次に p で偏微分して同様に 0 と置くと
∂∂pF(t0,⋯,ti−1,ti,ti+1,⋯,tn−1,p)=∂∂p[12n−1∑i=0((tidi+bi)−p)t((tidi+bi)−p)]=∂∂p[12n−1∑i=0(tidi+bi)t(tidi+bi)−n−1∑i=0(tidi+bi)tp+12n−1∑i=0ptp]=−n−1∑i=0(tidi+bi)+np=0が得られる。
これらをまとめると、未知数 t0,⋯,tn−1,p に関する次の方程式になる。
(dt0d00⋯0−dt00dt1d1⋱⋮−dt1⋮⋱⋱0⋮0⋯0dtn−1dn−1−dtn−1−d0−d1⋯−dn−1E3,3)(t0t1⋮tn−1p)=(−dt0b0−dt1b1⋮−dtn−1bn−1∑n−1i=0bi)
ここで、E3,3 は 3 階の単位行列である。上記の方程式を LU 分解か何かを使って解けばたぶん最急降下法を用いなくても p を得る事ができる(…んじゃないかな)。
ちなみに boost を用いた LU 分解の実装例はこのへん。OpenCV による実装例はこのへん。
最後の方程式 E_3,3 の所、 nE_3,3 ですかね?
返信削除