你好,堆栈溢出社区,
因此,我正在进行一个项目,需要计算地面采样距离(GSD),以获取米/像素尺度。
低谷视图的GSD (直接仰视地面的摄像机)公式如下:
GSD =(飞行高度x传感器高度)/(焦距x图像高度和/或宽度)。
我读了多篇文章,比如:https://www.mdpi.com/2072-4292/13/4/573
如果相机在一个轴上有一个倾斜角,则需要进行如下校正:

其中θ是倾斜角和phi,正如他们在文章中所说的:
φ描述了像素在图像中的角位置:它与摄像机光轴的对应值为零,而对于其他像素则可能有正负值。
他们文章中的数字是:

所以我希望你和我一样,现在我有两个问题:
首先,如何精确计算给定像素相对光轴的角度位置(如何计算phi)?
2-在我的情况下,相机是在两个轴上旋转的,不只是一个像他们的例子一样,就像相机看起来不完全像道路,而是像朝向一边,更像这个:

那么,这个公式还会有更多的变化吗?我不知道如何在几何上得到正确的公式。
发布于 2021-08-12 14:44:07
正如您所链接的文章中所解释的,您可以通过了解摄像机的内在参数来计算像素角。首先,让我们做一些理论:本质矩阵是用来计算一个世界点在相机的图像平面上的投影。OpenCV文档很好地解释了这一点,其表达方式如下:
( 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角度,例如,用这个答案中详细的公式,用相机的y轴作为标准。在伪码中:
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)你可以用三个角度来表示相机的旋转:倾斜角度、平底角和滚动角。如果您想要可视化它们对应的内容,请看一看我快速搜索的这幅图像。
倾斜角是在您的文章中名为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)然后通过计算相邻像素世界点之间的差来计算比例尺。
https://stackoverflow.com/questions/68710337
复制相似问题