SFM


1、相機模型,內參數和外參數矩陣,相機標定;

2、極線約束和本征矩陣;特征點提取與匹配;提取到的特征點計算本征矩陣(五對以上的點)findEssentialMat(),需啊要點對,焦距參數,cx,cy參數等;

3、分解本征矩陣,獲取相對變換R和T:     int pass_count = recoverPose(E, p1, p2, R, T, focal_length, principle_point, mask);

4、現在已經知道了兩個相機之間的變換矩陣R和T,還有每一對匹配點的坐標。三維重建就是通過這些已知信息還原匹配點在空間當中的坐標.用三角化重建三維模型;proj1和proj2分別為跟R和T相關的3*4矩陣;

//三角化重建 triangulatePoints(proj1, proj2, p1, p2, structure);

//××××××××××××××××××××××多目三位重建××××××××××××××××××××

5、求第三個相機的變換矩陣:

    5.1最簡單的想法,就是沿用雙目重建的方法,即在第三幅圖像和第一幅圖像之間提取特征點,然后調用findEssentialMat和recoverPose。那么加入第四幅、第五幅,乃至更多呢?隨着圖像數量的增加,新加入的圖像與第一幅圖像的差異可能越來越大,特征點的提取變得異常困難,這時就不能再沿用雙目重建的方法了。

    5.2 那么能不能用新加入的圖像和相鄰圖像進行特征匹配呢?比如第三幅與第二幅匹配,第四幅與第三幅匹配,以此類推。當然可以,但是這時就不能繼續使用findEssentialMat和recoverPose來求取相機的變換矩陣了,因為這兩個函數求取的是相對變換,比如相機三到相機二的變換,而我們需要的是相機三到相機一的變換。有人說,既然知道相機二到相機一的變換,又知道相機到三到相機二的變換,不就能求出相機三到相機一的變換嗎?實際上,通過這種方式,你只能求出相機三到相機一的旋轉變換(旋轉矩陣R),而他們之間的位移向量T,是無法求出的。這是因為上面兩個函數求出的位移向量,都是單位向量,丟失了相機之間位移的比例關系。

    5.3我們要怎么解決這些問題?現在請出本文的主角——solvePnP和solvePnPRansac.根據OpenCV官方解釋,該函數根據空間中的點與圖像中的點的對應關系,求解相機在空間中的位置。也就是說,我知道一些空間當中點的坐標,還知道這些點在圖像中的像素坐標,那么solvePnP就可以告訴我相機在空間當中的坐標。solvePnP和solvePnPRansac所實現的功能相同,只不過后者使用了隨機一致性采樣,使其對噪聲更魯棒,本文使用后者。有這么好的函數,怎么用於我們的三維重建呢?首先,使用雙目重建的方法,對頭兩幅圖像進行重建,這樣就得到了一些空間中的點,加入第三幅圖像后,使其與第二幅圖像進行特征匹配,這些匹配點中,肯定有一部分也是圖像二與圖像一之間的匹配點,也就是說,這些匹配點中有一部分的空間坐標是已知的,同時又知道這些點在第三幅圖像中的像素坐標,嗯,solvePnP所需的信息都有了,自然第三個相機的空間位置就求出來了。由於空間點的坐標都是世界坐標系下的(即第一個相機的坐標系),所以由solvePnP求出的相機位置也是世界坐標系下的,即相機三到相機一的變換矩陣.

6、加入更多圖像

通過上面的方法得到相機三的變換矩陣后,就可以使用上一篇文章提到的triangulatePoints方法將圖像三和圖像二之間的匹配點三角化,得到其空間坐標。為了使之后的圖像仍能使用以上方法求解變換矩陣,我們還需要將新得到的空間點和之前的三維點雲融合。已經存在的空間點,就沒必要再添加了,只添加在圖像二和三之間匹配,但在圖像一和圖像三中沒有匹配的點。如此反復。 
多目重建流程 

 7、多目重建的累積誤差解決?BA方法,如何求解BA?總體思想是使用梯度下降,比如高斯-牛頓迭代、Levenberg-Marquardt算法等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM