我已经使用 openCV 通过使用特征和匹配它们来计算与同一平面的视图相关的单应性。有没有办法从这个单应性中恢复平面本身或平面法线?(我正在寻找一个方程,其中 H 是输入,正常 n 是输出。)
2 回答
如果您对相机进行了校准,则可以提取平面的法线,但不能提取到平面的距离(即,您获得的变换是按比例绘制的),正如Wikipedia 解释的那样。我不知道有什么实现方法,但是这里有几篇处理这个问题的论文(我警告你这并不简单):Faugeras & Lustman 1988 , Vargas & Malis 2005。
如果平面上的两点之间至少有一个实际距离,则可以恢复变换的实际平移(即到平面的距离)。如果是这种情况,使用 OpenCV 最简单的方法是首先计算单应性,然后获得平面上的四个点及其 2D 坐标和真实的 3D 坐标(如果你有真实的测量,你应该能够获得它们在飞机上),最后使用 PnP。PnP 会给你一个真正的转变。
校正图像被定义为使核线水平并在两个图像中位于同一行。从您的描述中,我了解到您只是想扭曲平面,使其平行于相机传感器或图像平面。这与整改无关——我宁愿称其为鸟瞰图或俯视图。
我看到了混乱的根源。图像的校正通常涉及将每个图像与单应矩阵相乘。在您的情况下,尽管传感器平面 b 中的每个点:Xb = Hab * Xa = (Hb * Ha^-1) * Xa,其中 Ha 是从世界平面到传感器 a 的单应性;Ha 和内在相机矩阵将为您提供平面方向,但我看不到将 Hab 分解为 Ha 和 Hb 的简单方法。
一个经典的(也是困难的)方法是找到一个基本矩阵,从中恢复基本矩阵,将基本矩阵分解为相机旋转和平移(按比例),校正两个图像,执行密集立体,然后拟合平面方程成您重建的 3d 点。
如果您对地平面感兴趣并且您操作嵌入式设备,您甚至不需要两个帧 - 可以从单张照片轻松恢复顶视图,从地面(H)的相机高度和陀螺仪(或方向矢量)读数。下面的一个简单图表解释了 2D 情况下的过程:第一张图显示了如何将 Z(深度)坐标恢复到地平面上的每个点;第二张图显示了俯视图,纵轴为 z,横轴 x = (img.col-w/2)*Z/focal;这里的 img.col 是图像列,w - 图像宽度,focal 是相机焦距。请注意,相机平截头体在鸟瞰图中看起来像梯形。