在 OpenCV 中查找像素的世界 space 坐标
Find world space coordinate for pixel in OpenCV
我需要使用 OpenCV 找到像素的世界坐标。因此,当我在我的图像中获取像素 (0,0)(即 upper-left 角)时,我想知道该像素在我的图像平面上对应于哪个 3D 世界 space 坐标。我知道单个像素对应于世界中的一行 3D 点 space,但我想要特定的位于图像平面本身的点。
这是我有第一个(内部)和第二个(外部)矩阵的 OpenCV 针孔模型的公式。我知道我有 u 和 v,但我不知道如何从这个 u 和 v 得到正确的 X、Y 和 Z 坐标。
我已经尝试过的:
- 我想直接将 s 设置为 1,然后通过添加 1 从 [u v 1]^T 生成齐次坐标,如下所示:[u v 1 1]^T。然后我将内在函数与外在函数相乘,并通过添加以下行将其制成 4x4 矩阵:[0 0 0 1]。然后将其倒置并与 [u v 1 1]^T 相乘以获得我的 X、Y 和 Z。但是当我检查四个像这样计算的像素是否位于同一平面(图像平面)上时,这是错误的。
那么,有什么想法吗?
IIUC 您想要 I 与从相机中心向后投影给定像素 P 的光线的图像平面的交点。
我们先定义坐标系。通常的OpenCV约定如下:
- 图片坐标:原点在左上角,u轴向右(增加列),v轴向下。
- 相机坐标:原点在相机中心C,z轴朝向场景,x轴向右,y轴向下。
则相机坐标系中的图像平面为z=fx,其中fx是以像素为单位测量的焦距,像素(u,v)有相机坐标(u - cx, v - cy, fx)。
将它们乘以(固有)相机矩阵 K 的倒数,您将在相机坐标系中得到相同的点。
最后,将其乘以世界到相机坐标变换的倒数 [R | t],你会在世界坐标中得到相同的点。
我需要使用 OpenCV 找到像素的世界坐标。因此,当我在我的图像中获取像素 (0,0)(即 upper-left 角)时,我想知道该像素在我的图像平面上对应于哪个 3D 世界 space 坐标。我知道单个像素对应于世界中的一行 3D 点 space,但我想要特定的位于图像平面本身的点。
这是我有第一个(内部)和第二个(外部)矩阵的 OpenCV 针孔模型的公式。我知道我有 u 和 v,但我不知道如何从这个 u 和 v 得到正确的 X、Y 和 Z 坐标。
我已经尝试过的:
- 我想直接将 s 设置为 1,然后通过添加 1 从 [u v 1]^T 生成齐次坐标,如下所示:[u v 1 1]^T。然后我将内在函数与外在函数相乘,并通过添加以下行将其制成 4x4 矩阵:[0 0 0 1]。然后将其倒置并与 [u v 1 1]^T 相乘以获得我的 X、Y 和 Z。但是当我检查四个像这样计算的像素是否位于同一平面(图像平面)上时,这是错误的。
那么,有什么想法吗?
IIUC 您想要 I 与从相机中心向后投影给定像素 P 的光线的图像平面的交点。
我们先定义坐标系。通常的OpenCV约定如下:
- 图片坐标:原点在左上角,u轴向右(增加列),v轴向下。
- 相机坐标:原点在相机中心C,z轴朝向场景,x轴向右,y轴向下。
则相机坐标系中的图像平面为z=fx,其中fx是以像素为单位测量的焦距,像素(u,v)有相机坐标(u - cx, v - cy, fx)。
将它们乘以(固有)相机矩阵 K 的倒数,您将在相机坐标系中得到相同的点。
最后,将其乘以世界到相机坐标变换的倒数 [R | t],你会在世界坐标中得到相同的点。