單目相機重建場景的若干問題

2021-06-26 23:07:59 字數 2664 閱讀 9922

本文主要討論下本人對單攝像機是否能重建三維目標場景的理解,不足之處請賜教之。

首先,簡單討論下雙目測距的原理。如下圖:

模型俯檢視

模型立體檢視

測距的公式:

從公式看,想要得

到z值,需要知道f,t,和

xl-xr,分別是焦距,光心距離和視差。

焦距可以通過標定的方法得到或者直接用影象的exif資訊,光心距離是放置攝像機時確定的,視差可以通過匹配獲得。如果用上面的模型拍攝了兩幅影象,我們直接得到的是f和t,當然,如果不是得到絕對的位置,這兩個值就是個定值,對重建三維目標沒有影響。重要的是得到視差值,影象點的匹配可以由多種匹配演算法獲取,大多數匹配演算法匹配的是稀疏點,重建的目標必須是稠密的,因此這裡分為兩條路:1、稠密匹配得到兩幅圖的稠密是視差圖;2、由稀疏匹配估計稠密視差圖,這可以找些**看看怎麼做的。比較單目,雙目測距(重建)相對容易,實際操作還是需要解決不少問題。

接下來討論下單目如何測距。之前必須明白一點,就是單目單檢視是沒法得到實際深度的,這就和常說的,單隻眼睛看到的都是2維的,兩隻眼睛看到的才是3維的,才是有立體的感覺,這種立體實際就是深度。可能有人認為自己乙個眼睛能看到目標都是有深度的,這依賴於兩個方面:1、人本身對看到的目標的理解,比如球,桌子,在人的理解中,它們的形狀是在大腦中有儲備的,也就是先驗知識,因此人能識別出看到的東西是什麼形狀的;2、單隻眼睛運動過程能夠產生目標的深度資訊,這也就是基於影象序列的三維重建,也是本文將討論的主體內容。

在討論單目重建的問題之前,有必要先了解下攝像機模型,就是攝像機如何拍攝場景的,這裡討論針孔相機模型。

針***機模型

其中oc是相機光心,且是攝像機座標的原點,xc,yc,zc是3個攝像機座標軸;平面pi是影象平面,p是zc和pi的角交點,是影象座標原點,x,y是影象座標軸,f是焦距,空間有一點xc,交pi於m。這裡涉及到3個座標系:影象座標系、攝像機座標系和世界座標系。其中攝像機座標系和世界座標系是同一座標系,影象座標系的原點是光軸與影象平面的原點,至於x,y方向可以自己決定,這裡向右為x方向,向下為y方向,和攝像機座標系保持一致。

控制項有一點xc,投影到影象平面m,這裡的xc是三維向量(x,y,z),投影的m座標是二維向量,也就是三維到二維的投影,由高等代數知識,可以知道,空間同構的充要條件是維數相同,故這種投影是不可逆的。

這裡,我們可以看出,如果xc的每個分量都增加k倍,得到的m的座標不會變化。也就是說在攝像機光心和m點的連線上的任何點都會投影到影象的m點上來,反過來講,知道影象中的m點座標,只能知道空間點在這條射線上,僅從m點座標和攝像機引數是得不到空間點的實際座標的。

實際應用中,光軸與影象的交點不一定是影象的中心,因此中間存在偏移量(x0,y0),此時的投影公式寫成:

了解了攝像機模型後,來討論下單相機兩檢視三維重建的一些問題。兩檢視三維重建的目的是重建出相同目標中的場景相對深度資訊,即重建三維點雲。如果知道攝像機矩陣p1,p2,影象中匹配點的深度資訊可以線性求解,因此,三維重建的問題轉化為如何求解兩個相機矩陣p1和p2。求解攝像機矩陣需要解兩個部分:內引數和外引數,內引數中的焦距可以讀取影象的exif資訊得到,如果沒有exif資訊,在相差乙個尺度下,焦距也是確定;外引數中的r,t需要用到標定的方法獲取或者通過本質矩陣來得到相對的r,t,這裡的兩個相機的r,t是沒法得到絕對的值的,但是在相差乙個射影變換下r,t是確定的,這部分可以參考多檢視幾何一書。連線兩個攝像機矩陣的關係是本質矩陣或者基本矩陣,本質矩陣是在歸一化座標下的基本矩陣,本質矩陣比基本矩陣擁有更多的攝像機資訊,在知道相機內引數下,基本矩陣和本質矩陣是可以相互計算的:e=k1

tfk2

,其中k1

t是相機1的內參矩陣的轉置,k2

是相機2的內參矩陣。基本矩陣的計算方法主要有8點演算法和7點演算法,計算本質矩陣演算法是5點演算法。由本質矩陣利用svd分解可以求解兩個攝像機矩陣,這兩攝像機矩陣一定是在某乙個射影變換下的,實際上相機的相對位置是不變的,重建出來的空間三維目標在展示時的位置不同而已。本質矩陣推倒出兩個相機的相對運動關係,即r,t。如果第乙個相機的矩陣為p1=k1[i,0],則第二個相機的矩陣為p2=k2[r,t]。在滿足相差乙個射影變換的前提下,兩相機的矩陣是確定的,單目影象序列的內參矩陣是一樣的,因此,重建過程可以無需過多考慮內引數的精度,因為這並不是測量。實際的應用中,相機的位置越規則越好,目前的相機,無論是手機或是單反,拍攝的影象基本都有exif資訊,因而內參矩陣可以算是已知的了,減少了攝像機標定的工作(一般exif資訊中的焦距單位是mm,轉換成畫素的關係式為:畫素數/dpi*25.4=公釐數,dpi也是可以從exif資訊中讀取到的)。這樣就已知了相機矩陣,對於影象的一對匹配點是可以計算出空間位置的了,接下來就是bundle adjustment的事情了。

單鏈表的若干問題

1 試編寫演算法將帶頭結點單鏈表就地逆置,所謂 就地 是指輔助空間為o 1 解析 此問題有兩種解法。a 把頭節點摘下來,然後用頭插法建鍊錶就形成所謂的就地逆置 b 依次遍歷將指標反轉,不過最後乙個節點需要注意一下 兩演算法時間複雜度都是o n 空間都是o 1 演算法 第一種演算法 就地反轉 int ...

單鏈表的若干問題

1 試編寫演算法將帶頭結點單鏈表就地逆置,所謂 就地 是指輔助空間為o 1 解析 此問題有兩種解法。a 把頭節點摘下來,然後用頭插法建鍊錶就形成所謂的就地逆置 b 依次遍歷將指標反轉,不過最後乙個節點需要注意一下 兩演算法時間複雜度都是o n 空間都是o 1 演算法 第一種演算法 cpp view ...

單鏈表的若干問題

1 試編寫演算法將帶頭結點單鏈表就地逆置,所謂 就地 是指輔助空間為o 1 解析 此問題有兩種解法。a 把頭節點摘下來,然後用頭插法建鍊錶就形成所謂的就地逆置 b 依次遍歷將指標反轉,不過最後乙個節點需要注意一下 兩演算法時間複雜度都是o n 空間都是o 1 演算法 第一種演算法 就地反轉 int ...