實際應用中,不同程式對於座標原點的規定可能不同,座標系的尺度也可能不同。於是很自然會有乙個問題,在這些情況下我們通過兩幅影象的對應點求解出的單應矩陣還是同乙個麼?即單應矩陣有沒有不變性?
用更加正式點語言表述如下:
假設一幅影象中的點x在另外一套座標系中表示方法為x˜
,它的在另一幅影象中的對應點x』在另一套座標系中表示方法為x˜
′ 。其中 x˜
i=tx
i,x˜
′i=t
′x′i
考慮x′
=hx 則有x˜
′=t′
ht−1
x˜於是可以得到h˜
=t′h
t−1
於是,從新的座標x˜
↔x˜′
我們可以得到h˜
。進而得到h=
t′−1
h˜t
那麼問題來了,對於任意的t,
t′我們是否總能求出同樣的h呢?
考慮一系列對應點集合xi
↔x′i
,使用dlt演算法求解出它們的單應矩陣為
h 。再考慮對x˜
↔x˜′
,其中x˜i
=txi
,x˜′
i=t′
x′i 。令h˜
=t′h
t−1
dlt演算法是否能從x˜
↔x˜′
解出上述的h?
如上節一樣,定義ϵ˜
i=x˜
′i×h
˜x˜i
,可以計算出 ϵ˜
i=x˜
′i×h
˜x˜i
=t′x
′i×(
t′ht
−1)t
xi=t
′x′i
×t′h
xi=t
′∗(x
′i×h
xi)=
t′∗ϵ
i 其中t
∗=de
t(t)
t−t (存在定理(m
x)×(
my)=
m∗(x
×y) )
對於相似變換t=
[sr0
tt1]
,可以求出t′
∗=s[
r−tt
r0s]
. 將t
′∗帶入ϵi
的前兩項有。 a˜
ih˜=
(ϵ˜i
1ϵ˜i
2)t=
sr(ϵ
i1ϵi
2)t=
srai
h r為正交矩陣,所以r不改變向量的範數,於是||
a˜h˜
||=s
||ah
||用代數誤差來表示就是 da
lg(x
˜′i,
h˜x˜
i)=s
dalg
(x′i
,hxi
) 由此,我們發現對於同樣的代數誤差(相差乙個尺度),可以推導出一組對應的h和h˜
。可能由此我們會認為最小化代數誤差解出的h和h˜
滿足h˜
=t′h
t−1 。然而事實並非如此。
因為在dlt演算法求解時為了使得方程有唯一解我們新增了一項約束||
h||=
1 。於是對於相同的代數誤差,在||h||=1和||
h˜||
=1下解出的兩者並不滿足前面所說的等式。
事實上,它們不滿足簡單的對應關係,就是說 mi
nimi
ze∑i
dalg
(x′i
,hxi
)2其中
||h|
|=1⇔
mini
mize
∑ida
lg(x
˜′i,
h˜x˜
i)2其
中||h
||=1
≠min
imiz
e∑id
alg(
x˜′i
,h˜x
˜i)2
其中||
h˜||
=1因此我們說座標的變換會導致不同的解。只有當||ah||不隨座標變換而變換時我們可以找出h與h˜
之間的關係。如何做到這一點,又是另乙個問題。接下來我們將**幾何誤差的不變性。
使用最小化幾何誤差的方法來尋找h,對於相似變換具有不變性。如前面提到的,考慮一系列對應點集合xi
↔x′i
,使用dlt演算法求解出它們的單應矩陣為
h 。再考慮對x˜
↔x˜′
,其中x˜i
=txi
,x˜′
i=t′
x′i 。令h˜
=t′h
t−1 。假設t,t』代表ip
2 中的歐氏變換。可以驗證d(
x˜′,
h˜x˜
)=d(
t′x′
,t′h
t−1t
x)=d
(t′x
′,t′
hx)=
d(x′
,hx)
這是顯然的,因為歐式變換不改變長度(距離)。因此它們最小化的是同乙個東西,求出來的h也是雙射的,即最小化幾何誤差對於歐式變換具有不變性。
對於相似變換,幾何誤差之間顯然相差乙個相似係數。計算出的
h 與h˜
可以如歐式變換的情況中一樣簡單的一一對應起來。所以幾何誤差具有相似變換不變性。
正如開始所講,dlt演算法得出的單應取決於座標框架,它對於相似變換不具有不變性。也就是說某個座標框架中計算出的h要好於另外乙個框架中計算出的h。為了減少甚至消除這一點的影響,我們在執行dlt演算法之前需要進行標準化。
對一幅影象中所有點進行標準化,使得它們的中心移到座標原點,同時使得它們與座標原點的平均距離等於2‾
‾√(這個數值是為了計算的方便)。即所有點在以原點為圓心,r=
2‾‾√
的圓兩側。
這樣的做法使得各種座標框架上的點被變換到了同一套座標系下,再進行dlt演算法,就使得它有了相似變換不變性。
由此,我們對dlt演算法進行改進:
1)對x進行標準化,變換記作t
2)對x』進行標準化,t』
3)dlt演算法
4)反標準化。h=
t′−1
h˜t
於是得到了h。
可以看到,opencv使用的單應矩陣的求解演算法就是上面所說的方法
int runkernel( inputarray _m1, inputarray _m2, outputarray _model ) const
cm.x /= count;
cm.y /= count;
cm.x /= count;
cm.y /= count;
for( i = 0
; i < count; i++ )
if( fabs(sm.x) < dbl_epsilon || fabs(sm.y) < dbl_epsilon ||
fabs(sm.x) < dbl_epsilon || fabs(sm.y) < dbl_epsilon )
return 0
; sm.x = count/sm.x
; sm.y = count/sm.y;
sm.x = count/sm.x
; sm.y = count/sm.y;
double invhnorm[9] = ;
double hnorm2[9] = ;
mat _invhnorm( 3, 3, cv_64fc1, invhnorm );
mat _hnorm2( 3, 3, cv_64fc1, hnorm2 );
_ltl.setto(scalar::all(0));
for( i = 0
; i < count; i++ )
;double ly = ;
int j, k;
for( j = 0
; j < 9; j++ )
for( k = j; k < 9; k++ )
ltl[j][k] += lx[j]*lx[k] + ly[j]*ly[k];
}completesymm( _ltl );
eigen( _ltl, matw, matv );
_htemp = _invhnorm*_h0;
_h0 = _htemp*_hnorm2;
_h0.convertto(_model, _h0.type(), 1./_h0.at
(2,2) );
return 1
;}
MVG讀書筆記 單應矩陣估計這件小事(三)
實際應用中,不同程式對於座標原點的規定可能不同,座標系的尺度也可能不同。於是很自然會有乙個問題,在這些情況下我們通過兩幅影象的對應點求解出的單應矩陣還是同乙個麼?即單應矩陣有沒有不變性?用更加正式點語言表述如下 假設一幅影象中的點x在另外一套座標系中表示方法為x 它的在另一幅影象中的對應點x 在另一...
MVG讀書筆記 幾何變換
德國著名數學家felix klein在他的erlangen綱領中提出 幾何就是研究變換中的不變性的學科。事實上,幾何變換在幾何的研究中占有重要地位。也是圖形學應用的基礎。下面我們就對常用的幾何變換進行介紹 提到幾何變換,最先想到的就是圖形的平移和旋轉,圖形的平移和旋轉統稱為圖形的歐氏變換,乙個典型的...
MVG讀書筆記 射影變換的校正(二)
上一節講到仿射變換中無窮遠處的直線是固定的。而其上的點是不固定的。這很容易理解,對一條直線沿著它的切線方向平移,直線方程不變,但是上面的點的座標卻發生了變化。然而,通過計算可以發現對於相似變換,無窮遠處有兩個共軛的理想點是固定的,即 i 1 i0 j 1 i0 我們把這兩個點稱為虛圓點。對於相似變換...