opencv的reprojectImageTo3D()中的深度贴图值

时间:2015-08-04 06:28:46

标签: c++ opencv camera-calibration stereo-3d

OpenCV的reprojectImageTo3D()输出表示3D表面的" 3通道图像" 。 您可以通过

访问此数据
Vec3f coordinates = _3dImage.at<Vec3f>(y,x);
float depth = _3dImage.at<Vec3f>(y,x)[2];

女巫返回一个向量[X,Y,Z]。

&#34;学习OpenCV&#34; 由Gary Bradski&amp; Adrian Kaehler解释说,深度是由

计算的

Z = f T /(x_left - x_right)

其中f =焦距,T =相机之间的眼底/平移,(x​​_left - x_right)=视差

这个确切的公式是在OpenCV中实现的(我检查了源代码 - 但是由于某种原因,还有一个额外的负号)。问题是:在哪个单位中指定了X,Y,Z值?

T在你的单位(例如mm),x_l - x_r是像素而 [f] =?

校准相机时,请以实际单位(例如mm)指定棋盘的大小。因此,内在矩阵是否具有真实世界单位?或者是在px中指定的?不幸的是我在文档中找不到答案。

1 个答案:

答案 0 :(得分:1)

执行深度重建的基础方程是:

Z = fB/d,其中

  • f是焦距(以像素为单位),您将其称为相机之间的眼底/平移
  • B是立体声基线(以米为单位)
  • d是测量相应点之间视网膜位置差异的差异(以像素为单位)
  • Z是沿着摄像机Z轴的距离

图像点的3D位置(X,Y,Z)(例如(u,v)以像素为单位)可以以米,厘米,毫米或任何您选择的方式给出,因为3D坐标(X,Y,Z)在与棋盘的方形尺寸相同的单位。例如,如果将方形大小定义为1 cm,则3D坐标也将以cm为单位。

即:

Size boardSize(4, 5); // 4x5 chessboard
float squareSize = 0.025F; // 0.025 meters
for( int i = 0; i < boardSize.height; i++ )
    for( int j = 0; j < boardSize.width; j++ )
        corners.push_back(Point3f(float(j*squareSize), float(i*squareSize), 0.0F));

P.S .:
确定Z后,可以使用通常的投影相机方程计算XY

  • X = uZ/f
  • Y = vZ/f