使用单个校准相机从 2D 图像中获取世界坐标

Posted

技术标签:

【中文标题】使用单个校准相机从 2D 图像中获取世界坐标【英文标题】:Getting world coordinates from 2D image using single calibrated camera 【发布时间】:2014-11-17 13:42:38 【问题描述】:

我正在尝试从没有棋盘的单个图像校准我的相机。为此,我使用了以下应用程序(http://w3.impa.br/~zang/qtcalib/index.html),它使用 Tsai 的方法来校准相机。

应用程序返回内在、旋转和平移矩阵。

之后,我想从 2d 图像计算世界坐标。因此,为我的程序提供 2d 坐标 (x,y) 和矩阵(内在、旋转、平移)我想获得 3D 坐标 (X,Y,Z)。

我遵循了一些相关线程 (Get 3D coordinates from 2D image pixel if extrinsic and intrinsic parameters are known) 的指令,但结果并不如我所料。另外我不知道我的原点在哪里 (0,0,0)。

我做错了什么?

【问题讨论】:

嗨,我有同样的问题,但我想在校准后基于这 3 个矩阵计算二维坐标,你能告诉我该怎么做吗? 它可以帮助你:***.com/questions/12007775/… 【参考方案1】:

射影变换是

x = K * T * X

在哪里

K : 内在 T : 外在的(你的旋转和平移)。将 X 转换为相机坐标系。 x : 图像中的像素坐标 X : 3D 坐标

将 2D 像素投影到 3D 相当于 3D 空间中的一条线,因此可能存在无限数量的 3D 点。要获得一个普通的 3D 坐标,您必须选择一个深度值。

您可以决定生成的 3D 坐标的原点:

相机坐标系,[0;0;0]在相机中心: X' =​​ inv(K) * x

您的棋盘或 Tsai-grid 坐标系,[0;0;0] 通常位于其中一个角: X' =​​ inv(T) * inv(K) * x

但是,如前所述,X' 更像是一条线。您需要对其进行缩放以获得正确的 3D 坐标。

有时很难知道仿射变换在做什么。如果它不符合您的要求,一种快速的工程方法可能是用它的逆来尝试它:)

如果这对您没有帮助,您可以传递您的矩阵。

【讨论】:

以上是关于使用单个校准相机从 2D 图像中获取世界坐标的主要内容,如果未能解决你的问题,请参考以下文章

unity 怎样正确获取2d世界坐标

OpenCV(C ++) - 根据已知的3D对象和摄像机位置计算图像的2D坐标

来自 cv::solvePnP 的世界坐标中的相机位置

电影坐标到世界坐标

使用 MATLAB Camera Calibrator 进行单相机校准的问题

计算 3D 世界点