我目前正在构建一个增强现实应用程序,并坚持一个看起来很容易但对我来说很难的问题......问题如下:
我的设备的相机已校准并检测到2D标记(例如QRCode)。我知道焦距,传感器的位置,我的相机与标记中心之间的距离,标记的实际大小以及标记的4个角的坐标以及它从我从中得到的2D图像的中心相机。见下图:
在图像上,我们知道a,b,c,d距离和红点的坐标。
我需要知道的是相机根据标记的位置和方向(如图所示,原点是标记的中心)。
有一种简单快捷的方法吗?我尝试了自己想象的一些方法(使用Al-Kashi的公式),但最终出现了太多错误:(。有人能指出一种方法让我离开吗?
答案 0 :(得分:2)
您可以在this webpage上找到EPnP算法的一些示例代码。此代码包含一个头文件和一个源文件,以及一个用于使用示例的文件,因此这不应该太难以包含在您的代码中。
请注意,此代码仅用于研究/评估目的,如this page中所述。
修改强>:
我刚才意识到这段代码需要OpenCV才能运行。顺便说一下,虽然这会给你的项目增加一个非常大的依赖,但是当前版本的OpenCV有一个名为solvePnP
的内置函数,可以满足您的需求。
答案 1 :(得分:2)
您可以计算图像点与相应世界点之间的单应性。然后从单应性中,您可以计算旋转和平移,将一个点从标记的坐标系映射到相机的坐标系。数学在paper on camera calibration by Zhang中描述。
这里是使用计算机视觉系统工具箱在MATLAB中的example,它可以满足您的大部分需求。它使用extrinsics
函数,该函数计算3D旋转和匹配图像和世界点的平移。这些要点不一定来自棋盘。