[英]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.