【OpenCV】reprojectImageTo3D函數

reprojectImageTo3D函數

該函數將視差圖,通過投影矩陣Q,得到一副映射圖,圖像大小與視差圖相同,且每個像素具有三個通道,分別存儲了該像素位置在相機座標系下的三維點座標在x, y, z,三個軸上的值,即每個像素的在相機座標系下的三維座標。

void cv::reprojectImageTo3D( 
	InputArray disparity, 	//視差圖像
	OutputArray _3dImage,	//映射後存儲三維座標的圖像
	InputArray Q,			//重投影矩陣 通過stereoRectify得到
	bool handleMissingValues = false, //計算得到的非正常值是否給值,如果爲true則給值10000
	int ddepth = -1			//輸出類型 -1 即默認爲CV_32FC3 還可以是 CV_16S, CV_32S, CV_32F
)

運算如下:
[X,Y,Z,W]T=Q[x,y,disparity(x,y),1]T [X, Y, Z, W]^T=Q*[x, y, disparity(x, y), 1]^T
_3dImage(x,y)=(X/W,Y/W,Z/W) \_3dImage(x, y)=(X/W, Y/W, Z/W)

其中:
Q=[100cx010cy000f001TxcxcxTx],Q[xyd1]=[xcxycyfd+cxcxTx]=[XYZW]Q= \left[ \begin{matrix} 1 & 0 &0& -c_x \\ 0 & 1 & 0 &-c_y\\ 0 & 0 & 0 &f\\ 0 & 0 & \frac{-1}{T_x} &\frac{c_x-c_x^\prime}{T_x} \end{matrix} \right], Q \begin{bmatrix} x\\ y \\ d \\ 1 \end{bmatrix} = \begin{bmatrix} x-c_x\\ y-c_y \\ f\\ \frac{-d+c_x-c_x^\prime}{T_x} \end{bmatrix} = \begin{bmatrix} X\\ Y \\ Z\\ W \end{bmatrix}
ZW=Txf[d(cxcx)]\frac{Z}{W}=\frac{T_xf}{-[d-(c_x-c_x^\prime)]}

這裏有個地方需要注意,如果獲得視差圖像是CV_16S類型的,這樣的視差圖的每個像素值由一個16bit表示,其中低位的4位存儲的是視差值得小數部分,所以真實視差值應該是該值除以16。在進行映射後應該乘以16,以獲得毫米級真實位置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章