1. 程式人生 > >2d-3d座標轉換

2d-3d座標轉換

對於常規相機,SLAM裡使用針孔相機模型
 在這裡插入圖片描述

簡而言之,一個空間點[x,y,z]和它在影象中的畫素座標[u,v,d] (d
指深度資料) 的對應關係是這樣的:
u = x f x

z + c x , u=x⋅f_xz+cx,
v = y
f y z + c y , v=y⋅f_yz+cy,

d = z s , d=z⋅s,
其中,fx,fy指相機在x,y兩個軸上的焦距,cx,cy指相機的光圈中心,s指深度圖的縮放因子。
這個公式是從(x,y,z)推到(u,v,d)的。反之,我們也可以把它寫成已知(u,v,d),推導(x,y,z)的方式。請讀者自己推導一下。
不,還是我們來推導吧……公式是這樣的:
z = d / s z=d/s
x = ( u c x ) z / f x , x=(u−cx)⋅z/f_x ,
y = ( v c y ) z / f y y=(v−cy)⋅z/f_y
怎麼樣,是不是很簡單呢?事實上根據這個公式就可以構建點雲啦。

通常,我們會把fx,fy,cx,cy這四個引數定義為相機的內參矩陣C,也就是相機做好之後就不會變的引數。相機的內參可以用很多方法來標定,詳細的步驟比較繁瑣,我們這裡就不提了。給定內參之後呢,每個點的空間位置與畫素座標就可以用簡單的矩陣模型來描述了:
在這裡插入圖片描述

和t是相機的姿態。R代表旋轉矩陣,t代表位移向量。因為我們現在做的是單幅點雲,認為相機沒有旋轉和平移。所以,把R設成單位矩陣I,把t設成了零。s是scaling factor,即深度圖裡給的資料與實際距離的比例。由於深度圖給的都是short (mm單位),s通常為1000。

ransac

在這裡複述下RANSAC的檢測流程,詳細的過程見上一篇翻譯文章:
RANSAC演算法的輸入是一組觀測資料,一個可以解釋或者適應於觀測資料的引數化模型,一些可信的引數。

RANSAC通過反覆選擇資料中的一組隨機子集來達成目標。被選取的子集被假設為局內點,並用下述方法進行驗證:
1.有一個模型?適應於假設的局內點,即所有的未知引數?都能從假設的局內點計算得出。
2.用1中得到的模型去測試所有的其它資料,如果某個點適用於估計的模型,認為它也是局內點。
3.如果有足夠多的點被歸類為假設的局內點,那麼估計的模型?就足夠合理。
4.然後,用所有假設的局內點去重新估計模型,?因為它僅僅被初始的假設局內點估計過。
5.最後,通過估計局內點與模型的錯誤率來評估模型?。
這個過程被重複執行固定的次數?,每次產生的模型要麼因為局內點太少而被捨棄,要麼因為比現有的模型更好而被選用。