从相机内在和相机距离获取物理距离

Get physical distance from camera intrinsics and camera distance

我有一个相机内在矩阵 K,它是一个 3x3 矩阵,即我有 fxfycxcy 全部以像素距离表示。相机正对着一架飞机。相机与飞机的距离是 d 米。假设两个像素在xy方向上相距dxdy像素,那么物理xy之间的距离是多少?两个像素点。所有这些信息是否足以计算物理距离?

示例:

height = 720
width = 1280
fx = 1.06935339e+03
fy = 1.07107059e+03
cx = 6.29035115e+02
cy = 3.54614962e+02

d = 0.7

dx = 168
dy = 39

假设这是一个针孔相机模型,您还需要相机图像传感器 (CCD) 的宽度和高度 - 我们称这些为 widthCCD heightCCD 分别.

您需要执行两个步骤:

  1. 找出物理 3D 投影(物理点到相机传感器 CCD 上)
  2. 算出图像投影(CCD成图像像素space)

假设图像上有两个像素 (u1, v1) 和 (u2, v2)。这两个像素映射到 CCD 传感器 (uc1, vc1) 和 (uc2, vc2) 上的以下像素。最后,这两个 CCD 像素映射到以下物理 3D 坐标 (X1, Y1, Z1) 和 (X2, Y2, Z2),如下所示:

注:Z1 = Z2 = d = 0.7(根据您提供的信息)


物理投影(3D 到 CCD):

(uc1, vc1) -> (fx * X1/Z1, fy * Y1/Z1)
(uc2, vc2) -> (fx * X2/Z2, fy * Y2/Z2)

图像投影(CCD转图像):

(u1, v1) -> (uc1 * width/widthCCD + cx, vc1 * height/heightCCD + cy)
(u2, v2) -> (uc2 * width/widthCCD + cx, vc2 * height/heightCCD + cy)

通过应用替换,您可以获得:

(u1, v1) -> ((fx * X1/Z1) * width/widthCCD + cx, (fy * Y1/Z1) * height/heightCCD + cy)
(u2, v2) -> ((fx * X2/Z2) * width/widthCCD + cx, (fy * Y2/Z2) * height/heightCCD + cy)

由于我不知道CCD传感器的高度和宽度,所以我假设CCD的高度和宽度与图像相同,例如:

  1. 插入Z1=Z2=d:
(u1, v1) -> ((fx * X1/d) + cx, (fy * Y1/d) + cy)
(u2, v2) -> ((fx * X2/d) + cx, (fy * Y2/d) + cy)
  1. 现在让我们找出两个像素之间的物理距离:(0, 0) 和 (168, 39)
(u, v) -> ((1.06935339e+03 * X/0.7) + 6.29035115e+02, (1.07107059e+03 * Y/0.7) + 3.54614962e+02)

对于 (0, 0),X = -0.41,Y = -0.23 对于 (168, 39),X = -0.30,Y = -0.21

  1. 找到两个 3D 点之间的欧氏距离:

(-0.41, -0.23) -> (-0.30, -0.21) 之间的距离 = 0.11m

所以两点之间的物理距离,假设CCD传感器与图像平面相同,是0.11米。