2015-06-23 144 views
2

如何在不使用點雲庫(PCL)的情況下估算深度圖像上的點(像素值,單位爲毫米)上的點I(i,j)的表面法線?我已經通過(1),(2)(3),但我正在尋找使用C++標準庫或openCV對每個像素的表面法線的簡單估計。深度圖像上的表面法線

enter image description here

回答

2

你需要知道相機的內部參數,這樣你也可以知道在同一個單位(毫米)像素之間的距離。像素之間的距離是用於從相機一定距離明顯真(即中心像素的值)

如果相機矩陣爲K通常是這樣的:

f 0 cx 
K= 0 f cy 
    0 0 1 

然後,取

   x 
P = inv(K) * y 
       1 

取決於是否在圖像的距離是在Z的投影:像素座標(X,Y),然後從通過像素攝影機原點的光線(在相機世界座標空間)是利用定義軸,或者離中心只有一個歐式距離r,你需要對矢量P進行歸一化處理,使得幅度是到你想要的像素的距離,或者確保P的z分量是這個距離。對於框架中心周圍的像素,這應該接近相同。

如果對相鄰像素(比如說左側和右側)執行相同的操作,則以mm爲單位得到P1和Pr 然後,找到(P1-Pr)的範數,它是相鄰像素之間距離的兩倍毫米。

然後,計算梯度在X和Y

gx = (Pi+1,j - Pi-1,j)/(2*pixel_size) 

然後,把兩個梯度的方向向量:

ax = atan(gx), ay=atan(gy) 


    | cos ax 0 sin ax | |1| 
dx = | 0  1  0 | * |0| 
    | -sin ax 0 cos ax | |0| 

    | 1  0  0 | |0| 
dy = | 0 cos ay -sin ay | * |1| 
    | 0 sin ay cos ay | |0| 

N = cross(dx,dy); 

您可能需要看是否標誌意義,通過看着一定的梯度,並看到dx,dy點到預期的方向。對於N向量,您可能需要對無/一/兩個角度使用負數。

+0

我可以知道如何根據相機的內在參數獲得像素之間的距離:'fx:365.40,fy:365.40,cx:260.93,cy:205.60'? – askingtoomuch

+0

在上面添加了更多細節。 – Photon

+0

感謝您的詳細信息。我用上面座標(273,163)圈出的像素計算P,得到了 'P = [0.0330 -0.1166 1] T'。這是什麼意思?上面的深度值是以毫米爲單位的距離。 – askingtoomuch