OpenCV的reprojectImageTo3D()函数输出一个“表示3D表面的三通道图像”。
您可以通过以下方式访问此数据:
Vec3f coordinates = _3dImage.at<Vec3f>(y,x);
float depth = _3dImage.at<Vec3f>(y,x)[2];
该函数返回一个向量[X,Y,Z]。
在Gary Bradski和Adrian Kaehler的《Learning OpenCV》中,解释了深度是通过以下公式计算的:
Z = f T / (x_left - x_right)
其中f为焦距,T为相机之间的基础/平移距离,(x_left - x_right)为视差
这个精确的公式已经在OpenCV中实现了(我查看了源代码——但出于某种原因,还有一个额外的负号)。问题是:X、Y、Z值以哪种单位指定?
T以您的单位(例如毫米)为单位,x_l - x_r以像素为单位,[ f ] = ?
当您校准相机时,您会指定棋盘在真实世界中的尺寸(例如毫米)。因此,内部矩阵是否具有真实世界单位?或者是以px为单位指定的?不幸的是,我在文档中找不到答案。
Z
的单位测量(即毫米)代表着人们选择的棋盘图案的任何测量单位。 - KornelT
或B
。因此,这是绝对值,而不是X * squareSize
。 - JackT
或B
单位。 - Kornel