在跟蹤執行緒中,使用者變換攝像頭姿態或位置得到新關鍵幀,新關鍵幀需要重新查詢特徵點,找到與上一幀匹配的點以實現點跟蹤。為了快速精確地找到鄰幀對應特徵點,ptam使用一種基於斑塊搜尋的特徵匹配方法。首先從照相機採集一幀灰度影象,由運動估計模型計算乙個估計姿態。將地圖中的特徵點投影到影象上。然後進行斑塊搜尋。
其基本原理就是從源影象中生成乙個搜尋模板,該模板可以補償攝像機運動造成的尺度和角度變換。用該模板在目標影象中搜尋找到最佳的匹配位置。具體步驟如下:
在當前幀查詢sift特徵點。sift特徵查詢方法有多種,本文不再贅述。
計算源幀在當前姿態下的乙個變形矩陣a。
通過a的行列式決定搜尋層。
通過a生成搜尋模板。
使用該影象模板在當前幀一定範圍內搜尋匹配,找到斑點位置。
使用inverse-compositoin計算該點所在的亞畫素精確位置。
本節介紹第2步,介紹前了解一種常見的2d變換:仿射變換。在目標跟蹤應用中,影象目標通常會發生旋轉和縮放等變化,而另一方面,目標與影象採集裝置之間的距離通常較遠,其三維變化常可以用二維變化來近似,所以,在兼顧演算法效果和計算效率的考慮之下,經常可以選擇使用了六引數的仿射變換運動模型。 在我們的模型中,攝像機運動變換導致的影象變換也可以用仿射變化近似模擬,參考圖[3-1]。
仿射變換是射影幾何中的一種基本變換。仿射變換有6個自由度,分別是兩個平移,兩個旋轉旋轉,乙個錯切,和乙個縮放。
二維歐氏空間上的仿射變換可以表示為: (u
′v′)
=[a1
a3a2
a4][
uv]+
[txt
y]當源幀影象生成模板時執行上面的這些投影可以確保扭曲矩陣能補償透視投影、尺度變化以及鏡頭畸變造成的影象影響。a即為上式中an
z組成的矩陣。它表示旋轉,縮放,錯切的合成變換。
仿射變換具有6個自由度,如果要對仿射矩陣線性求解,至少需要6對點對應。我們沒有6組點對應,但是有每個點關於空間的投影關係。利用這些關係也能求得仿射矩陣。
在應用仿射變化之前,下節引入一些概念,以更好地理解仿射變換乃至射影變換的實質。
假設向量與矩陣乘積mx,我們可以把這個形式的矩陣m理解為對向量x的基——即座標系的宣告,向量x可看作空間的一點。乘積的結果向量,就是x在標準正交基i下的空間座標,或者是座標值不變,只是換了乙個基。
乙個變換t(x),其m下的變換矩陣為a,則變換過程可以表示為max,其位置就是max,而變換後的座標,從數值上來講也可以認為是相對位置沒有變而基變了:從x以m為基變換到了x以ma為基。變換是相對的。所以這個變換t的矩陣a,也可以理解為是對基m的乙個變換。也就是運動的實質,就是基變換。仿射變換的實質也是基變換。
從這個角度理解,正交基下的變換有特殊的性質,以仿射變換為例,對點(1,0)做2d變換,可以表示為: p=
[m1m
3m2m
4][1
,0]t
=i[m
1,m3
]t上式x方向單位向量做了個基變換得到乙個向量,這個向量正好是原基的第一列。該基的y方向化為單位正交基的座標為[m2,m4]。也就是正交基下,兩個向量按列排序組合即可組成新的基。
本節介紹ptam中計算仿射變換矩陣的過程,同時也能證明,在靜態場景下,僅攝像機的移動造成的影象變換可以用仿射變換來代替。下面簡稱第一次找到該點的關鍵幀為源幀,該幀對應的檢視矩陣為源檢視矩陣,記為ec
ws。當前幀的檢視矩陣用ec
w do
wnw 。如果取m右邊一畫素,同樣可得「右向量」在p的投影do
wnr 。顯然p離攝像機越遠,上述向量的模越小。然後將do
wnw 左乘ec
w ,得到該向量在當前檢視的投影向量: do
wnc=
[δud
,δvd
]t=e
cwdo
wnw
由前一節矩陣與基的關係可知。
對應原影象(0,1)向量。同理,下標r表示ri
ghtw
方向的投影,
對應(1,0)。以斑點中心點為原點,把它們組成一對新的基,那麼該基下的點在正交基下的值為: [u
c,vc
]t=[
δudδ
vdδu
rδvr
][us
−u0,
vs−v
0]t
圖[3-2] 的上半部分是上式的結果,顯然變換的結果轉為笛卡爾座標系後是個平行四邊形。為了後續ssd計算方便,我們需要的是乙個8x8的方形模板。所以還要做乙個對基做乙個變換,以產生乙個正交基下的座標值,用a表示等式右邊的2x2矩陣,它表示仿射變換的一部分,做如下基變化:i(
utvt
)=a(
usvs
)→a−
1(ut
vt)=
i(us
vs)
最終得到a−
1 即是我們需要的扭曲矩陣。
(基變換,圖)
同時這兩個單位投影向量組成的平行的四邊形面積即為矩陣a的行列式:s=
δur∗
δvd−
δvr∗
δud 。
當當前攝像機比源幀攝像機位置更靠近斑點時,面積更大。此時畫面尺度變大,根據這個面積值大小決定使用源幀影象金字塔的那一層,以更好地和當前影象匹配。
有了基,我們還需要座標值才能得到變換後的結果。式子中,下標t表示變換後的座標值,s表示源影象。現在使用ut
,vt,
a−1
cvd::transform(p.ppatchsourcekf->alevels[p.nsourcelevel].im, mimtemplate, m2,vec(p.ircenter),vec(mircenter));
引數分別為源影象,目標影象,扭曲矩陣,源影象取樣中心點(對應圖[3-2-3]的原點),目標影象中心點中心點。取樣方向和單位長度由扭曲矩陣決定,尺度由目標影象大小決定。
以上就是扭曲矩陣a補償尺度和角度變化的原理。
模板匹配步驟可以應用上一步生成模板在目標影象中尋找匹配位置,找到的點和源點形成一對點對應,用於後續姿態估計演算法中。上一節使用源點對應源幀的影象、變形矩陣、該點在影象上的投影位置,生成乙個8x8畫素的模板。然後計算影象金字塔層數,從目標影象的影象金字塔層中得到目標圖層,以源位置為中心,在乙個合適的半徑內搜尋,找到最匹配的位置。搜尋過程如下:首先在該範圍內找到所有角點,在此系統中角點是該影象的fast特徵點,然後在角點位置應用該模板計算ssd演算法得分,迭代每個點選擇差異值最小的角點作為最佳匹配位置。假如這個得分小余某個預設的預置,那麼就認為在該範圍找到了該斑塊和點對應。
在上面所說的搜尋中,當搜尋層數大於0時,得到的模板最佳匹配位置是所在圖層的畫素位置。後續跟蹤時還需要它的第0層的影象座標,這個位置可以使用根據影象鄰點關係,使用反向合成法做影象對齊,然後獲得第0層座標,得到的座標稱為亞畫素位置。
搜尋方法窺探
一,經典搜尋 深搜和廣搜 與剪枝 int a 62 bool v 62 int n bool bingo 0 bool cmp int a,int b bool dfs int begin,int left,int now,int max return0 int main intans sort a...
窺探Swift之字串(String)
之前總結過objective c中的字串 objective c精選字串處理方法 學習一門新語言怎麼能少的了字串呢。swift中的string和objective c語言中nsstring還是區別不小的,swift中的string又回歸了正常狀態,使用起來更為方便快捷。本篇部落格的主題就是swift...
窺探Swift之基本資料型別
中介紹了如何使用playground來學習swift語言。本篇部落格就使用playground來窺探swift語言。千里之行始於足下,當然了,除非你是坐的高鐵或者飛機。還是那句話從基礎開始吧,本篇部落格主要介紹一下swift的基本資料型別。swift中的資料型別可謂是百花齊放百家爭鳴,下面就來窺探一...