【问题标题】:Find my camera's 3D position and orientation according to a 2D marker根据 2D 标记查找我的相机的 3D 位置和方向
【发布时间】:2015-01-14 15:24:52
【问题描述】:

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

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

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

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

有没有一种简单快捷的方法可以做到这一点?我尝试了一些自己想象的方法(使用 Al-Kashi 的公式),但这以太多的错误结束:(。有人能指出一种让我摆脱这种情况的方法吗?

【问题讨论】:

  • 这通常通过所谓的“PnP”算法解决(参见例如this article)。您使用什么编程语言/库?
  • 我知道这个解决方案,但这对我来说太复杂了,我的知识还不足以完全理解它。我正在使用 C 并使用 OpenGL 进行绘图(仅此而已)。我有一个功能齐全的 AR 应用程序,我正在改进它以使用标记(在那之前我们使用了一个名为 Vuforia 的库)。剩下的唯一一件事就是获得那个该死的相机位置:(有没有更简单的方法?
  • 这不是一个简单的问题,我认为没有更简单的方法......但也许你可以找到一些代码或轻量级库来使用。
  • 我会找那个(有点已经做过了,但通常这些功能没有那么多评论,所以它们仍然很难理解,并使用一些我不明白它是如何工作的东西我有点不喜欢)。我可能会找到一个可以帮助我更好地理解问题的方法!

标签: matrix 3d computer-vision augmented-reality matlab-cvst


【解决方案1】:

您可以在this webpage 上找到一些 EPnP 算法的示例代码。这段代码包含一个头文件和一个源文件,加上一个用于示例的文件,所以这应该不会太难包含在您的代码中。

请注意,此代码仅用于研究/评估目的,如 this page 所述。

编辑

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

【讨论】:

  • 我会寻找他们两个并及时更新,感谢您的帮助!
  • 所以我正在查看 OpenCV 中的 solvePnP 函数,但函数中调用的方法均不可访问(PnP()、P3Psolver()、...),也未在标头中引用(所以没有外部库)。这怎么可能? O_o
  • 这些是库内部的。您应该直接使用solvePnP 函数。 There 是有关此功能的一些文档。仅供参考,PnP 和 P3PSolver 是 epnp 和 p3p 类型的函子实例(参见“solvepnp.cpp”的第 64 和 76 行),它们在 p3p.h/cpp 和 epnp.h/cpp 中定义。
  • 好的,多亏了你和 OpenCV,我正在探索如何解决我的问题,但我被这条线卡住了:github.com/Itseez/opencv/blob/… 它的效果是什么?我虽然它调用了构造函数,但我也不明白:github.com/Itseez/opencv/blob/… 有什么想法吗?
  • 同样,这是一个函子:svd 是类cv::SVD 的一个实例,它重载了operator()。因此,执行svd(...) 就像一个函数调用。有关函子的更多详细信息,请参阅this post
【解决方案2】:

您可以计算图像点和对应的世界点之间的单应性。然后从单应性中,您可以计算将点从标记坐标系映射到相机坐标系的旋转和平移。数学在paper on camera calibration by Zhang 中有描述。

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

【讨论】:

  • 您好,感谢您指出此方法。既然我的分数比棋盘少得多,你认为我还能用这种方法吗?如果是,是否可以找到“外在”函数的来源?
  • @user2342594,您需要至少 4 个非共线点来计算单应性,这是一个二维投影变换。从已知的内在矩阵和单应性计算 R 和 t 的数学在论文的第 6 页上给出。编码相当简单。如果您有带有计算机视觉系统工具箱的最新版本的 MATLAB,您可以简单地查看 extrinsics() 的源代码。
猜你喜欢
  • 2011-12-17
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多