航空相机地面足迹计算

时间:2014-11-11 16:11:03

标签: java camera geometry linear-algebra algebra

我有一个非常简单的数学问题,但我似乎无法弄明白。我需要计算从无人机安装的摄像机观察时可见的地面部分。我相信我已经解决了直视,但是相机在万向节上,并且在所有轴上都会有全方位的运动。

问题的输入将是海拔高度(m),相机焦距(mm),相机传感器x长度(mm),相机传感器y长度(mm)以及每个平面中的倾斜角度。

以下是相机垂直向下时的情况(注意:这给了我地面覆盖的每一边的长度。理想情况下,我想要每个点,在这种情况下,是四个角矩形。)

float cameraX; // camera sensor x size (mm)
float cameraY; // camera sensor y size (mm)
float cameraF; // camera focal length (mm); common lengths: 150mm (wide angle), 300mm (normal)
float altitude; // high above ground (m)
float ax;
float ay;

void calculateGroundCoverage() {
    ax = (altitude / cameraF) * cameraX;
    ay = (altitude / cameraF) * cameraY;
}

void printGroundCoverage() {
    System.out.print("x: " + cameraX + ", y: " + cameraY + ", f: " + cameraF + ", alt: " + altitude + "\t");
    System.out.println("footprint: " + ax + "m x " + ay + "m");
}

1 个答案:

答案 0 :(得分:0)

这是为什么高度?

  • 对于小型(最长0.5公里),您可以简化地面平面
  • 但仅当相机视图接近垂直于表面的方向时(视线中没有水平线!!!)
  • +/-考虑表面扭曲的一些安全边界
  • 对于更高的海拔,您需要考虑表面是椭圆体

我的方法与你的方法有点不同(因为我使用DTM映射到地球的椭圆体上)

  1. 创建表示相机传感器的变换矩阵

    • 芯片平面中点是原点
    • Z轴是观察方向(至少对我而言)
    • X轴是摄像机右侧(*平面右侧)方向
    • Y轴是摄像机向上(*向前)方向
      • 方向是底视图(相机未旋转)
    • 查看此处:transform matrix anatomy了解如何操作
  2. 从相机覆盖整个屏幕投射一组光线

    • 例如,在屏幕上均匀地制作网格8 x 8光线
    • 从摄像机焦点到观察方向的方向
    • 如果中间有光线,它将与摄像机的Z轴方向相同
    • 所有其余部分将轮流覆盖整个视野
  3. 计算与曲面的交点

    • 对于平面,它只是平面和半轴之间的交叉点
    • 对于椭圆体,它有点复杂,请参阅:ray and ellipsoid intersection
    • 这将为您提供相机可见的一组表面点
    • 如果您需要在相机/平面空间中将其转换为它
    • GCS到LCS由camera_LCS_point=Inverse(camera_matrix)*surface_GCS_point;
    • 完成
    • 对于平面局部点,您可以创建表示平面的单独变换矩阵...
  4. 现在形成相机/平面LCS点,您可以简单地提取最小和最大x,y坐标

    • 这些是相机视图所涵盖区域的边缘
    • 提高精度,你可以找到光线边缘
    • 所以,如果你的2个相邻光线仅在表面撞击一次
    • 然后在他们之间投射中间光线
    • 这可以递归几次递增,以提高精度而不会有太多的复杂负担
    • 您也可以根据海拔高度和观察方向将一些安全区域添加到计算区域