在OpenCV中找到像素的世界空间坐标

8
我需要使用OpenCV找到像素的世界坐标。 因此,当我在图像中拍摄像素(即左上角的像素时),我想知道该像素对应于图像平面上哪个3D世界空间坐标。 我知道单个像素对应于3D点的线,但我想要特定位于图像平面本身上的那个点。
这是OpenCV针孔模型的公式,我已经有了第一个(内参)和第二个(外参)矩阵。 我知道我有u和v,但我不知道如何从u和v得到正确的X,Y和Z坐标。
我已经尝试过:
- 我认为只需设置s为1,并通过添加1将[u v 1] ^ T制成齐次坐标,就可以将它乘以内参和外参,并通过添加以下行将其变成4x4矩阵: [0 0 0 1]。 然后将其求逆并与[u v 1 1] ^ T相乘以获取X,Y和Z。 但是,当我检查像这样计算的四个像素是否位于同一平面上(图像平面),结果是错误的。
那么,有什么想法吗?

你如何称呼“图像平面”? - Adrien Descamps
如果计算内参的逆矩阵,可以将其乘到两侧的左边。然后你需要恢复外参(是否有“左逆”?)。最后,你应该得到一些公式,根据你选择的s,给出像素到世界坐标的转换。如果你创建一个描述你的三维世界平面的公式,你可以计算出击中平面的单个s - Micka
添加另一个[1]就像你所做的那样可能也可以,只需保留s...我猜应该是[s*u,s*v,s,1],但我不确定;) - Micka
1个回答

5

据我所知,您希望找到由摄像机中心反向投影给定像素P的射线与图像平面I的交点。

让我们先定义一下坐标系。通常使用的OpenCV约定如下:

  • 图像坐标:原点位于左上角,u轴向右(列递增),v轴向下。
  • 相机坐标:原点位于相机中心C,z轴指向场景,x轴向右,y轴向下。

那么,相机坐标系中的图像平面为z=fx,其中fx是以像素为单位测量的焦距,而像素(u,v)具有相机坐标(u-cx, v-cy, fx)。

将它们乘以相机矩阵K(内部参数矩阵)的逆矩阵,您将获得在度量相机坐标中的同一点。

最后,将其乘以世界坐标系到相机坐标系的转换的逆矩阵[R|t],您将获得同一点在世界坐标系中的坐标。


2
为什么使用 fx 而不是 fy? - Wouter92
在这种情况下,你怎么确定[R|T]是可逆的? - Yingqiang Gao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接