注意:本文中的**必須使用opencv3.0或以上版本進行編譯,因為很多函式是3.0以後才加入的。
目錄:
#sfm介紹
sfm的全稱為structure from motion,即通過相機的移動來確定目標的空間和幾何關係,是三維重建的一種常見方法。它與kinect這種3d攝像頭最大的不同在於,它只需要普通的rgb攝像頭即可,因此成本更低廉,且受環境約束較小,在室內和室外均能使用。但是,sfm背後需要複雜的理論和演算法做支援,在精度和速度上都還有待提高,所以目前成熟的商業應用並不多。
本系列介紹sfm中的基本原理與演算法,借助opencv實現乙個簡易的sfm系統。
#小孔相機模型
在計算機視覺中,最常用的相機模型就是小孔模型(小孔成像模型),它將相機的透鏡組簡化為乙個小孔,光線透過小孔在小孔後方的像面上成像,如下圖所示。
由上圖可知,小孔模型成的是倒像,為了表述與研究的方便,我們常常將像面至於小孔之前,且到小孔的距離仍然是焦距f,這樣的模型與原來的小孔模型是等價的,只不過成的是正像,符合人的直觀感受。在這種情況下,往往將小孔稱作光心(optical center)。
小孔模型是一種理想相機模型,沒有考慮實際相機中存在的場曲、畸變等問題。在實際使用時,這些問題可以通過在標定的過程中引入畸變引數解決,所以小孔模型仍然是目前最廣泛使用的相機模型。
#座標系
為了用數學研究sfm,我們需要座標系。在sfm中主要有兩類座標系,一類為相機座標系,一類為世界座標系。在本系列中,所以座標系均為右手座標系。
相機座標係以相機的光心(小孔)作為原點,x軸為水平方向,y軸為豎直方向,z軸指向相機所觀察的方向。
世界座標系的原點可以任意選擇,與相機的具體位置無關。
#內參矩陣
設空間中有一點p,若世界座標系與相機座標系重合,則該點在空間中的座標為(x, y, z),其中z為該點到相機光心的垂直距離。設該點在像面上的像為點p,畫素座標為(x, y),那麼(x, y, z)和(x, y)有什麼關係呢?
由上圖可知,這是乙個簡單的相似三角形關係,從而得到
x =f
xz,y
=fyz
x = \frac,\ \ \ y = \frac
x=zfx
,y=z
fy但是,影象的畫素座標系原點在左上角,而上面公式假定原點在影象中心,為了處理這一偏移,設光心在影象上對應的畫素座標為(cx
,cy)
(c_x, c_y)
(cx,c
y),則
x =f
xz+c
x,y=
fyz+
cyx = \frac + c_x,\ \ \ y =\frac + c_y
x=zfx
+cx
,y=z
fy+
cy將以上關係表示為矩陣形式,有
z [x
y1]=
[f0c
x0fc
y001
][xy
z]z\left[\begin x\\y\\1 \end\right] = \left[\begin f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1\end \right]\left[\begin x\\y\\z \end \right]
z⎣⎡xy
1⎦⎤
=⎣⎡
f00
0f0
cx
cy1
⎦⎤
⎣⎡x
yz⎦
⎤其中,將矩陣
k =[
f0cx
0fcy
001]
k = \left[\begin f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1\end \right]
k=⎣⎡f
000
f0c
xcy
1⎦
⎤稱為內參矩陣,因為它只和相機自身的內部引數有關(焦距,光心位置)。
#外參矩陣
一般情況下,世界座標系和相機座標系不重合,這時,世界座標系中的某一點p要投影到像面上時,先要將該點的座標轉換到相機座標系下。設p在世界座標系中的座標為x,p到光心的垂直距離為s(即上文中的z),在像面上的座標為x,世界座標系與相機座標系之間的相對旋轉為矩陣r(r是乙個三行三列的旋轉矩陣),相對位移為向量t(三行一列),則
s x=
k[rx
+t]sx = k[rx + t]
sx=k[r
x+t]
其中r x+
trx + t
rx+t
即為p在相機座標系下的座標,使用齊次座標改寫上式,有
s x=
k[rt
][x1
]sx = k\left[\beginr & t\end\right]\left[\beginx\\1\end\right]
sx=k[r
t]
[x1
]其中[rt
]\left[\beginr & t\end\right]
[rt]
是乙個三行四列的矩陣,稱為外參矩陣,它和相機的引數無關,只與相機在世界座標系中的位置有關。
#相機的標定
相機的標定,即為通過某個已知的目標,求取相機內參矩陣的過程。最常用的標定目標就是棋盤格。用相機對棋盤格從不同角度拍攝多張**,然後將這些**匯入標定程式或演算法,即可自動求出相機的內參。
相機標定的方法和工具,我在這篇文章中已有詳細的介紹,這裡就不再細述了。在此提醒一下,之後的文章中若無特殊說明,所有相機均假定內參已知。
日常小結 opencv3 sfm
opencv3中間新增了額外的sfm模組。但是新版本還是有很多問題這裡說下配置。先貼幾個 首先opencv的就從官網下就完了 其次擴充套件包從github下 然後就是編譯安裝就行。如果要執行sfm的demo。viz需要先安裝。這裡提供幾個編譯選項 mkdir build cd build camke...
OpenCV實現SfM(二) 雙目三維重建
目錄 在三維重建前,我們先研究一下同一點在兩個相機中的像的關係。假設在世界座標系中有一點 p 座標為 x 它在1相機中的像為x1 在2相機中的像為x2 注意x1 和x2 為齊次座標,最後乙個元素是1 如下圖。到兩個相機像面的垂直距離分別為s1 和s2 且這兩個相機具有相同的內參矩陣 k 與世界座標系...
(SfM三維重建一)Colmap使用體驗
使用影象進行三維重建,colmap應該是比較常使用的軟體,因為是開源的,所以也可以根據自己需求獲取很多中間資料,實現一些小功能。它整合了sfm和mvs兩個部分,所以輸入影象後,可直接進行影象匹配 稀疏重建 稠密重建 網格重建,一套流程。並且提供圖形化介面,因此之前很多的重建實驗都用它完成。個人感覺其...