[CV] Structure from motion(SFM)- 附我的實現結果

【更新】我的新博客:www.ryuzhihao.cc,當然這個csdn博客也會更新
              本文在新博客中的鏈接:點擊打開鏈接

完成時間:2017年2月27日

博客時間:2017年4月26日

 

        去年,我有幸瞭解到image-based modeling的相關知識。作爲一個大三本科生,雖說自己此前也做過一些相關工作,但是要自己實現Structure from motion,確實是費盡了我的腦袋殼兒(3個月)。

       哦對,順帶宣傳一下此前自己嘗試過的一個相關的內容:Shape from shading(點擊打開我的另一篇博客)。

 

首先貼下我的程序的實現結果:

       平臺:Qt + OpenGL + OpenCV

       功能:(我實現的SFM算法——稀疏點雲的獲取)

       程序截圖:

1. 學校首任校長的雕像

輸入數據:

輸出結果:

 

2. 紫薇樹:

輸入數據:

輸出結果:

 

3. 矮灌木

輸入數據:

輸出結果:

寫在前面:

 

       前面給出了三組測試用例的執行結果: 我的SFM算法實現。整體看來還是不錯的,程序是其實有些不足,比如:對圖像的分辨率要求比較高、若圖像抖動會影響重建效果、恢復速度慢等等缺點。相比起VisualSFM及CMVS還是缺少了不少東西的。

       關於SFM和CMVS的關係:SFM是得到稀疏點雲的方法,CMVS是日本Yasutaka Furukawa(Washington University的assitance professor)基於SFM提出的多幅圖像密集點雲的提取方法。當然了,如果想要自己實現密集點雲的CMVS,首先要實現稀疏點雲的SFM。

       我實現的程序也算是能得到相對密集的三維信息,也有比較快的執行速度。限於自己的知識水平有限,暫時無法做到CMVS那樣的密集點雲的效果。

       順帶說明一下:我採用的方法大抵是知網IEEESIGGRAPH上能夠找到的關於SFM的Papers。說實話,雖說實現了出來,也是博主照葫蘆畫瓢,對原理的認識還是挺模糊的。不過還是希望接下來的介紹能夠對看到這篇文章的人有所幫助。歡迎討論~~~

 

Structure from motion簡介:

     Structure from motion (SfM) is a photogrammetric range imaging technique for estimating three-dimensional structures from two-dimensional image sequences that may be coupled with local motion signals. It is studied in the fields of computer vision and visual perception

    Structure from motion(SFM)是由一系列包含着視覺運動信息(motion signals)的多幅二維圖像序列(2D image sequences)估計三維結構(3D model)的技術。它屬於計算機視覺及可視化的研究範圍。

 

Structure from motion 的簡單原理:

     說明:paper裏面的太多數學原理、公式啥了,看的心累。這裏整理出來的是簡單的步驟,數學部分幾乎沒有。當然能理解最好,不要像我這樣子半吊子…… 其實很多東西opencv已經幫我們做好了,我們只需要通過其中的函數就能實現下面的幾個關鍵步驟。

1. 相機座標系

爲了更好的表示相機的旋轉、平移,需要先引入相機的參考系。Z軸沿鏡頭方向,如下圖(幾乎每篇關於SFM的paper必有的圖片……)

2. 相機的內參矩陣和外參矩陣

    熟悉OpenCV的同學應該知道這一點。在市面上大多數計算機視覺方面的教材對這個都有很詳細的講述。這裏不詳細說了,不清楚的娃兒可以翻翻教材或者看看下面的博客:

     http://blog.csdn.net/liyuan123zhouhui/article/details/52043683(攝像機內參、外參矩陣)

這裏需要提一下:

     一般來講,內參矩陣需要通過標定求出來,但是其實部分參數我們可以從圖片的信息中獲取,在圖片上右鍵“屬性”,可以找到部分需要的信息:

     外參矩陣的話:[R T] 包含從世界座標系到相機座標系的旋轉、平移關係。

三、特徵點提取和特徵點匹配

     這裏可以不用我們去實現,使用OpenCV中的SIFT或SURF都可以做到。不過需要OpenCV3.0,之前版本的OpenCV可以直接使用SIFT和SURF,但是3之後的版本有我們需要的功能,只是它的SIFT等等被移動到nonfree.hpp裏去了。具體的配置可以參考下面的鏈接(親測可行,Qt下配到吐血!!!!):

     (OpenCV3.1.0+Contrib配置)http://blog.csdn.net/qq_25517467/article/details/52189057

 

四、計算本徵矩陣,進一步求出R、T矩陣

       在得到匹配篩選過的特徵點後,就能夠計算出圖像間的本徵矩陣了。使用OpenCV中的findEssentialMat()方法可以直接實現。之後對求得本徵矩陣essentialMat進行分析,得出圖像間的相對變換矩陣R和T(兩幅圖像間的變換關係)

 

五、利用已知的R、T和匹配的特徵點還原三維座標。

      這一步,需要我們自己去實現了。但是建議先去了解一下“三角測距”。因爲到現在,我們已經知道圖像兩兩之間的旋轉平移的變換矩陣R、T,以及圖像兩兩間的特徵點匹配信息。這個就和“三角測距”非常類似。

     關於這一步的實現可以參考各個論文或者下面的鏈接:

     http://blog.sina.com.cn/s/blog_662c78590100zqwd.html

 

六、補充:

1. 關於SIFT、SURF的選擇:SIFT得到的結果相對比較稀疏且特徵點的價值較高,但是OpenCV裏的SIFT不太穩定,很多圖片在提取過程中會出現莫名其妙的錯誤。SURT的話特徵點會比較多但是質量不怎麼好,但是OpenCV的SURF非常穩定。

2. 關於稀疏點雲SFM得到密集點雲CMVS。

     可以查閱相關論文,關於“面片”的部分。(我沒有往下接着琢磨……)

3. 使用我的方法實現的SFM,如果想要有較快的速度,建議使用OpenCV的GPU模塊。

4. 大致的實現流程如下:

祝大家好運。

 

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