来自 3 个视点的 3 个图像上的三个点如何获得其在 3d 空间中的坐标?
Posted
技术标签:
【中文标题】来自 3 个视点的 3 个图像上的三个点如何获得其在 3d 空间中的坐标?【英文标题】:Having three points on 3 images from 3 viewpoints how to get its coordinates in 3d space? 【发布时间】:2018-10-21 21:20:26 【问题描述】:我在 3d 空间中有 3 个视点位置(3d 网格上的 x、y、z 坐标)、方向(相对于视点原点 x、y、z 向量)。它们都看起来并且每个都在空间中准确地看到三个点(标记(x,y),背景被过滤掉)(比如我们在白色图像上有一个红色、蓝色、绿色的点)。我们不知道除了分辨率之外的任何其他视点相机属性,并且这是相同(非常相似)的相机。我们如何才能得到我们在空间中的点位置?
【问题讨论】:
您只需要两个点/视口对,因为每对定义一条线,两条线的交点形成一个点。 视口的分辨率信息不足以进行光线投射。您必须能够构建视口矩阵。 如果我们在每个视点检测到 3 个点(红、绿、蓝)会怎样? 听起来像bundle adjustment。 您使用的是什么类型的标记?如果您使用 Aruco 标记(docs.opencv.org/3.1.0/d5/dae/tutorial_aruco_detection.html)之类的东西,您可以使用姿势估计来尝试根据标记的已知大小和位置找出您的位置。 【参考方案1】:您还需要一条信息:相机的视野:
https://blog.codinghorror.com/content/images/uploads/2007/08/6a0120a85dcdae970b0120a86d9495970b-pi.png
我将水平视野称为hFOV
,将垂直视野称为vFOV
。不过,您只需要其中一个数字即可解决您的问题,因为hFOV/vFOV
等于纵横比(水平分辨率/垂直分辨率)。
有了这些信息,您可以使用相机的位置(Pc
,3D 矢量)、方向(Dc
,3D 矢量)、分辨率(R
,2D 矢量)和点在视图中的位置空间(Pp
,一个 2D 向量)来构建一个 3D 向量,该点位于空间中。
如果该点正好位于视图的中间(Pp / R = 0.5
),那么这个向量就是Pc + d * Dc
,其中d
是任何正数,对应于与相机的距离(这将成为我们的变量我们需要解决的问题。
Pp
的x
坐标在x
中从-hFOV/2
旋转x
到hFOV/2
关于垂直于屏幕Dc
和x
方向的向量(你可以找到这与叉积)。 y
坐标在 y 中的作用相同。我们将这个旋转向量称为D'c
。通过θ
旋转一个向量关于另一个向量的问题在这里解决:Rotating a Vector in 3D Space
所以现在我们有了关系:
Position of marker = Pc + d * D'c
现在,d
仍然是未知数(与相机的距离)。但是如果我们对两个相机这样做,我们可以求解方程组并找到标记的绝对位置。第三个摄像头可用于验证。
注意:这与@osama-alkoky 的答案或多或少相同,只是手动版本。如果您要做很多这方面的工作,学习投影/变换矩阵是一个好主意。
【讨论】:
【参考方案2】:我假设您已经校准了 3 个摄像头,否则我不知道您的问题是否存在解决方案。
如果您有相机校准参数,即相机矩阵 (A)、旋转矢量 (T)、平移矢量 (R)。从这些您可以使用P = A[R|T]
获得投影矩阵。这意味着您可以使用X.Pi = x
将现实世界 X 中的任何 3d 点投影到图像 i,这意味着您可以使用xi' = xi.P3T - P1T
和yi' = yi.P3T - P2T
为每个视图获得一个线性方程组@ PiT 是第 i 列的转置在 P 中。您可以使用奇异值分解来求解这个方程组。
参考资料:
-
http://www.robots.ox.ac.uk/~az/tutorials/tutoriala.pdf
https://github.com/opencv/opencv_contrib/blob/master/modules/sfm/src/triangulation.cpp
http://www.morethantechnical.com/2012/01/04/simple-triangulation-with-opencv-from-harley-zisserman-w-code/
【讨论】:
以上是关于来自 3 个视点的 3 个图像上的三个点如何获得其在 3d 空间中的坐标?的主要内容,如果未能解决你的问题,请参考以下文章