从相机内在和相机距离获取物理距离
Get physical distance from camera intrinsics and camera distance
我有一个相机内在矩阵 K
,它是一个 3x3
矩阵,即我有 fx
、fy
、cx
、cy
全部以像素距离表示。相机正对着一架飞机。相机与飞机的距离是 d
米。假设两个像素在x
和y
方向上相距dx
和dy
像素,那么物理x
和y
之间的距离是多少?两个像素点。所有这些信息是否足以计算物理距离?
示例:
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 分别.
您需要执行两个步骤:
- 找出物理 3D 投影(物理点到相机传感器 CCD 上)
- 算出图像投影(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的高度和宽度与图像相同,例如:
- 插入Z1=Z2=d:
(u1, v1) -> ((fx * X1/d) + cx, (fy * Y1/d) + cy)
(u2, v2) -> ((fx * X2/d) + cx, (fy * Y2/d) + cy)
- 现在让我们找出两个像素之间的物理距离:(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
- 找到两个 3D 点之间的欧氏距离:
(-0.41, -0.23) -> (-0.30, -0.21) 之间的距离 = 0.11m
所以两点之间的物理距离,假设CCD传感器与图像平面相同,是0.11米。
我有一个相机内在矩阵 K
,它是一个 3x3
矩阵,即我有 fx
、fy
、cx
、cy
全部以像素距离表示。相机正对着一架飞机。相机与飞机的距离是 d
米。假设两个像素在x
和y
方向上相距dx
和dy
像素,那么物理x
和y
之间的距离是多少?两个像素点。所有这些信息是否足以计算物理距离?
示例:
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 分别.
您需要执行两个步骤:
- 找出物理 3D 投影(物理点到相机传感器 CCD 上)
- 算出图像投影(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的高度和宽度与图像相同,例如:
- 插入Z1=Z2=d:
(u1, v1) -> ((fx * X1/d) + cx, (fy * Y1/d) + cy)
(u2, v2) -> ((fx * X2/d) + cx, (fy * Y2/d) + cy)
- 现在让我们找出两个像素之间的物理距离:(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
- 找到两个 3D 点之间的欧氏距离:
(-0.41, -0.23) -> (-0.30, -0.21) 之间的距离 = 0.11m
所以两点之间的物理距离,假设CCD传感器与图像平面相同,是0.11米。