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,以获得毫米级真实位置。