从相机中查找对象的真实世界坐标



我正试图通过使用OpenCV找到从单个相机检测到的对象的坐标。摄像机将安装在无人机上,可以直接看到地面。

我有:

-无人机上GPS传感器的摄像头坐标。

-相机的高度。

-相机的内在参数。

三维重建公式

根据这个公式,我需要找到外在的参数来找到真实世界的坐标。我想使用OpenCV的solvePnP方法来查找外部参数。正如我所知,外在参数是关于相机的位置,但我的相机将在无人机上,位置会改变。外在参数和内在参数一样是常数吗?有其他方法可以计算吗?

您要做的是所谓的单彩票。为了从单个图像中估计XY真实世界坐标,您需要了解以下内容:

  • X0,Y0,Z0您的相机的真实世界坐标
  • 相机的外部方向(俯仰、滚转和偏航(
  • 相机的内部方向(焦距、x和y方向上的主点、径向和切向失真参数(

因此,相机的XYZ和外部方向通常存储在图像的exif数据中。然而,这取决于无人机。有一些很好的python模块可以在图像中提取这些信息。我使用exifread。

内部方向可能更难获得,因为您需要在相机处进行校准,这可以通过OpenCV进行。你应该可以使用尤努斯在他的评论中链接的教程。然而,如果你使用pix4D的摄影测量软件,有一个快捷方式,你可以使用他们的相机数据库,该数据库存储了许多不同无人机及其内部方向的信息。它们并不完美,但对于许多用例来说应该是可以的,请参阅链接。

当您拥有所有这些参数时,您需要执行以下操作:

  1. 取消图像失真
  2. 创建你想知道的点的图像坐标的真实世界坐标,使用不失真的图像
  3. 创建沿X、Y、Z轴旋转的旋转矩阵,并对其进行矩阵乘法运算(RXRYRZ(
  4. 应用共线方程

关于1。你可以使用cv2.undeficient,Yunus提供的链接也有一个教程。

关于3,我相信OpenCV可能会为你提供这个矩阵,但为你自己创建这个函数非常容易,有助于理解正在发生的事情。请参阅维基百科:链接它可能会有点混淆将俯仰角、滚转角和偏航角中的哪一个用于哪些矩阵。这完全取决于你的相机外部坐标系。典型的惯例是俯仰在x左右,滚转在y左右,偏航在z左右。

关于4。共线方程取决于您创建的旋转矩阵,请参见:链接术语Z-Z0只是指您试图查找坐标的对象上方的负相对高度。因此,如果你没有无人机的相对高度,你需要知道物体的高度,并从物体的高度减去无人机的高度(你会得到一个负数(。

我希望这对你有所帮助,并为你指明了正确的方向。

最新更新