我想将2D图像坐标转换为3D世界坐标。我正在使用ZED相机,这是一个立体相机和随附的sdk,提供视差图。因此我有深度。两个摄像头相互平行。虽然这个问题很简单,但我无法弄清楚转换背后的数学问题。我有以下信息
1)我有像素信息(即由u和v表示的行和列号)和该像素的深度D,以米为单位。
2)我也知道两个摄像机的焦距和cx,cy值
3)两个投影中心B(基线)之间的距离是已知的。
我想知道如何从图像中的像素(行,列,深度)到世界坐标中的(X,Y,Z)。
假设世界坐标系的原点是两个摄像机之间的中心点,并且是地面的垂直下方。 (摄像机被称为H的高度)。
谢谢。
答案 0 :(得分:4)
正如您已经知道每个像素的深度D(以米为单位),您不需要相机之间的基线B(您需要根据视差值计算深度)。事实上,D已经是你搜索过的Z坐标。
针孔相机模型的通用公式(假设没有失真)是:
u = fx * (X / Z) + cx
v = fy * (Y / Z) + cy
因此可以直接计算3D坐标:
X = Z / fx * (u - cx)
Y = Z / fy * (v - cy)
[Z = D]
请注意,只有在使用经过校正的图像(或低失真图像)时,这才是正确的。
答案 1 :(得分:0)
偶然发现了这一点。我也在使用ZED相机。
对于任何有趣的人来说,仅供参考,ZED API(SDK v.1.2)为此提供了一个很好的功能: 您可以使用
简单地检索图像上所有点的XYZ地图 sl::zed::Mat xyz = zed->retrieveMeasure(sl::zed::XYZABGR);
请注意这是否是您所追求的,但绝对有用:)