OpenPano:如何編寫一個全景拼接器


本文全文翻譯自http://ppwwyyxx.com/2016/How-to-Write-a-Panorama-Stitcher/。這是一個關於作者如何編寫OpenPano算法的一個總結,OpenPano是一個開源的全景拼接軟件。相關代碼在github上。

SIFT Feature


Lowe 的SIFT[1]算法實現放在feature/目錄下。這個算法的流程和一些結果在這一章裏做簡單的介紹。

Scale Space & DOG Space


首先,一個尺度空間(Scale Space)由S×O 個灰度尺度圖組成。最初的圖片被調整成O 種不同大小(即層級,octaves),每一層加上S 個不同的σ 高斯模糊。由於不同大小尺寸的圖片上檢測特徵點,這些特徵點將具備尺度不變性。

高斯模糊通過兩個一維卷積實現,而不是一個二維卷積。這將顯著地加速該計算過程。

在每個層級(octave),計算每兩個相鄰的高斯模糊後圖片的差值,可以構建一個差分高斯空間(DOG)。DOG空間由(S1)×O 個灰度圖組成。

DOG

Extrema Detection


在DOG空間中,通過比較相鄰的三個方向26個像素來檢測所有的極大或極小值:x,y,σ
extremaextrema_lenna
然後使用拋物線插補(parabolic interpolation)去搜索極值精確的(x,y,σ) 。爲了得到更優良的特徵點,低對比度(設定DOG圖像中的閾值像素值)和邊緣點(設定主曲率閾值)不被接受。結果如下:
feature_point

Orientation Assignment


首先,在尺度空間計算每個點的梯度和方向。在之前的流程中檢測到的每個關鍵點,根據他們的梯度幅度值作爲權重,將它的相鄰點的方向將累積起來並建立一個方向直方圖,權重由它們的梯度的幅度決定,

Descriptor Representation


Lowe建議[1]選擇關鍵點附近的16點來爲每個店建立一個方向直方圖並且合成爲一個SIFT特徵。每個直方圖使用8個從0到360度的不同的格子。一次結果特徵是一個128位浮點向量。因爲每個關鍵點的主方向是已知的,利用相對於主方向的相對方向,這個特徵是旋轉不變的。

利用論文[2]的建議,利用一個簡單修改的SIFT——RootSIFT,魯棒性更強。

Feauture Matching


這個128維描述子的歐氏距離是兩幅圖之間特徵匹配的距離標尺。如果一個點和他最近鄰和次近鄰的點之間的距離是相似的會被認定是不可信的而被拒絕。一次匹配的結果如下:
match

特徵匹配被認爲是最耗時的一步。所以我使用FLANN library去特徵向量中查詢兩個最臨近特徵。Intel SSE intrinsics被用來加速去計算兩個特徵向量的歐氏距離。

Transformation Estimation


Estimate from Match


衆所周知,對於任意兩幅相機在固定點拍攝的圖片,匹配對的齊次座標都能夠由一個單應變換矩陣聯繫起來,因此對於一對對應的點p=(x,y,1),q=(u,v,1) ,我們能夠得到

pHq=K1R1RT2K12q

單應矩陣是一個不考慮尺度影響的3×3 矩陣。它有下面的兩種可能的方程:
HomographyI:H=a11a21a31a12a22a32a13a231

HomographyII:H=a11a21a31a12a22a32a13a23a33 with constraint||H||=1

當拍攝兩幅圖片時,相機僅存在平行於成像平面的旋轉和平移變換時(沒有視角申縮),那麼它們能夠通過一個仿射變換矩陣聯繫起來:
A=a11a210a12a220a13a231

給定一組匹配點,以上的任何一個方程都能夠通過直接線性變換(Direct Linear Transform)估計出來。這些估計方法的實現放在lib/imgproc.cc中。具體參照[3]

然而這些方法對於噪聲的魯棒性並不強。實際上,由於錯誤匹配對的存在,RANSAC(Random Sample Consensus)算法[4]經常被用來在變矩陣的求解中剔除噪聲。在RANSAC的每一步迭代中,幾組匹配點對被隨機地選擇用來生成一個最佳的變換矩陣,並且和該矩陣一致的點對被看做是內點。在一定量的迭代後,擁有最多內點對的變換被看做最後的結果。該算法實現放在stitch/transform_estimate.cc中。

Match Validation


在每次矩陣估計後,我對每個矩陣進行了優劣檢查(health check),以避免因爲錯誤的匹配對而產生畸變的變換估計。這個過程包括兩種檢查:(具體參見stitch/homography.hh中)

  • 單應變換(H3,1,H3,2) 中的尺度參數不能太大。他們的絕對值應不能超過0.002。
  • 跳動不能夠出現在圖像拼接過程中。如果xy座標發生了跳動那麼這個單應變換是不能夠被接受的。

再無限制地拼接中,有必要判斷兩幅圖是否匹配。上面流程中估計得到的大量內點能夠作爲一個評判尺度。然而,對於高分辨率圖片,即使執行了足夠多次的RANSAC迭代,也有可能實際上得到了一個有着大量內點的錯誤匹配。爲了解決這個問題,考慮到錯誤匹配在空間上通常是更加隨機分佈的,通過設置匹配之間的幾何限制條件能夠幫助找出錯誤匹配對出來。因此,在RANSAC完成後會返回一組內點,按照論文[5]中的建議,可以通過一些重疊檢測來進一步驗證匹配情況。

特別的,知道了一個候選的變換矩陣,通過計算變換對應角點的凸包,我能夠找出兩幅圖之間的重疊區域。在重疊區域被找到後就可以應用兩個濾波器了。

  • 兩幅圖的重疊區域不能夠區別太大。
  • 在重疊區域內,應該有足夠大比例的匹配點對是內點。我使用了內點率來描述該匹配的置信度。

由於錯誤的匹配可能是隨機和無規律的,這種方法能夠幫助濾除帶有錯誤幾何信息的誤匹配對。

Cylindrical Panorama


Necessity of Projection

給出一個單向的旋轉變換照片輸入,按照大多數全景拼接軟件的做法,採用平面單應變換會導致垂直畸變,如下圖:
distoration

這是因爲全景實際上是通過柱面或者球面鏡投拍攝得到,而並不再試平面鏡頭。在這種配置下,照片中草地上的面色圓圈其實一條直線。一個很好地解釋了這種投影生成原因的demo見此頁面

處理這種問題的方式是在變換估計之前或者之後,通過柱面或者球面投影去畸變圖片。這和本系統中的兩種模式相對應。在這一節中我們將引入基於pre-warping的流水線方式,它被應用在柱面模式中。儘管需要很多的假設和一些技巧去是它良好的工作,這種流水線方式通常很好。它的實現放在stitch/cylstitcher.cc目錄中。

Warp


我們在拼接的一開始,先將圖片投影到柱面,方程如下:

x=arctanxxcfy=yyc(xxc)2+f2

f 是相機焦距,xcyc 是圖像的中心。詳見stitch/warp.cc。一些畸變後的示例圖片如下圖。注意這要求提前知道相機的焦距,否則不會產生一個好的彎曲結果。
123

在將所有的圖片投影到了相同的柱面上後,可以通過估計圖片對之間的仿射變換來簡單的拼接圖片。並且通過選定一張特定的圖片作爲主圖進行疊加。注意到操場上的白色線變得更直了。

warped_stitch

straightening


由於相機的傾斜角度是未知的,上面描述的柱面投影是假設相機是水平的。這個假設會導致扭曲,輸出的全景圖可能會是彎曲的:

bend

選擇中間的圖片作爲基準有助於解決該問題。我發現了另一種有效地方法,這種方法通過搜索畸變方程中的yc 來降低彎曲效應。

由於這種結果是因爲相機的傾斜造成的,yc 可能因height2 而不同。該算法通過對分yc ,找到能使得結果圖中出現的最佳直線的值。經過這個過程後,結果如下:

unbend

單獨改變yc 是不夠的,因爲我們還是將圖片畸變到了一個垂直的柱面上。如果所有的相機擁有共同的傾斜角度,那麼真實的投影面應該是一個圓錐面。這種錯誤能夠上述圖片邊界的左邊和右邊觀察到。爲了解釋這個錯誤,我最後使用了視角變換的方式去對準左邊和右邊的邊界。

unbend-persp

Camera Estimation Mode


Intuition

使用柱面投影去扭曲圖像到圓柱表面時,假設已知相機焦距並且要求所有相機有同樣的傾角向量。我們想要擺脫這些約束。

然而,如果只是簡單地估計成對的單應變換,去直接拼接它們,在變換後投影大柱面上,將會得到類似於下圖的結果:

CMU1-noestimate

注意到圖片實際上拼接的很好:匹配點對都很好地重疊了。但是整體的幾何結構被破壞了。

這是因爲H 和真實的幾何限制是不一致的,所以估計得到的H 不可能是K1R1RT2K12 中的一種。換句話說,我們估計得到的H 是一個忽略尺度因子的3×3 矩陣,但不是所有的R3×3 空間的矩陣都是合法的變換矩陣,儘管他們可能和這些點匹配。或者說,一個變換具有此種服從該方程是必要的,但不是充分的。

而且,注意刀H 不是最小化參數:假設所有相鄰的圖片對和第一(或最後)的圖片對被用來估計n 個單應變換矩陣H 。那麼我們需要估計8n 個參數。然而,每個相機有3個外部參數(旋轉參數)和一個內部參數(相機焦距)。總共的自由度是4n 。如果所有的相機都有相同的焦距那麼自由度(DOF)將會更小。

相機參數的這種不一致的過度參數化將會導致上述這種過擬合的結果出現,因而打亂了圖片潛在的內部幾何結構。

人們通常用H 來開始,因爲該估計就是簡單的線性代數問題。但是爲了得到相機所有正確的K,R 估計,基於梯度的非線性迭代優化方法是很有效的。在匹配視覺領域被稱之爲捆綁調整(bundle-adjustment),通過一個簡單的初始化估計緊接着又LM算法更新迭代。

Initial Estimation


[6]首先給出了一種粗略估計所有相機焦距的方法。在給出了一張圖片所有的焦距和旋轉矩陣後,相對應圖片的旋轉矩陣可以通過我們已經得出的單應變換求得:

R1=K11H12K2R2

因此,該估計算法原理類似於最大生成樹算法:在建立一種匹配圖後,我首先選擇一張有着好的連接性質的圖作爲基準。然後,在每一步中,選擇一張還未被處理的最佳匹配圖片(考慮匹配置信度)那麼它的旋轉矩陣R 能夠被粗略地估計出來。基於以上的粗略估計,所添加的相機都通過捆綁調整被全局矯正,具體方法將在下一節中講解。該流程的實現存放在stitch/camera_estimate.cc文件中。

注意到,由於單應變換H12 是參數化不一致的,通過上面的方程計算得到的結果R 可能不是一個合適的旋轉矩陣。因此我實際上採用了範數最小的旋轉矩陣。比較規範的說就是,給出H12,Ki,R2 ,我們計算:

R1=minR||RK11H12K2R2||2F, s.t.R1 is rotation matrix

如果不執行捆綁調整,由於初始估計的KR 都存在誤差,拼接的結果將無法對其,看起來如下圖:

initial_camera

爲了進一步的改善KR 中的參數是的匹配點對能夠較好的對齊,有必要進行一致化參數優化。

Bundle Adjustment


我們通過如下方式規定KR 中的參數:

K=f000f0001, R=e[u]×

這裏,R=e[u]× 是旋轉矩陣的角度座標參數化形式。令θ 是系統中所有參數組成的一個向量。我們的目標是最小化所有匹配點對的重投影誤差:
θ=minθ|Xipij|2

pij 表示圖片j 中的點Xj 到圖片i 的2D投影,並且需要滿足KR 的限制條件:p ijKiRiRTjK1jX^j 上述求和過程包含了所有之前添加到捆綁調節器的所有圖片的匹配點對。注意到當拼接一組無序的圖片時,一張圖片坑和許多圖片匹配。這些匹配集能夠幫助捆綁調節器來改善拼接質量。

一些迭代方法例如牛頓法,梯度下降法,levenberg-Marquardt算法,都能夠被用來解決這個優化問題。假定矩陣J=rθ ,這裏r 是所有代表平均平方誤差的殘差組成的向量:r=(Xipij,...) ,上面提到的三種優化方法求解方程如下:

  • 梯度下降法:θ=λJTr
  • 牛頓法:θ=(JTJ)1JTr
  • LM算法:θ=(JTJ+λD)1JTr,D

所有的迭代算法都涉及到計算矩陣J .它可以通過數值方法求得,又可以通過符號方式表示出來。

  • 數值:對於每一個θi ,振幅爲±ϵ ,分別計算r1,r2 。然後計算J[:,i]=r1r22ϵ
  • 符號:根據微分運算的鏈式法則計算rθ 。比如,相關的方程如下:
    rkpij=1,rk=Xipij.0

    pijp^ij=[xzyz][x y z]=1z001zxz2yz2

    p^ijfi=KiuiRiRTjK1jXj

    p^ijui=KiRiuiRTjK1jXj

    p^ijuj=KiRi(Rjui)TRTjK1jXj

    Kf=100010000

    Rux=ux[u]x+[u×(IR)ex]×||u||2R

最後一個方程來自於[7]。並且,我發現Lowe的論文[5]給出的方程是錯誤的:

Rux=uxe[u]×=e[u]×[u]×ux=R[u]xux

由於eA 不是按元素取指數而是按矩陣指數,所以這個等式是不成立的。

兩種方法的實現都存放在stitch/incremental_bundle_adjuster.cc。由於符號方式僅僅計算稀疏矩陣J 中的非零元素,所以它的計算速速更快,並且也允許我們在計算J 的過程中同時計算JTJ ,而不需要大量的矩陣乘法運算。

在一組n 張圖片集李,當圖片被添加進去後,優化算法需要運行n1 次。當在最後5次迭代後誤差不再下降後優化過程停止。

在優化後,上面的前景圖看起來將會更好:

after_ba

Straightening


校直也是有必要的。按照論文[5]中建議的方式,由於相機傾角不明確,捆綁調整後的結果可能仍然存在波動現象。若假定所有相機的X 向量位於同一平面(這是可能的),我們估計出一個正交於該平面Y 向量
來解決傾角和修復這種波動效應。

對比上面兩張圖,注意到草地上的直線被糾正了(它實際上是足球場上中心的一個圓)。

wavy
unwavy

Blending


在完成所有的變換之後最終圖片結果的大小就確定了。然後結果圖片中的每個像素點的值通過逆變換和相鄰區域像素點的雙線性插值(可以消除鋸齒現象)確定。

對於重疊區域,每個重疊像素到圖像中心的距離被用來計算像素值的權值和。爲了得到更好的全景圖,我僅僅使用了x 軸方向的距離去計算權重。結果幾乎是無縫連接的(見上圖)。

Cropping


當設置好了CROP選項後,程序將從原始結果上找到一張最大的合法矩形。

我們使用的算法複雜度爲O(n×m) ,其中n,m 是原始結果的長寬。算法工作如下:

對於每一行i

h[j]={0, h[j]+1, amp;if i=0 or A[i][j] is outside the areaotherwise

r[j]=maxk[0,m)N:h[t]h[j],jtk

l[j]=mink[0,m)N:h[t]h[j],ktj

對於每一個j[0,n) 都能夠被攤分爲O(1) 的時間複雜度,第一個i 行的最大可能區域,會是(r[j]l[j]+1)×h[j]

CMU1

CMU0-all

apple

參考文獻


[1]: Distinctive Image Features From Scale-invariant Keypoints, IJCV04

[2]: Three Things Everyone Should Know to Improve Object Retrieval, CVPR2012

[3]: Multiple View Geometry in Computer Vision, Second Edition

[4]: Random Sample Consensus: a Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography, Comm of ACM, 1981

[5]: Automatic Panoramic Image Stitching Using Invariant Features, IJCV07

[6]: Construction of Panoramic Image Mosaics with Global and Local Alignment, IJCV00

[7]: A Compact Formula for the Derivative of a 3-D Rotation in Exponential Coordinates, arxiv preprint

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章