M:
- intrinsic matrix
[ f x s c x 0 f y c y 0 0 1 ] \begin{bmatrix}f_x & s & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1\end{bmatrix} fx00sfy0cxcy1
(
c
x
,
c
y
)
(c_x, c_y)
(cx,cy): camera center in pixels
(
f
x
,
f
y
)
(f_x, f_y)
(fx,fy): focal length in pixels
X
Z
=
u
f
x
\frac{X}{Z} = \frac{u}{f_x}
ZX=fxu
其中
f
x
=
f
p
x
f_x = \frac{f}{p_x}
fx=pxf,
f
f
f 是focal length in world unites (millimeters),
p
x
p_x
px像素宽度, 通过胶片宽度除以像素X方向的个数得到.
下面来看skew
s = f x t a n α s = f_x tan \alpha s=fxtanα
假设每
p
y
p_y
py在
p
x
p_x
px上面的偏移是
b
b
b
那么
t
a
n
α
=
b
p
x
p
y
tan \alpha = \frac{bp_x}{p_y}
tanα=pybpx
那么 [ f x s c x 0 f y c y 0 0 1 ] ∗ [ X Z Y Z 1 ] \begin{bmatrix}f_x & s & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1\end{bmatrix} *\begin{bmatrix} \frac{X}{Z} \\ \frac{Y}{Z} \\ 1 \end{bmatrix} fx00sfy0cxcy1 ∗ ZXZY1
第一行可得 f x ∗ X Z + s ∗ Y Z + c x = f x ∗ X Z + f x t a n α ∗ Y Z + c x f_x * \frac{X}{Z} +s * \frac{Y}{Z} + c_x = f_x * \frac{X}{Z} + f_x tan \alpha * \frac{Y}{Z} + c_x fx∗ZX+s∗ZY+cx=fx∗ZX+fxtanα∗ZY+cx
这里 f x t a n α ∗ Y Z f_x tan \alpha * \frac{Y}{Z} fxtanα∗ZY有两种理解方式, 第一种是通过 t a n α ∗ Y tan \alpha *Y tanα∗Y将在世界坐标系中将 Y Y Y转成 X X X方向的偏移 b X bX bX, 然后将这个偏移通过乘以 f x z \frac{f_x}{z} zfx转成x方向的像素偏移
第二种是 f x t a n α ∗ Y Z = f p x ∗ b p x p y ∗ Y Z = b f y ∗ Y Z f_x tan \alpha * \frac{Y}{Z} = \frac{f}{p_x}*\frac{bp_x}{p_y} * \frac{Y}{Z} = bf_y*\frac{Y}{Z} fxtanα∗ZY=pxf∗pybpx∗ZY=bfy∗ZY 先算在y方向有多少像素, 再乘以 b b b得到偏移
第二行注意如果有skew, 那么 f y f_y fy得用 f y c o s α \frac{f_y}{cos\alpha} cosαfy代替, 因为y轴变斜了, 相应也变长了
https://towardsdatascience.com/camera-calibration-fda5beb373c3
https://towardsdatascience.com/what-are-intrinsic-and-extrinsic-camera-parameters-in-computer-vision-7071b72fb8ec