根据 2D 标记找到我的相机的 3D 位置和方向

Find my camera's 3D position and orientation according to a 2D marker

我目前正在构建一个增强现实应用程序并遇到了一个看起来很容易但对我来说很难的问题......问题如下:

我设备的摄像头已校准并检测到二维标记(例如二维码)。我知道焦距、传感器的位置、我的相机和标记中心之间的距离、标记的实际大小和标记的 4 个角的坐标以及它在我从 2D 图像上获得的中心相机。见下图:

在图像上,我们知道 a,b,c,d 的距离和红点的坐标。

我需要知道的是相机根据标记的位置和方向(如图所示,原点是标记的中心)。

有没有简单快捷的方法?我尝试了自己想象的一些方法(使用 Al-Kashi 的公式),但结果错误太多:(。有人能指出让我摆脱困境的方法吗?

您可以在 this webpage 上找到 EPnP 算法的一些示例代码。此代码包含一个头文件和一个源文件,以及一个用于示例的文件,因此将其包含在您的代码中应该不难。

请注意,此代码仅用于 research/evaluation 目的,如 this page 所述。

编辑:

我刚刚意识到这段代码需要 OpenCV 才能工作。顺便说一句,虽然这会给您的项目增加相当大的依赖性,但当前版本的 OpenCV 有一个名为 solvePnP 的内置函数,它可以满足您的需求。

您可以计算图像点与相应世界点之间的单应性。然后根据单应性,您可以计算将点从标记坐标系映射到相机坐标系的旋转和平移。 paper on camera calibration by Zhang.

中描述了数学

这是使用计算机视觉系统工具箱在 MATLAB 中的 example,它可以满足您的大部分需求。它使用 extrinsics 函数,该函数根据匹配的图像和世界点计算 3D 旋转和平移。这些点不必来自棋盘。