2D坐标到3D世界坐标
2D Coordinate to 3D world coordinate
我想将 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);
请注意确定这是否是您想要的,但绝对有用:)
我想将 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);
请注意确定这是否是您想要的,但绝对有用:)