0

我希望在 2D 平面上投影使用我知道所有参数(焦距、传感器尺寸、X、Y、Z、旋转(omega、phi、kappa)的相机拍摄的图像。我知道我需要构建一个在能够进行平面单应性之前的相机矩阵,但是如何?

在这个答案之后,我已经成功地在每个平面上使用 4 个已知点对生成了一个矩阵,但这不是我想要的方式。我看过这个视频,它给了我几乎所有的答案,但是没有详细描述名为“外部参数”的矩阵。旋转矩阵R和相机位置的矩阵T应该如何构造?

有了最终的相机矩阵,假设我将能够获取每个参数并将它们提供给PIL.Image.transform. 我也愿意使用 python OpenCV 库。

以下是一些示例数据:

此处为原始图像(4288 x 2848 像素)

#Camera position
X:   72003 m
Y: 1070100 m
Z:    1243 m

#Rotation of camera
Omega:    0°
Phi:     27°
Kappa:  -38°

Focal length: 26 mm
Pixel size on sensor: 0.00551 mm
4

1 回答 1

1

相机矩阵 P 是一个 4x3 矩阵,形式为 P = K[R t]:

  • K 是一个 3x3 矩阵,包含内在参数(主点和焦距,以像素为单位)
  • [R t] 是一个 3x4 矩阵,它由表示从相机帧到世界帧的旋转的 3x3 矩阵 R 和表示世界原点在相机帧中的位置的 3 向量 t 连接而成。

这意味着您拥有的参数(似乎是世界框架中相机的位置)必须反转。[R t] 的倒数是 [R' t'],其中 R' = inverse(R) = transpose(R) 并且 t' = -inverse(R)t。

您首先必须知道如何从您拥有的三个角度计算 3x3 相机旋转矩阵,并且从三个角度有许多可能的旋转矩阵表示。最常见的是偏航/俯仰/滚动,以及具有所有可能旋转顺序的欧拉角。

3x3 内在矩阵 K 为 [[f 0 cx][0 f cy][0 0 1]],其中 f = 26/0.00551 = 4719 并且 (cx,cy) 是主点,您可以将其作为中心图像 (4288/2,2848/2)。

然后计算从世界高度 Z0 的平面到图像的单应性(3x3 矩阵),将 P 乘以 (X,Y,Z0,1),得到 Xv1 + Yv2 + v3 形式的表达式,其中v1、v2 和 v3 是 3 向量。矩阵 H=[v1 v2 v3] 是您正在寻找的单应性。PIL.Image.transform 的 8 个系数应该是该矩阵的前 8 个系数,除以第 9 个系数。

于 2019-08-16T16:44:17.853 回答