计算 3D 世界点

Posted

技术标签:

【中文标题】计算 3D 世界点【英文标题】:Calculating 3D world point 【发布时间】:2017-05-09 17:17:05 【问题描述】:

我是 OpenCV 的初学者,我想从 2D(投影到图像上)中找到 3D 点,并且知道一个点的三分之二的世界坐标。

我有什么:

    已校准的相机(已知:内在参数矩阵、畸变系数向量) 旋转向量和平移向量 (u, v) - 图像上点的坐标 一个点的两个已知世界坐标和一个未知坐标

问题变体 #1 已知:X,Y 未知:Z

问题变体 #2 已知:X,Z 未知:Y

问题变体 #3 已知:Y、Z 未知:X

如何找到第三个未知坐标?有可能吗?

【问题讨论】:

我假设rotation vectortranslation vector 是相机位姿,这是允许将世界坐标/帧中的点转换为相机坐标/帧的齐次变换。 XYZ 以世界坐标/帧而不是相机坐标/帧表示。对吗? 如果是这样,我认为#2 和#3 应该是可能的:使用rvectvecZ_w 转换为Z_c,将uv 转换为标准化相机帧(xy)使用内在参数,然后将xy乘以Z。你应该得到X_cY_c并得到X_wY_w,你必须乘以使用rvectvec 的逆齐次变换。我不知道#1。 从失真、内在函数和外在函数中,您可以计算出从相机中心穿过像素的 3D 射线。如果你跟随那条射线,你最终会找到具有你想要的 2 个坐标值的点,然后你也知道第三个。 【参考方案1】:

是的,这是可能的。考虑没有非线性失真的简单情况。令 Ki 为相机矩阵的倒数,相机中心位于世界原点(即没有旋转也没有平移)。令 p=(u, v, 1) 为齐次像素坐标。那么穿过像素的光线是:

s * P = Ki * p

其中s > 0 是一个未知的比例。但是s * P = [X, Y, Z],所以如果你知道 X、Y 或 Z 中的任何一个,你就可以解出s 并找到缺失的坐标。

对于非零旋转平移,将 Ki 替换为投影矩阵的逆矩阵。对于非零失真,用完整的重投影方程代替简单的 Ki 乘法。

【讨论】:

感谢您的回复!还有一个问题。在非零旋转平移的情况下,如何将投影矩阵(大小 3 x 4)的逆矩阵乘以 p(大小 3 x 1)?在这种情况下,p = (u, v, 1, 1),对吗? 您只需要求解 P 方程 p = s * K * (R* P + t),因此 s * P = Rt * (Ki * p - t),其中 Rt = inv (R)是camera-from-world旋转矩阵的转置,t是从camera到世界原点的平移向量

以上是关于计算 3D 世界点的主要内容,如果未能解决你的问题,请参考以下文章

THREE.js:计算物体上一点的世界空间位置

关于Unity3d的世界空间和本地空间的一点思考

重建我的3D世界代码开源连载-1

重建我的3D世界代码开源连载-1

重建我周围的3D世界代码开源连载-1

如何在 OpenCV 中计算点的 3D 坐标