Loading [MathJax]/jax/output/HTML-CSS/jax.js

2012/01/19

三次元・直線・最小自乗法(vs. ぷで)

ぷでさんが面白い記事を書いていたので、僕も同じテーマで書いてみる事にしたよ。

「3次元における直線 Li(i=0,1,,n1) の尤もらしい交点 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+bip|2

ここで、すべての直線上の点 Li(ti) から p までの距離自乗の総和を
F(t0,,ti1,ti,ti+1,,tn1,p)=12n1i=0|tidi+bip|2=12n1i=0(tidi+bip)t(tidi+bip)と置き、関数 F(t0,,ti1,ti,ti+1,,tn1,p) の最小化問題を解く。

まず、上式を各 ti で偏微分して 0 と置き、
tiF(t0,,ti1,ti,ti+1,,tn1,p)=ti[12n1i=0(tidi+(bip))t(tidi+(bip))]=ti[12n1i=0t2idtidi+n1i=0tidti(bip)+12n1i=0(bip)t(bip)]=tidtidi+dti(bip)=0
次に p で偏微分して同様に 0 と置くと
pF(t0,,ti1,ti,ti+1,,tn1,p)=p[12n1i=0((tidi+bi)p)t((tidi+bi)p)]=p[12n1i=0(tidi+bi)t(tidi+bi)n1i=0(tidi+bi)tp+12n1i=0ptp]=n1i=0(tidi+bi)+np=0が得られる。

これらをまとめると、未知数 t0,,tn1,p に関する次の方程式になる。
(dt0d000dt00dt1d1dt1000dtn1dn1dtn1d0d1dn1E3,3)(t0t1tn1p)=(dt0b0dt1b1dtn1bn1n1i=0bi)

ここで、E3,3 は 3 階の単位行列である。上記の方程式を LU 分解か何かを使って解けばたぶん最急降下法を用いなくても p を得る事ができる(…んじゃないかな)。

ちなみに boost を用いた LU 分解の実装例はこのへん。OpenCV による実装例はこのへん

1 件のコメント:

ひとことどうぞφ(・ω・,,)