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中指定的?不幸的是我在文档中找不到答案。
答案 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
后,可以使用通常的投影相机方程计算X
和Y
:
X = uZ/f
Y = vZ/f