Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 二维坐标到三维世界坐标_Opencv_Computer Vision - Fatal编程技术网

Opencv 二维坐标到三维世界坐标

Opencv 二维坐标到三维世界坐标,opencv,computer-vision,Opencv,Computer Vision,我想将2D图像坐标转换为3D世界坐标。我使用的是ZED相机,它是一款立体相机,附带的sdk提供了视差图。因此我有深度。这两台摄像机彼此平行。虽然这个问题本质上很琐碎,但我无法理解转换背后的数学原理。我有以下资料 1) 我有像素信息(即,由u和v表示的行和列编号)以及该像素处的深度D(以米为单位) 2) 我还知道两台相机的焦距和cx,cy值 3) 两个投影中心B(基线)之间的距离已知 我想知道如何从图像中的像素(行、列、深度)转换到世界坐标中的像素(X、Y、Z) 假设世界坐标系的原点为两个摄影机之

我想将2D图像坐标转换为3D世界坐标。我使用的是ZED相机,它是一款立体相机,附带的sdk提供了视差图。因此我有深度。这两台摄像机彼此平行。虽然这个问题本质上很琐碎,但我无法理解转换背后的数学原理。我有以下资料

1) 我有像素信息(即,由u和v表示的行和列编号)以及该像素处的深度D(以米为单位)

2) 我还知道两台相机的焦距和cx,cy值

3) 两个投影中心B(基线)之间的距离已知

我想知道如何从图像中的像素(行、列、深度)转换到世界坐标中的像素(X、Y、Z)

假设世界坐标系的原点为两个摄影机之间的中心点,并垂直位于地面下方。(相机的高度称为H)


谢谢。

因为您已经知道每个像素的深度D(以米为单位),所以不需要相机之间的基线B(需要从视差值计算深度)。事实上,D已经是搜索到的Z坐标

针孔相机模型的一般公式(假设没有失真)为:

因此,计算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)

请注意,确定这是否是您想要的,但肯定是一些有用的东西:)

X = Z / fx * (u - cx)
Y = Z / fy * (v - cy)
[Z = D]