三維重建初探(整理的一些資料及論文分享)

? ? ? ?研究僧上了一年,雖說(shuō)研究的是CV方面的東西,但基本還是處于小白階段,忙來(lái)忙去不知道忙了些啥就這么荒廢了一年(捂臉跑),最近接觸了一些三維重建方面的內(nèi)容,一直也對(duì)這方面的東西比較感興趣,像什么建筑重建啦,醫(yī)學(xué)影像重建啦etc,并不是對(duì)測(cè)繪遙感類(lèi)的三維重建不感興趣,而是感覺(jué)學(xué)不懂hhhhh,因?yàn)闇y(cè)繪方面的三維重建往往要考慮很多GIS(Geographic Information System)?的內(nèi)容和地貌及一些地理專(zhuān)業(yè)知識(shí),畢竟不是專(zhuān)業(yè)人士,所以做起來(lái)還是比較費(fèi)勁的。此文是想分享一下自己入門(mén)三維重建的一些學(xué)習(xí)筆記,也引用了網(wǎng)上一些大牛的博客,講的蠻清晰地,同時(shí)分享幾篇論文供大家學(xué)習(xí)參考。


三維重建(3D Reconstruction)入門(mén)

1. 數(shù)學(xué)知識(shí)儲(chǔ)備

? ? ? ?不管哪門(mén)方向,感覺(jué)接觸到CV領(lǐng)域,數(shù)學(xué)都是必不可少的東西(大實(shí)話)。想在CV領(lǐng)域有一番建樹(shù)的話,數(shù)學(xué)當(dāng)然是要研究的十分透徹的。對(duì)于這個(gè)領(lǐng)域來(lái)說(shuō),就目前而言最重要的可能還是矩陣方面(矩陣論這門(mén)課一定要好好學(xué)??!學(xué)長(zhǎng)沒(méi)有好好學(xué)請(qǐng)引以為戒,所以現(xiàn)在備受折磨),所以需要有蠻好的線性代數(shù)基礎(chǔ),因?yàn)榇蟛糠质蔷仃囅喑思耙恍┓稊?shù)的運(yùn)算。加上目前神經(jīng)網(wǎng)絡(luò)這么火,一個(gè)神經(jīng)網(wǎng)絡(luò)中大都包含一系列復(fù)雜的矩陣計(jì)算過(guò)程(因?yàn)閳D像通常用矩陣表示),So矩陣論算是三維重建的重中之重!務(wù)必學(xué)好數(shù)學(xué)

2. 三維重建分類(lèi)

? ? ? ?在網(wǎng)絡(luò)上其實(shí)可以搜到很多有關(guān)三維重建的分類(lèi),不過(guò)分類(lèi)尺度不盡相同,分享一個(gè)比較細(xì)致的分類(lèi)(主被動(dòng)式分類(lèi))。在這篇博文中主要是分為了主動(dòng)式重建被動(dòng)式重建,而在我接觸目前,還主要是立體視覺(jué)重建(被動(dòng)式重建中的一種方法),其主要包括直接利用測(cè)距器獲取程距信息、通過(guò)一幅圖像推測(cè)三維信息利用不同視點(diǎn)上的兩幅或多幅圖像恢復(fù)三維信息等三種方式。第一種方法顧名思義,需要配合測(cè)距器獲得信息;第二種方法目前為止還不成熟,因?yàn)橛梢环鶊D像想要恢復(fù)三維模型中的所有信息十分困難,一方面一幅圖像包含的信息有限,另一方面推測(cè)出的信息可能會(huì)與原物體有誤差。同時(shí)一般這類(lèi)方法對(duì)圖像要求較高,需要圖像中最好本身具有深度信息,目前比較簡(jiǎn)單且能拍出深度圖像的設(shè)備可以使用Kinect。第三種方法則是比較常用的重建方法,因?yàn)橹恍枰胀ǖ?b>RGB圖像,在原圖像獲取方面比較簡(jiǎn)單,但可想而知,對(duì)于僅用RGB圖像恢復(fù)三維模型方法,必定會(huì)使用很多圖像,且需要對(duì)圖像兩兩匹配來(lái)達(dá)到較好的效果,所以大大延長(zhǎng)了運(yùn)算時(shí)間,導(dǎo)致效率不高,在下文中會(huì)進(jìn)一步介紹。

3. 立體視覺(jué)法

? ? ? ?傳統(tǒng)的立體成像系統(tǒng)使用兩個(gè)放在一起的攝像機(jī),平行面向待重建的物體。此方法在概念上,類(lèi)似人類(lèi)借由雙眼感知的圖像相疊推算深度(當(dāng)然實(shí)際上人腦對(duì)深度信息的感知?dú)v程會(huì)更加復(fù)雜),若已知兩個(gè)攝影機(jī)的彼此間距與焦距長(zhǎng)度,而截取的左右兩張圖片又能成功疊合,則深度信息可迅速推得。此方法必須依賴(lài)有效的圖片像素匹配(correspondence analysis),一般使用模板比對(duì)(Block Matching)對(duì)極幾何(Epipolar Geometry)算法完成。使用兩個(gè)攝影機(jī)的立體視覺(jué)法又稱(chēng)做雙目立體視覺(jué)(Binocular Stereo Vision)。

4. 深度圖像

? ? ? ?在上文中提到過(guò)使用深度圖像恢復(fù)三維模型的方法,在計(jì)算機(jī)視覺(jué)系統(tǒng)中,三維場(chǎng)景信息為圖像分割、目標(biāo)檢測(cè)物體跟蹤等各類(lèi)計(jì)算機(jī)視覺(jué)應(yīng)用提供了更多的可能性,所以在此也介紹一下深度圖像的概念。深度圖像(Depth map)作為一種普遍的三維場(chǎng)景信息表達(dá)方式得到了廣泛的應(yīng)用,深度圖像的每個(gè)像素點(diǎn)的灰度值可用于表征場(chǎng)景中某一點(diǎn)距離攝像機(jī)的遠(yuǎn)近。

RGB圖像
深度圖像

? ? ? ?在初步實(shí)踐三維重建的過(guò)程中,由于我使用的是立體視覺(jué)法,所以對(duì)于深度圖像的獲取?及三維模型生成不做過(guò)于詳細(xì)的介紹,只需了解深度圖像的概念即可,但若能獲取深度圖像,則重建過(guò)程會(huì)更加方便獲取位置信息,后續(xù)會(huì)進(jìn)一步研究。

? ? ? ?三維重建最主要的算法應(yīng)該就是SfM了吧,使用這種方法的軟件比較代表性的有 Pix4D mapper, Autodesk 123D Catch,PhotoModeler, VisualSFM。原諒po主只是初探所以只試了VisualSFM,并將介紹SfM的思想,之后可能會(huì)有更進(jìn)一步的研究略略略。

SfM?(Structure from Motion)? 介紹

? ? ? ?SfM是干嘛用的?關(guān)于SfM的具體介紹可以參考Wiki百科上的簡(jiǎn)介,從SfM的英文構(gòu)成(運(yùn)動(dòng)恢復(fù)法)也可以看出,SfM采用的是通過(guò)一組圖片恢復(fù)三維模型。

多張照片
恢復(fù)稀疏點(diǎn)云

圖片來(lái)自于Photo Tourism: Exploring Photo Collection In 3D,算是三維重建中比較出名的一篇論文了,被引量有2000+,文中比較詳細(xì)的講述了使用多幅圖像重建三維建筑模型的過(guò)程,介紹了如何根據(jù)相機(jī)參數(shù)的變化確定對(duì)應(yīng)點(diǎn)的相關(guān)關(guān)系,從而恢復(fù)三維信息,同時(shí)論文也給了short video演示。關(guān)于相機(jī)標(biāo)定應(yīng)用的提出應(yīng)該是比較早的一篇論文Self-Calibration and Metric Reconstruction Inspite of Varying and Unknown Intrinsic Camera Parameters 。至于什么是相機(jī)標(biāo)定,可以參考相機(jī)標(biāo)定(Camera calibration)。成熟的SfM中最后會(huì)有Bundle Ajustment優(yōu)化,中文翻譯個(gè)人比較喜歡光束平差法,感覺(jué)這個(gè)翻譯更貼合它的原理。關(guān)于BA優(yōu)化的文章很多也很復(fù)雜,同時(shí)對(duì)BA優(yōu)化的改進(jìn)算法也有很多,一不小心可能會(huì)沉迷其中不能自拔,由于是初探,所以也還沒(méi)有涉及那么深的內(nèi)容,這篇文也只是想普及一下三維重建的一些知識(shí)而已,關(guān)于BA優(yōu)化,推薦一篇講的比較詳細(xì)的論文Bundle Adjustment —A Modern Synthesis,同時(shí)也可以參考一個(gè)博主講的BA優(yōu)化原理。

? ? ? ?講完了一些先述知識(shí)之后,就講一下SfM的具體流程。


SfM流程

? ? ?SfM算法是基于無(wú)序圖片的三維重建算法,在其核心算法之前首先需要挑選合適的圖片來(lái)確定相機(jī)參數(shù)之后再進(jìn)行核心計(jì)算。具體步驟主要有以下幾步:

(1)特征提取

? ? ? ?主要使用的是SIFT算子進(jìn)行提取,SIFT?特征是基于物體上的一些局部外觀的興趣點(diǎn)而與影像的大小和旋轉(zhuǎn)無(wú)關(guān),具有尺度和旋轉(zhuǎn)不變性,對(duì)光線、噪聲、微視角改變的容忍度相當(dāng)高,魯棒性強(qiáng),適合用來(lái)提取尺度變換和旋轉(zhuǎn)角度的各種圖片特征點(diǎn)信息,其準(zhǔn)確性強(qiáng)。關(guān)于SIFT的詳細(xì)介紹可以參考Wiki百科

一個(gè)SIFT特征有四個(gè)部分(位置position, 大小scale, 方向direction, 描述向量descriptor)


SIFT算子自己感受一下(當(dāng)作點(diǎn)云看也可以hhhh)

(2)Match and Track

? ? ? ?每個(gè)圖片的特征點(diǎn)被提出來(lái)以后,就需要進(jìn)行圖片兩兩之間的特征點(diǎn)匹配并建立track:

? ? ? ?使用K-d tree算法計(jì)算最近鄰匹配。令最近鄰的距離為d1,再找到第二近的匹配對(duì)點(diǎn)之間距離為d2,如果兩個(gè)距離d1和d2之比小于一個(gè)閾值0.5,就可以判定為可接受的匹配對(duì)。

? ? ? ?對(duì)于圖片特征點(diǎn)的匹配和track一篇知乎問(wèn)題寫(xiě)的蠻詳細(xì)的,貼出鏈接https://www.zhihu.com/question/29885222大家可以去看一下算法實(shí)現(xiàn),SIFT、ANN、RANSAC也有實(shí)現(xiàn)代碼,并且后期的BA優(yōu)化算法、稠密點(diǎn)云實(shí)現(xiàn)CMVS/PMVS也有實(shí)現(xiàn),也有助于理解之后的操作。匹配關(guān)系建立后,需要生成track列表,指同名點(diǎn)的圖像集合。

(3)三維點(diǎn)計(jì)算

? ? ? ?首先圖像中可能匹配多個(gè)特征點(diǎn),就會(huì)出現(xiàn)多對(duì)一的情況,實(shí)際上特征點(diǎn)之間應(yīng)該一一對(duì)應(yīng)。所以還需要一個(gè)去除重復(fù)特征點(diǎn)匹配對(duì)的算法去解決這種多對(duì)一的情況 (對(duì)匹配點(diǎn)可采用采樣一致性算法RANSC八點(diǎn)法計(jì)算基礎(chǔ)矩陣,剔除不滿(mǎn)足基礎(chǔ)矩陣的匹配對(duì))。

用RANSAC和八點(diǎn)算法可以將嘈雜的匹配結(jié)果穩(wěn)定化

? ? ? ?最終可以按照兩幅圖像中的匹配特征點(diǎn)數(shù)不少于一個(gè)閾值即為圖像初選匹配對(duì)。但圖像初選對(duì)有時(shí)并不可靠,所以需要使用幾何約束檢測(cè)其可靠性。幾何約束是基于事實(shí)的,不是所有的特征點(diǎn)都符合物理規(guī)律,所以需要計(jì)算對(duì)極幾何。對(duì)極幾何在上文中有給出鏈接,可以參考其原理。

? ? ? ?初始化匹配對(duì)的相對(duì)定向,根據(jù)RANSC八點(diǎn)法計(jì)算本征矩陣,通過(guò)對(duì)本征矩陣SVD分解得到第二個(gè)圖像的R、T(旋轉(zhuǎn)、平移矩陣),在這一步需要進(jìn)行畸變校正,然后根據(jù)R、T和矯正后的像點(diǎn)坐標(biāo)三角計(jì)算出三維點(diǎn),這里用到的方法是直接線性變換DLT。最終需要將圖片中的像素坐標(biāo)信息聯(lián)系起來(lái),并包含相機(jī)內(nèi)參信息。

? ? ? 描述攝像機(jī)的外參數(shù)用到3x3的旋轉(zhuǎn)矩陣R和1x3的平移向量 (或者攝像機(jī)中心坐標(biāo)向量),而攝像機(jī)的內(nèi)參數(shù)用一個(gè)焦距f和兩個(gè)徑向畸變參數(shù)k1k2描述。

(4)稀疏重建

? ? ? 加入更多的圖像,與之前的圖像進(jìn)行匹配,然后計(jì)算R、T,推算出三維點(diǎn)信息,從而構(gòu)成稀疏點(diǎn)云。

(5)Bundle Ajustment

? ? ? ?光束法平差(Bundle Adjustment),是一個(gè)非線性?xún)?yōu)化的過(guò)程。目的是使重建誤差降低到最小,通過(guò)調(diào)整三維點(diǎn)的旋轉(zhuǎn)平移矩陣及三維點(diǎn)信息使反向投影差最小。

? ? ? ?Bundle Adjustment是一個(gè)迭代的過(guò)程,在一次迭代過(guò)后,將所有三維點(diǎn)反向投影到相應(yīng)圖像的像素坐標(biāo)并分別與初始坐標(biāo)比對(duì),如果大于某個(gè)閾值,則應(yīng)將其從track列表中去掉,如果track中已小于2個(gè),則整個(gè)track也去掉,一直優(yōu)化到?jīng)]有點(diǎn)可去為止。

? ? ? ?(4)、(5)是稀疏點(diǎn)云的重建過(guò)程,實(shí)際上在之后一般會(huì)使用CMVS/PMVS進(jìn)行稠密點(diǎn)云重建,恢復(fù)更多的三維信息,以便于更好地建立三維模型,至于CMVS/PMVS的實(shí)現(xiàn),在上文提到的知乎問(wèn)題中也有講解和實(shí)現(xiàn)。

VisualSFM

? ? ? ?前文提到過(guò),使用SfM的軟件有很多,我實(shí)驗(yàn)的是VisualSFM。這個(gè)軟件是論文Towards Linear-Time Incremental Structure from Motion中給出的開(kāi)源軟件,具體內(nèi)容也可以在作者提供的網(wǎng)站上看到http://ccwu.me/vsfm/。在論文中一方面詳細(xì)的討論了SfM的框架,另一方面也講解了對(duì)于BA優(yōu)化的一種改進(jìn),引入了preconditioned conjugate?gradient(PCG),從而大大減少了時(shí)間復(fù)雜度,這也是在SfM算法提出后首先出現(xiàn)的比較完整的且可以開(kāi)放使用的三維重建軟件。在安裝VisualSFM之前需要配置OpenCV環(huán)境,至于軟件細(xì)致安裝可以參考作者提供的網(wǎng)站或網(wǎng)絡(luò)上其他的安裝教程,敘述相對(duì)都比較全面,且講述了操作流程。

? ? ? ?下面給出一些實(shí)驗(yàn)圖,用的是LOREAL的洗面奶emmmm做了嘗試,用iP7拍了58張照片,照片分辨率是3024*4032。重建稀疏點(diǎn)云的過(guò)程耗時(shí)并不長(zhǎng),但使用CMVS/PMVS進(jìn)行稠密點(diǎn)云重建則要花費(fèi)蠻長(zhǎng)的時(shí)間。洗面奶的結(jié)構(gòu)相對(duì)簡(jiǎn)單,且僅有58張照片,即使分辨率挺高的,但重建花的時(shí)間并沒(méi)有很長(zhǎng),不過(guò)運(yùn)行時(shí)間和物品的結(jié)構(gòu)復(fù)雜度有關(guān)系,嘗試過(guò)學(xué)校里的一個(gè)幾何雕塑,用了6h左右,而且跑程序的時(shí)候電腦太卡了,一直在哀嚎,什么也做不了hhhhh

稀疏點(diǎn)云的構(gòu)建過(guò)程


最終重建出來(lái)的稀疏點(diǎn)云與相機(jī)位置


稀疏點(diǎn)云在MeshLab中的顯示


使用CMVS/PMVS稠密點(diǎn)云重建出的模型

? ? ? ?使用VisualSFM重建出來(lái)的點(diǎn)云數(shù)據(jù)一般需要模型軟件進(jìn)行操作,也有很多可供選擇。我使用的是MeshLab,因?yàn)镸eshLab提供源碼,也可以看到一些代碼的實(shí)現(xiàn)過(guò)程,且較為常用吧。很多人可能會(huì)問(wèn)重建出來(lái)的這個(gè)也太丑了= =,講真我也這么覺(jué)得,不過(guò)這種方法重建出來(lái)的模型,一般都需要進(jìn)一步后期對(duì)模型進(jìn)行優(yōu)化,比如填充,圓角之類(lèi)的操作,所以這也不是重建的最終態(tài),只是出于太懶了所以還沒(méi)有細(xì)化。

? ? ? ?我覺(jué)得SfM方法三維重建中最復(fù)雜的應(yīng)該是圖像的特征提取與匹配、計(jì)算相機(jī)的內(nèi)參外參,從而推算三維點(diǎn)坐標(biāo)的過(guò)程。這種方法是利用點(diǎn)云數(shù)據(jù)堆而成的模型,所以一般在模型軟件中也會(huì)先對(duì)點(diǎn)云的一些多余點(diǎn)進(jìn)行去除,這樣在后期的模型優(yōu)化中也會(huì)更加便捷。

? ? ? ?SfM算是三維重建的一種傳統(tǒng)方法,因?yàn)楝F(xiàn)在的發(fā)展來(lái)看,如何分析物體的結(jié)構(gòu)特征,不僅提取圖像特征,還提取出圖像中的結(jié)構(gòu)和方位信息已經(jīng)成為關(guān)注點(diǎn),這樣恢復(fù)出的三維模型可能會(huì)具有更精確的信息,且不用進(jìn)行復(fù)雜的匹配工作,耗費(fèi)時(shí)間且效率低下,根據(jù)物體的三維信息檢索物體并對(duì)物體進(jìn)行分析,目前也已經(jīng)有一定的研究成果,在之后的研究中,可能也會(huì)關(guān)注些這方面的內(nèi)容,并進(jìn)行分析,blablabla~但新事物的產(chǎn)生并不能對(duì)傳統(tǒng)方法全盤(pán)否定,所以對(duì)于SfM,我覺(jué)得他中間的一些步驟還是可以進(jìn)行更進(jìn)一步的優(yōu)化的,在時(shí)間花費(fèi)上可能能得到進(jìn)一步的提升,或者考慮傳統(tǒng)方法與前沿方法結(jié)合的方法可能也能達(dá)到意想不到的結(jié)果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容