reprojectImageTo3D函數
該函數將視差圖,通過投影矩陣Q,得到一副映射圖,圖像大小與視差圖相同,且每個像素具有三個通道,分別存儲了該像素位置在相機座標系下的三維點座標在x, y, z,三個軸上的值,即每個像素的在相機座標系下的三維座標。
void cv::reprojectImageTo3D(
InputArray disparity,
OutputArray _3dImage,
InputArray Q,
bool handleMissingValues = false,
int ddepth = -1
)
運算如下:
[X,Y,Z,W]T=Q∗[x,y,disparity(x,y),1]T
_3dImage(x,y)=(X/W,Y/W,Z/W)
其中:
Q=⎣⎢⎢⎡10000100000Tx−1−cx−cyfTxcx−cx′⎦⎥⎥⎤,Q⎣⎢⎢⎡xyd1⎦⎥⎥⎤=⎣⎢⎢⎡x−cxy−cyfTx−d+cx−cx′⎦⎥⎥⎤=⎣⎢⎢⎡XYZW⎦⎥⎥⎤
WZ=−[d−(cx−cx′)]Txf
這裏有個地方需要注意,如果獲得視差圖像是CV_16S類型的,這樣的視差圖的每個像素值由一個16bit表示,其中低位的4位存儲的是視差值得小數部分,所以真實視差值應該是該值除以16。在進行映射後應該乘以16,以獲得毫米級真實位置。