如何获得世界空间中二维点的射线方程
Posted
技术标签:
【中文标题】如何获得世界空间中二维点的射线方程【英文标题】:How to get the ray equation of a 2d point in world space 【发布时间】:2017-04-04 23:14:15 【问题描述】:我正在寻找二维空间中(x, y)
点的世界空间射线方程。所以给定(x, y)
,我想得到类似的东西:
(x, y, z) = (x0, y0, z0) + t*(a, b, c)
(x0, y0, z0)
和 (a, b, c)
是我知道的向量。
我使用 OpenCV 中的solvePnP 函数将3D 模型转换为2D 坐标,所以我有旋转向量、过渡向量、相机矩阵和畸变系数。有人能解释一下在世界空间中得到这个射线方程所需的数学吗?
【问题讨论】:
请澄清问题。这个 2-D 点的参考系统是什么,它与 3-D 世界空间有什么关系?解释范式会让你从数学家那里得到更多帮助。 二维点基本上是从相机检测到的点的 (x, y) 坐标。我想将此点投影到 3-D 世界中的圆柱状形状上。 所以为了做到这一点,我想得到点的射线方程,并计算交点。那有意义吗?抱歉,我对此有点陌生,所以如果我遗漏了什么,请告诉我 越来越近了;谢谢。我认为 (x0, y0, z0) 是相机位置, (a, b, c) 是从二维点导出的向量。相机的二维系统如何与世界空间对齐?我设想相机将其视图解释为好像它位于单位半径的圆柱体中,该圆柱体在后方某个不可见点“解压缩”并展平以提取伪卡特斯坐标。 例如,中心左侧 10 度和虚拟地平线上方 15 度的某物可能被视为二维空间中的点 (-10, +15)。您想将其转换为 (x0, y0, z0) + t*(a, b, c) ... 其中 a, b, c 是 -10 和 15(及其组合)的三角函数。 【参考方案1】:这就是我要做的。
对于[u, v]
坐标中的二维图像点,不扭曲二维坐标并应用反向透视变换。 OpenCV 已经有一个函数undistortPoints()
可以做到这一点。
您将在标准化的相机帧中获得一个 3D 坐标,即z=1
。
对于线/射线equation,您的起点位于(x0=0, y0=0, z0=0)
,另一点位于(x, y, z=1)
。
关于反向透视变换的注意事项。
对于给定的相机矩阵:
反向透视变换就是:
关于坐标系变换的注意事项:
对于给定的世界(或对象)3D 点:
如果你知道相机的姿势(例如使用solvePnP()
),你就有了变换矩阵:
要计算相机帧中的 3D 坐标:
【讨论】:
以上是关于如何获得世界空间中二维点的射线方程的主要内容,如果未能解决你的问题,请参考以下文章
在 CUDA 中,如何在内核函数中将屏幕空间坐标转换为世界空间坐标