修正 GSD 计算的非天底视图(无人机)

Correct non-nadir view for GSD calculation (UAV)

你好 Whosebug 社区,

所以我正在做一个需要计算地面采样距离 (GSD) 以检索 meter/pixel 比例的项目。

天底视图(相机直视地面)的GSD公式如下:

GSD =(飞行高度 x 传感器高度)/(焦距 x 图像高度 and/or 宽度)。

并且我阅读了多篇文章,例如:https://www.mdpi.com/2072-4292/13/4/573

如果相机在一个轴上有倾斜角度,则需要进行如下校正:

其中 θ 是他们在文章中所说的倾斜角和 phi :

φ describes the angular position of the pixel in the image: it is zero in correspondence of the optical axis of the camera, while it can have positive or negative values for the other pixels

他们文章上的图是这样的:

所以我希望你和我在同一页上,现在我有两个问题:

1- 首先我如何精确计算给定像素相对于光轴的 angular 位置(如何计算 phi)

2- 在我的案例中,摄像头在两个轴上旋转,而不是像他们的示例那样只在一个轴上旋转,就像摄像头看起来并不完全朝向道路,而是朝向其中一侧,更像这个:

那么公式会有更多变化吗?我不确定如何从几何上得到正确的公式

  1. 一个像素的angular位置

如您链接的文章中所述,您可以通过了解相机内在参数来计算像素角度。首先让我们做一些理论:内在矩阵用于计算世界点在相机图像平面中的投影。 OpenCV documentation 解释的很好,是这样表达的:

    ( x )   ( fx 0  cx )   ( X )
s * ( y ) = ( 0  fy cy ) * ( Y )
    ( 1 )   ( 0  0  1  )   ( Z )

其中 fx,fy 是您的焦点,cx,cy 是光学中心,x,y 是图像中像素的位置,X,Y,Z 是您的世界点米或毫米或其他。

现在通过反转矩阵,您可以从像素位置计算世界向量。世界矢量而不是世界点,因为相机和真实物体之间的距离 d 未知。

    ( X )          ( x )
d * ( Y ) = A^-1 * ( y )
    ( Z )          ( 1 )

然后你可以简单地计算光轴和这个世界矢量之间的角度来得到你的 phi 角度,例如使用 this answer 中详述的公式使用相机正常。在伪代码中:

intrinsic_inv = invert(intrinsic)
world_vector = multiply(intrinsic_inv, (x, y, 1))
optical axis = (0, 0, 1)

normal = (0, 1, 0)
dot = dot_product(world_vector, optical_axis)
det = dot_product(normal, cross_product(world_vector, optical_axis))
phi = atan2(det, dot)
  1. 摄像机角度

您可以用三个角度来表示相机的旋转:俯仰角、平移角和横滚角。看看 this image 如果你想可视化它们对应的内容,我很快就用谷歌搜索了。

倾斜角就是你文章里那个叫theta的,你已经知道了。摇摄角度对 GSD 没有影响,至少在我们假设地面完全平坦的情况下是这样。如果平移角度是您所指的第二个旋转轴,那么您将无事可做。

但是,如果您的滚动角不为零,这将变得棘手。如果你是那种情况,我会建议改变范式以避免处理角度。您可以改为使用仿射变换(旋转矩阵和平移向量)来表示相机位置。这将使您能够将问题转化为一般的解析几何问题,然后通过世界向量与地平面的交集来估计深度和尺度。它会改变以前的伪代码来给出类似的东西:

intrinsic_inv = invert(intrinsic)
world_vector = multiply(intrinsic_inv, (x, y, 1))
world_vector = multiply(rotation, world_vector) + translation
world_point = intersection(world_vector, ground_plane)

然后可以通过相邻像素世界点之间的差异来计算比例。