簡體   English   中英

Disparity map中的OpenCv深度估計

[英]OpenCv depth estimation from Disparity map

我正在嘗試使用OpenCV估計立體對圖像的深度。 我有視差圖和深度估計可以獲得如下:

             (Baseline*focal)
depth  =     ------------------
           (disparity*SensorSize)

我使用塊匹配技術在兩個校正圖像中找到相同的點。 OpenCV允許設置一些塊匹配參數,例如BMState->numberOfDisparities

塊匹配過程后:

cvFindStereoCorrespondenceBM( frame1r, frame2r, disp, BMState);
cvConvertScale( disp, disp, 16, 0 );
cvNormalize( disp, vdisp, 0, 255, CV_MINMAX );

我發現深度值為:

if(cvGet2D(vdisp,y,x).val[0]>0)
   {
   depth =((baseline*focal)/(((cvGet2D(vdisp,y,x).val[0])*SENSOR_ELEMENT_SIZE)));
   }

但由於BMState->numberOfDisparities的值改變了結果值,所獲得的深度值與使用前一個公式獲得的值不同。

如何設置此參數? 怎么改變這個參數?

謝謝

當且僅當從左攝像機到右攝像機的運動是純平移(特別是平行於水平圖像軸)時,簡單公式才有效。

實際上,情況並非如此。 例如,通常在校正圖像之后,即在使用已知的基本矩陣對其進行變形之后執行匹配,使得相應的像素被約束為屬於同一行。 在校正后的圖像上進行匹配后,可以使用整形扭曲的反轉將它們重新映射到原始圖像上,然后三角測量到3D空間中以重建場景。 OpenCV有一個例行程序: reprojectImageTo3d

上面提到的公式不能用作相機平面和圖像平面不相同,即相機將位於某個高度,並且它捕獲的平面將在地面上。 所以,你必須對這個公式做一點修改。 您可以通過曲線擬合多項式上擬合這些視差值和已知距離。從中您將獲得可用於其他未知距離的系數。 第二種方法是使用wrap matrix和reprojectimageTo3d(Opencv API)創建一個3d Point Cloud。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM