我想将2D图像坐标转换为3D世界坐标。我使用的是ZED相机,它是一个立体相机,附带的sdk提供了视差图。因此我有深度。这两台照相机彼此平行。虽然这个问题是微不足道的,但我无法理解转换背后的数学原理。我有以下信息
1)我有像素信息(即用u和v表示的行号和列号)和该像素处的深度D,单位是米。
2)我也知道两个相机的焦距和cx, cy值
3)投影B(基线)两个中心之间的距离已知。
我想知道如何从图像中的像素(行,列,深度)到世界坐标中的(X,Y,Z)。
假设世界坐标系原点为两个摄像机之间的中心点,垂直下方为地面。(相机的高度称为H)。
谢谢。
由于您已经知道每个像素的深度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]
请注意,这只有在您正在处理经过校正的图像(或低失真的图像)时才正确。
偶然发现的。我也在用ZED相机。
仅供任何感兴趣的人参考,ZED api (SDK v. 1.2)为此提供了一个很好的函数:您可以简单地使用
检索图像上所有点的XYZ地图 sl::zed::Mat xyz = zed->retrieveMeasure(sl::zed::XYZABGR);
请确定这是否是您所追求的,但绝对是有用的东西:)