OpenCV 从机器人相机中移除透视

OpenCV Remove Perspective from Robot Camera

我有一架带有向下摄像头和红外传感器的飞行无人机,我正在为无人机开发 SLAM。无人机仅飞过平面。要使用相机馈送和 opencv 构建无人机环境的地图,您需要从捕获的图像中移除相机的视角(由高度、滚动、俯仰和偏航引入),以便图像中的距离准确。

为此我查看了 openCV 的方法,但它们似乎都需要事先校准相机才能使用脚本确定相机的方向。

如果您知道无人机(和相机)的方向,是否有任何方法可以可靠地变换图像中的点,使间距保持不变?我可以从 IMU 访问有关无人机方向的数据。

打开CV的perspectivetransform()函数似乎合适, 我认为这个问题可以回答你的很多问题。可以在 3x3 矩阵中编码旋转和倾斜补偿以正确变换图像。

不幸的是,无人机位置和方向的不准确会导致您建议的方法出错。

相机校准是一个烦人的过程,但如果您想要一个黑盒解决方案,这可能是您最好的选择。

但是如果你想尝试一下,请看我下面的评论。


您可以应用 opencv 的 warp perspective 函数来尝试去除相机的透视,但请注意,它有几个很强的假设,可能不是最佳解决方案:

  • 你有完美关于无人机位置的信息
  • 你知道相机相对于无人机机身的位置
  • 你正飞过一个完美的平面

本例中构造了3个变换矩阵来表示:地面到无人机的变换,无人机到摄像机的变换,以及地面到摄像机的变换,乘以前两个矩阵。

T_{地面到相机} = T_{地面到无人机}*T_{无人机到相机}

此矩阵的逆矩阵可用作 warpPerspective 的输入,以将像素转换为地面帧。 This a blog post 很好地解释了函数的输入和输出参数。代码以 c++ 提供,但在 python 中实现起来应该相对简单。