鱼眼摄像头标定原理总结
之前主要是弄的普通相机的标定,前段时间让看下鱼眼相机的标定,遂在网上查阅了些资料,理解理解原理。
0 引述
相机镜头大致上可以分为变焦镜头和定焦镜头两种。变焦镜头可以在一定范围内变换焦距,随之得到不同大小的视野;而定焦镜头只有一个固定的焦距,视野大小是固定的。鱼眼镜头是定焦镜头中的一种视野范围很大的镜头,视角通常大于180°。 在获取更大视野范围的同时,鱼眼镜头成像的畸变也更大。
大多数鱼眼标定文章提到2006年的Juho Kannala与Sami S. Brandt《A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses》和2004年的《A Generic Camera Calibration Method for Fish-Eye Lenses》这两篇文章。这两篇文章后续有空再研究下。
0.1 《A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses》总述
- 论文主要介绍了一种可以建模传统相机和鱼眼相机的通用的内参模型(radially symmetric projection model):Kannala Brandt 模型 / opencv中的fisheye / kalibr中的 pinhole + equidistant 都是指该模型。
- pinhole+radtan无法建模鱼眼相机
对于大多数具有窄角甚至广角镜头的传统相机,针孔相机模型伴随着镜头畸变是一个比较不错的近似。但是针孔模型不太适用于鱼眼镜头。鱼眼镜头一般被设计用来覆盖相机前方的整个半球形视场,视角非常大,约180°。然而,不可能通过透视投影在有限的图像平面上投射半球形视场。因而,鱼眼镜头服从某些其他投影模型。这就是为什么鱼眼镜头本身固有的畸变不应该仅被认为是与针孔模型的偏差。 - 内参模型
很多作者对鱼眼镜头的适合的可能模型进行了研究。许多方法的思想是将原始鱼眼镜头成像为遵循针孔模型,畸变参数是通过变换后强制按直线来估计的,但问题是这些方法并不能完全校准。最近,鱼眼镜头相机的第一种自动校准方法也出现了,Claus 和Fitzgibbon[1]提出了一种畸变模型,它同样允许相机运动和镜头几何的同时线性估计,而Thirthala和Pollefeys[2]使用径向一维摄像机的多视图几何来估计非参数相机模型。此外,Barreto和Daniilidis最近的工作引入了径向基本矩阵来纠正广角镜头的失真[3]。然而,这些方法的重点更多的是在于自动校准技术(自动校准技术后续可能也要研究,此处记录),而不是真实镜头的精确建模。
3.1 Radially Symmetric Model(径向对称模型)
针孔相机的透视投影:
r
=
f
t
a
n
θ
r=ftan\theta
r=ftanθ,其中
θ
\theta
θ是主轴与入射光线的夹角,
r
r
r是图像点与主点间的距离,
f
f
f是焦距。
鱼眼镜头通常设计为遵循以下投影之一:
序号 | 图例 | 模型描述 | 镜头模型 | 特征 |
---|---|---|---|---|
1 | – | r = f t a n ( θ ) r=ftan(\theta) r=ftan(θ) | 透视投影(perspective projection) | 针孔相机模型 |
2 | – | r = 2 f t a n ( θ / 2 ) r=2ftan(\theta/2) r=2ftan(θ/2) | 体视(立体)投影(stereographic projection) | 任何直线相交的角度,在变化后保持不变 |
3 | – | r = f t a n ( θ / 2 ) = f θ r=ftan(\theta/2)=f\theta r=ftan(θ/2)=fθ | 等距投影(equidistance projection) | 物体成像面上距离画面中心的距离与入射角成正比 |
4 | – | r = 2 f s i n ( θ / 2 ) r=2fsin(\theta/2) r=2fsin(θ/2) | 等角(积)投影(equisolid angle projection) | 在变换前后,物体所占的立体角大小不变 |
5 | – | r = f s i n ( θ ) r=fsin(\theta) r=fsin(θ) | 正交投影(orthogonal projection) | 投影畸变最大,而且最大视场角不能大于180° |
- r(θ)是一种投影模型,只不过建模的时候重点考虑fisheye的特性;
- θ表示入射光线和Z轴的夹角,θ = acos(Zc / norm),norm = sqrt(Xc^2 + Yc^2 + Xc^2)
- r(θ)表示映射到图像坐标系上的点到中心点的距离,r = sqrt(x^2 + y^2)
φ表示相机坐标系下的入射光线和X轴的夹角,φ = atan(Yc / Xc)
- 根据(7)式,这个模型有个假设:就是相机坐标系下的φ和图像坐标系下的φ是相等的
- (2)-(5)已经建模了焦距f,但在(6)式时又将其去掉了,还是将其建模到了内参fx中?
- 根据鱼眼相机的特性,是用(2)-(5)来建模的,但作者为了通用性,统一用(6)式来建模,多项式近似,一般都是用前5项。
不同投影行为如图(a)所示,针孔相机与鱼眼相机之间的差异如图(b)所示。
然而,真实镜头并不完全遵循设计的投影模型。从自动校准的角度来看,如果我们只有一个适合不同类型镜头的型号,那么它也会很有用。因此,我们考虑一般形式的估计。
r
(
θ
)
=
k
1
θ
+
k
2
θ
3
+
k
3
θ
5
+
k
4
θ
7
+
k
5
θ
9
+
.
.
.
r(\theta)=k_{1}\theta+k_{2}\theta^3+k_{3}\theta^5+k_{4}\theta^7+k_{5}\theta^9+...
r(θ)=k1θ+k2θ3+k3θ5+k4θ7+k5θ9+...
不失一般性,甚至权重都被取消了。这是因为我们可以将r作为奇函数扩展到负数一侧,而奇数幂跨越连续奇函数集。对于计算,我们需要确定式中各项参数
k
i
k_{i}
ki。
3.2 Full Model
由于镜头的制造工艺等,并不是所有的鱼眼相机都是Radially Symmetric,因此作者使用两种畸变形式进行表述。
径向畸变:
△
r
(
θ
,
φ
)
=
(
l
1
θ
+
l
2
θ
3
+
l
3
θ
5
)
(
i
1
c
o
s
φ
+
i
2
s
i
n
φ
+
i
3
c
o
s
2
Φ
+
i
4
s
i
n
2
φ
)
\bigtriangleup_{r}(\theta,\varphi)=(l_{1}\theta+l_{2}\theta^3+l_{3}\theta^5)(i_{1}cos\varphi+i_{2}sin\varphi+i_{3}cos2\varPhi+i_{4}sin2\varphi)
△r(θ,φ)=(l1θ+l2θ3+l3θ5)(i1cosφ+i2sinφ+i3cos2Φ+i4sin2φ)
切向畸变:
△
r
(
θ
,
φ
)
=
(
m
1
θ
+
m
2
θ
3
+
m
3
θ
5
)
(
j
1
c
o
s
φ
+
j
2
s
i
n
φ
+
j
3
c
o
s
2
Φ
+
j
4
s
i
n
2
φ
)
\bigtriangleup_{r}(\theta,\varphi)=(m_{1}\theta+m_{2}\theta^3+m_{3}\theta^5)(j_{1}cos\varphi+j_{2}sin\varphi+j_{3}cos2\varPhi+j_{4}sin2\varphi)
△r(θ,φ)=(m1θ+m2θ3+m3θ5)(j1cosφ+j2sinφ+j3cos2Φ+j4sin2φ)
但在各大开源工具对该模型的复现中,一般只用p9模型,并不用p23,可能是因为如今的镜头工艺比较成熟了。
3.3 验证
Forward Camera model : projection是指将相机坐标系的一个3D point映射到2D像素坐标系中
Backward Model : 一个内参模型的精确度还要看它的back-projection,即从2D 映射到 3D
论文中是使用圆形靶标进行实验验证的,认为圆形标靶,精度更高。具体的算法还需去paper里具体看。
0.1 针孔相机模型简述
我们平常接触的大多数镜头都可以近似看做针孔相机模型,该模型下,光线沿直线传播,像与物之间是相似的,或者更严格地用数学语言来说,像与物之间是经过了透视变换(Perspective Transform)。在透视变换下,直线经过变换仍是直线,曲线经过变换仍是曲线,两直线交点经过变换仍是两直线相交的点等。正因为投影变换保持了很多几何性质不变,所以我们看照片是能够与原场景联系起来的,照片与原场景之间存在某些相似的特性。
0.1.1 参考文章单目相机标定原理
0.2 鱼眼相机与普通镜头区别
从某种意义上来说,相机镜头所起的作用,就是做了一个数学变换,将物空间变换为像空间,成像平面就是在像空间内切了一刀,截取了一个平面,成为拍下的照片。
但基于针孔相机模型的镜头存在一个缺陷——光线始终沿直线传播使得镜头难以捕捉位于边缘的物体。如下图所示,对于同样长度的红色箭头,越靠近边缘的经过镜头成像后就变得越长,而实际上我们底片的尺寸是有限的,所以极端接近边缘的物体普通的镜头就无法成像记录了。
人们想到水下的鱼。由于水的折射率比空气大,光线从空气进入水中,折射角比入射角更小,并且入射角越大,这个变小的程度也越大。由于这个特性,使得在水中向上看时,能一眼看到整个水面上的这个半球形空间,整个空间的影像都背扭曲、压缩到了一个半顶角约为48°的锥形内。
在这个锥形空间内部,是来自水面上的空间的光线,在这个锥形外部,是来自水面下景色的反射。也就是说,在水下向上看,在一个圈之外,只能看到水底的景色;所有水面上的景色,都被压缩在一个圈内。
为了将尽可能大的场景投影到有限的图像平面内,鱼眼相机会按照一定的投影函数(如镜头投影类别表)来设计。根据投影函数的不同,鱼眼相机的设计模型大致能被分为五种:透视投影(即针孔相机模型)、等积投影、等距投影、体视投影、正交投影。
鱼眼镜头即是根据这种特性发明的,另外,鱼眼镜头的前镜片直径很短,且呈抛物状像前部凸出,与鱼的眼睛十分相似,“鱼眼镜头”因此而得名。
1 鱼眼相机成像模型
鱼眼镜头一般是由十几个不同的透镜组合而成,如图所示,在成像的过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比起来拥有了更大的视野范围。
在研究鱼眼相机成像时,可以将上面的镜头组简化为一个球面,如图所示,
O
1
−
X
c
Y
c
Z
c
O_{1}-X_{c}Y_{c}Z_{c}
O1−XcYcZc是相机坐标系,
O
2
−
x
y
O_{2}-xy
O2−xy是成像平面。现实世界有一点
P
P
P,入射角为
θ
\theta
θ,如果按照普通相机的针孔相机模型,入射光线
P
O
1
PO_{1}
PO1经过镜头后不改变路线,
P
P
P 、
O
1
O_{1}
O1 、
p
′
p'
p′ 三点共线,
p
′
p ′
p′为
P
P
P的像点;但对于鱼眼相机,入射光线
P
O
1
PO_{1}
PO1经过镜头后会发生折射,因此
P
P
P的像点为
p
p
p点,极坐标表示为
(
r
,
φ
)
(r,φ)
(r,φ)。
1.1 参考文章鱼眼镜头的成像原理到畸变矫正(完整版)
现放大成像原理图如下所示,其中
∣
O
p
′
∣
=
r
d
∣Op′∣ = r_{d}
∣Op′∣=rd,
∣
O
P
0
∣
=
r
|OP_{0}|=r
∣OP0∣=r,另外有部分符合不同,请注意。
实际的镜头因为各种原因并不会精确的符合投影模型,为了方便鱼眼相机的标定,一般取
r
r
r关于
θ
\theta
θ泰勒展开式的前5项来近似鱼眼镜头的实际投影函数:
r
(
θ
)
=
k
1
θ
+
k
2
θ
3
+
k
3
θ
5
+
k
4
θ
7
+
k
5
θ
9
(1)
r(\theta)=k_{1}\theta+k_{2}\theta^3+k_{3}\theta^5+k_{4}\theta^7+k_{5}\theta^9 \tag{1}
r(θ)=k1θ+k2θ3+k3θ5+k4θ7+k5θ9(1)
取
k
1
=
1
k_{1}=1
k1=1,至于
k
1
k_{1}
k1为什么取1暂时没找到比较官方的解释,个人感觉是为了少标定一个参数,实际上一次项系数对于整个表达式的值影响也没那么大,
k
1
=
1
k_{1}=1
k1=1带来的精度损失靠后面高次项系数补回来就好了。
假设相机坐标系
O
c
−
X
c
Y
c
Z
c
O_{c}-X_{c}Y_{c}Z_{c}
Oc−XcYcZc下有一点
P
(
x
,
y
,
z
)
P(x,y,z)
P(x,y,z),点
P
(
x
,
y
,
z
)
P(x,y,z)
P(x,y,z)如果按照针孔相机模型投影,则不存在畸变,像点为
P
0
(
a
,
b
)
P {0}(a,b)
P0(a,b)。假设
f
=
1
f = 1
f=1(最终可以求得
r
d
r_{d}
rd和
r
r
r的比值与
f
f
f无关?) ,
P
0
P_{0}
P0点坐标
(
a
,
b
)
(a,b)
(a,b)及极坐标
(
r
,
φ
)
(r,\varphi)
(r,φ):
{
a
f
=
x
z
=
a
b
f
=
y
z
=
b
r
2
=
a
2
+
b
2
t
a
n
(
θ
)
=
r
f
=
r
(2)
\left\{\begin{matrix} \frac{a}{f} =\frac{x}{z}=a \\\frac{b}{f} =\frac{y}{z}=b \\r^2 =a^2+b^2 \\tan(\theta)=\frac{r}{f}=r\end{matrix}\right. \tag{2}
⎩
⎨
⎧fa=zx=afb=zy=br2=a2+b2tan(θ)=fr=r(2)
由于镜头畸变的存在,像点到图像中心的距离
r
r
r被压缩成
r
d
r_{d}
rd,实际的像点位置为
p
′
(
x
′
,
y
′
)
p′(x′,y′)
p′(x′,y′)。结合等距投影函数和式(1)有:(标注
∣
O
p
′
∣
=
r
d
∣Op′∣ = r_{d}
∣Op′∣=rd,
∣
O
P
0
∣
=
r
|OP_{0}|=r
∣OP0∣=r)
论文指出,根据投影函数的不同,鱼眼相机的设计模型大致能被分为五种:透视投影、等积投影、等距投影、体视投影、正交投影,最常用的是等距投影模型,即
r
=
f
θ
(3)
r=f\theta \tag{3}
r=fθ(3)
将上述几种投影模型统一用
r
r
r关于
θ
\theta
θ的泰勒展开式来近似表示,这么做会带来一些精度损失,但基本可以忽略。即结合(1)式有:
r
(
θ
)
=
f
θ
≈
k
1
θ
+
k
2
θ
3
+
k
3
θ
5
+
k
4
θ
7
+
k
5
θ
9
(4)
r(\theta)=f\theta \approx k_{1}\theta+k_{2}\theta^3+k_{3}\theta^5+k_{4}\theta^7+k_{5}\theta^9 \tag{4}
r(θ)=fθ≈k1θ+k2θ3+k3θ5+k4θ7+k5θ9(4)
其中,
θ
\theta
θ是入射光线
∣
P
O
1
∣
|PO_{1}|
∣PO1∣和光轴的夹角,即入射角。
r
r
r表示相机空间任意点
P
P
P在相机成像平面的像点
p
p
p距离光心的距离
∣
O
2
p
∣
|O_{2}p|
∣O2p∣。
根据eq4我们能够知道,成像点到光心的距离
r
r
r是关于入射角
θ
\theta
θ的函数,但光线入射后以什么角度射出我们是难以计算的,因为鱼眼镜头是由一组透镜组成的,光线入射后的光路非常复杂,会在不同透镜间反复折射,可以看到论文的截图中入射光线经过
O
1
O_{1}
O1射到点
p
′
p'
p′的光路画的也是一条曲线。
因为
f
=
1
f=1
f=1,且
θ
d
\theta_{d}
θd的一次项系数
k
1
k_{1}
k1可以为1,最终可以得到OpenCV中使用的鱼眼相机模型:
r
d
=
f
⋅
t
a
n
θ
d
=
θ
d
=
θ
(
1
+
k
2
θ
2
+
k
3
θ
4
+
k
4
θ
6
+
k
5
θ
8
)
(5)
r_{d}=f\cdot tan\theta_{d}=\theta_{d}=\theta(1+k_{2}\theta^2+k_{3}\theta^4+k_{4}\theta^6+k_{5}\theta^8) \tag{5}
rd=f⋅tanθd=θd=θ(1+k2θ2+k3θ4+k4θ6+k5θ8)(5)
理想针孔成像像点
P
0
(
a
,
b
)
P_{0}(a,b)
P0(a,b)和鱼眼畸变后的像点
p
′
(
x
′
,
y
′
)
p′(x′,y′)
p′(x′,y′)到光心
O
O
O的距离分别为
r
r
r和
r
d
r_{d}
rd。实际中我们比较容易知道相机像空间的点
P
0
P_{0}
P0坐标,即针孔模型,在知道相机焦距
f
f
f的情况下,根据出射角等于入射角,像点
P
0
P_{0}
P0很容易可以得到,所以
r
r
r的值也知道,即根据相似三角形原理有:
s
c
a
l
e
=
r
d
r
=
x
′
a
=
y
′
b
(6)
scale=\frac{r_{d}}{r}=\frac{x'}{a}=\frac{y'}{b} \tag{6}
scale=rrd=ax′=by′(6)
一般记
s
c
a
l
e
=
r
d
r
scale=\frac{r_{d}}{r}
scale=rrd
有:
{
x
′
=
r
d
r
a
=
s
c
a
l
e
⋅
a
y
′
=
r
d
r
a
=
s
c
a
l
e
⋅
b
(7)
\left\{\begin{matrix} x'=\frac{r_{d}}{r}a=scale\cdot a \\y'=\frac{r_{d}}{r}a=scale\cdot b \end{matrix}\right. \tag{7}
{x′=rrda=scale⋅ay′=rrda=scale⋅b(7)
θ
\theta
θ是入射角,
θ
d
\theta_d
θd是畸变后的等效折射角(不是实际的折射角),
t
a
n
θ
d
=
r
d
f
tan\theta_{d}=\frac{r_{d}}{f}
tanθd=frd,如果取等效焦距
f
=
1
f=1
f=1(由eq6可以得到,畸变和相机焦距无关,仅和
s
c
a
l
e
scale
scale值有关,所以
f
f
f取多少都无所谓,
f
f
f变了,
r
d
r_{d}
rd相应的也会跟着变化),就有
r
d
=
t
a
n
θ
d
r_{d} = tan\theta_{d}
rd=tanθd。考虑到相机的成像CCD平面尺寸一般都是几毫米,焦距在几百毫米左右,所以相机实际成像过程中
θ
d
\theta_{d}
θd是比较小的,
t
a
n
θ
d
tan\theta_{d}
tanθd可以近似用
θ
d
\theta_{d}
θd表示(x → 0, tanx = x,),所以才有了这么一个等式:
r
d
=
θ
d
r_{d} = \theta_{d}
rd=θd
r
d
=
θ
d
=
θ
(
1
+
k
1
θ
2
+
k
2
θ
4
+
k
3
θ
6
+
k
4
θ
8
)
(8)
r_{d} = \theta_{d} = θ(1+k_{1}θ^2+k_{2}θ^4+ k_{3}θ^6 + k_{4}θ^8) \tag{8}
rd=θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8)(8)
所以不管鱼眼镜头使用的什么模型,推导过程都是一样的,至于 t a n θ d tan\theta_{d} tanθd是否要近似成 θ d \theta_{d} θd,我个人觉得只要畸变参数的标定过程和解畸变过程保持一致就不会有太大问题。
最后利用相机内参将像平面的点转换到像素坐标系就得到了最终图像上的点:
{
u
=
f
x
x
′
+
c
x
v
=
f
y
y
′
+
c
y
(9)
\left\{\begin{matrix} u=f_xx'+c_x \\v=f_yy'+c_y\end{matrix}\right. \tag{9}
{u=fxx′+cxv=fyy′+cy(9)
上述推导参考鱼眼镜头的成像原理到畸变矫正(完整版)
“感觉强行推导出 r d = θ d r_{d} = \theta_{d} rd=θd”
我认为应该谈论归一化平面,是归一化平面的性质,这篇文章此处还有待商讨。
1.2 参考文章深入洞察OpenCV鱼眼模型之成像投影和畸变表估计系数相互转化
关于Fish-Eye其实有多种投影模型,具体参考Wiki Fisheye Projection,典型有equidistance,equisolid angle,orthogonal projection等,根据OpenCV实现,其依据的论文是一种通用模型,不依赖某个具体的类型,取9阶系数就足以满足绝大多数镜头畸变模型。
成像原理如下图,坐标系
X
c
O
1
Y
c
X_cO_1Y_c
XcO1Yc为相机物理坐标系,蓝色平面为
π
1
\pi_1
π1为归一化成像平面(离光心
O
1
O_1
O1的距离为1),橙色平面
π
2
\pi_2
π2为实际成像平面(离光心
O
1
O_1
O1的距离为焦距
f
f
f),点
P
P
P为坐标系
X
c
O
1
Y
c
X_cO_1Y_c
XcO1Yc下的一外点,光线通过红色虚线射入,从绿色虚线“折射”到成像平面“引起畸变”;点
p
′
p'
p′,
N
N
N分别为平面
π
2
\pi_2
π2,
π
1
\pi_1
π1理想透视投影点,点
p
p
p,
M
M
M分别为平面
π
2
\pi_2
π2,
π
1
\pi_1
π1实际投影畸变点。另外位于平面
π
1
\pi_1
π1的
∣
∣
O
2
M
∣
∣
=
r
d
||O_2M||=r_d
∣∣O2M∣∣=rd,
∣
∣
O
2
N
∣
∣
=
r
||O_2N||=r
∣∣O2N∣∣=r,而不是平面
π
2
\pi_2
π2中的
∣
∣
O
3
p
∣
∣
≠
r
d
||O_3p||\neq r_d
∣∣O3p∣∣=rd,
∣
∣
O
3
p
′
∣
∣
≠
r
||O_3p'||\neq r
∣∣O3p′∣∣=r。
点
P
(
x
c
,
y
c
,
z
c
)
P(x_c,y_c,z_c)
P(xc,yc,zc)透视投影经归一化为平面
π
1
\pi_1
π1中的点
N
(
x
n
,
y
n
)
N(x_n,y_n)
N(xn,yn),有
{
x
n
=
x
c
z
c
y
n
=
f
r
a
c
y
c
z
c
r
2
=
x
n
2
+
y
n
2
t
a
n
(
θ
)
=
r
f
=
1
=
r
(1)
\left\{\begin{matrix} x_n=\frac{x_c}{z_c} \\\ y_n=frac{y_c}{z_c} \\\ r^2 =x_n^2+y_n^2 \\tan(\theta)=\frac{r}{f=1}=r\end{matrix}\right. \tag{1}
⎩
⎨
⎧xn=zcxc yn=fracyczc r2=xn2+yn2tan(θ)=f=1r=r(1)
由于投影模型统一用
r
r
r关于
θ
\theta
θ的泰勒展开式来近似表示:
r
(
θ
)
=
k
1
θ
+
k
2
θ
3
+
k
3
θ
5
+
k
4
θ
7
+
k
5
θ
9
(2)
r(\theta)=k_{1}\theta+k_{2}\theta^3+k_{3}\theta^5+k_{4}\theta^7+k_{5}\theta^9 \tag{2}
r(θ)=k1θ+k2θ3+k3θ5+k4θ7+k5θ9(2)
故,畸变像高可表示为:
r
d
=
θ
(
1
+
k
1
θ
2
+
k
2
θ
4
+
k
3
θ
6
+
k
4
θ
8
(3)
r_d=\theta(1+k_{1}\theta^2+k_{2}\theta^4+k_{3}\theta^6+k_{4}\theta^8 \tag{3}
rd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8(3)
为什么此处k_{1} = 1?
同时,
△
O
1
O
2
M
\bigtriangleup O_1O_2M
△O1O2M为直角三角形,满足,
t
a
n
(
θ
d
)
=
r
d
f
=
1
=
r
d
(4)
tan(\theta_d)=\frac{r_d}{f=1}=r_d \tag{4}
tan(θd)=f=1rd=rd(4)
比例因子:
s
c
a
l
e
=
r
d
r
=
t
a
n
(
θ
d
)
t
a
n
(
θ
)
(5)
scale=\frac{r_d}{r}=\frac{tan(\theta_d)}{tan(\theta)} \tag{5}
scale=rrd=tan(θ)tan(θd)(5)
又
△
O
1
O
2
N
∼
△
O
1
O
2
p
′
\bigtriangleup O_1O_2N \sim\bigtriangleup O_1O_2p'
△O1O2N∼△O1O2p′,
△
O
1
O
2
M
∼
△
O
1
O
2
p
\bigtriangleup O_1O_2M \sim\bigtriangleup O_1O_2p
△O1O2M∼△O1O2p,
r
d
r
=
∣
∣
O
3
p
∣
∣
∣
∣
O
3
p
′
∣
∣
=
t
a
n
(
θ
d
)
t
a
n
(
θ
)
=
s
c
a
l
e
(6)
\frac{r_d}{r}=\frac{||O_3p||}{||O_3p'||}=\frac{tan(\theta_d)}{tan(\theta)}=scale \tag{6}
rrd=∣∣O3p′∣∣∣∣O3p∣∣=tan(θ)tan(θd)=scale(6)
点
p
p
p的畸变坐标
(
x
d
,
y
d
)
(x_d,y_d)
(xd,yd)有,
{
x
d
=
s
c
a
l
e
∗
a
y
d
=
s
c
a
l
e
∗
b
(7)
\left\{\begin{matrix} x_d = scale*a \\y_d = scale*b\end{matrix}\right. \tag{7}
{xd=scale∗ayd=scale∗b(7)
设点
O
3
O_3
O3在像素平面
u
v
uv
uv下的坐标为
(
U
0
,
V
0
)
(U_0,V_0)
(U0,V0),在x轴,y轴单位长度上的像素数为
f
x
,
f
y
f_x,f_y
fx,fy,则像素坐标为:
{
u
=
f
x
∗
x
d
+
U
0
v
=
f
y
∗
y
d
+
V
0
(8)
\left\{\begin{matrix} u=f_x*x_d+U_0 \\v=f_y*y_d+V_0\end{matrix}\right. \tag{8}
{u=fx∗xd+U0v=fy∗yd+V0(8)
如果考虑错切因子
α
\alpha
α,则上式
u
=
f
x
∗
(
x
d
+
α
y
d
)
+
U
0
u=f_x*(x_d+\alpha y_d)+U_0
u=fx∗(xd+αyd)+U0,此时内参矩阵
K
K
K即为:
K
=
[
f
x
α
U
0
0
f
y
V
0
0
0
1
]
(9)
K=\begin{bmatrix} f_x& \alpha & U_0\\ 0& f_y & V_0\\ 0& 0 &1\end{bmatrix} \tag{9}
K=
fx00αfy0U0V01
(9)
注意上述步骤其实是图像去畸变的工作过程,先一一找到无畸变点对应的畸变点坐标映射,合适时候再通过插值找到对应的像素点。
如果是某个点的去畸变,则需要逆向求解上述过程,其中有已知 θ d \theta_d θd,求 θ \theta θ,这就很多方法了,不在此描述。
注意点:
- r d r_d rd, r r r的计算分析均指在归一化平面 π 1 \pi_1 π1上进行的,而不是实际成像平面 π 2 \pi_2 π2;
- 1.1参考文献中描述“畸变与焦距无关”是不完全正确的,这在归一化成像平面 π 1 \pi_1 π1上成立,因为有 r d = 1 ⋅ t a n ( θ d ) r_d=1\cdot tan(\theta_d) rd=1⋅tan(θd),但在实际成像平面上 p i 2 pi_2 pi2上不成立,因为 ∣ ∣ O 3 p ∣ ∣ = f ∗ t a n ( θ d ) ||O_3p||=f*tan(\theta_d) ∣∣O3p∣∣=f∗tan(θd), θ d \theta_d θd一定的情况下,与焦距 f f f成正比;
- 1.1参考文献把平面 π 1 \pi_1 π1和平面 π 2 \pi_2 π2混为一团,牵强认为KaTeX parse error: Undefined control sequence: \thera at position 26: … tan(\theta_d)=\̲t̲h̲e̲r̲a̲_d,这里根本就没有趋向于0的说法。
总结:
- 归一化平面 π 1 \pi_1 π1存在的目的是为了求取尺度scale,然后根据三角形相似原理转嫁到实际成像平面 π 2 \pi_2 π2做去畸变计算
- 焦距不会影响畸变形状(或外观),影响的是尺度的变化,但尺度变化百分比保持不变
- 4个畸变系数 k 1 , k 2 , k 3 , k 4 k_1,k_2,k_3,k_4 k1,k2,k3,k4影响畸变形状(或外观),也会影响尺度大小
- 内参矩阵K是相机物理坐标系与像平面坐标互相转化的“过度矩阵”,决定着畸变中心位置坐标和坐标系转换的功能
2 鱼眼矫正
2.1 参考文章鱼眼镜头的成像原理到畸变矫正(完整版)
为了利用畸变表提供的数据对畸变图像进行去畸变,通常有下面2种方式:
2.1.1 直接根据畸变表对图像去畸变
主要利用畸变表中像高比例进行查表(一维插值)进行畸变量计算,算法步骤为:
1.根据畸变表估算内参矩阵K和人为指定无畸变图大小;
2.利用内参矩阵K对某个无畸变图像素坐标(u,v)转为像平面
p
i
2
pi_2
pi2
的物理坐标(x,y);
3.计算物理坐标(x,y)离原点的距离为RefH;
4.计算入射角
θ
\theta
θ,然后查表得到畸变像高距离
r
d
r_d
rd,直接根据比例计算物理畸变点坐标
(
x
d
,
y
d
)
(x_d,y_d)
(xd,yd);
5.再次利用内参矩阵K将物理畸变点坐标
(
x
d
,
y
d
)
(x_d,y_d)
(xd,yd)转为像素坐标
(
u
d
,
v
d
)
(u_d,v_d)
(ud,vd);
6.对所有无畸变图上的点重复step2-5找到像素坐标映射关系
(
u
,
v
)
−
>
(
u
d
,
v
d
)
(u,v)->(u_d,v_d)
(u,v)−>(ud,vd),最后图像插值即可完成去畸变。
2.1.2 畸变表拟合系数对图像去畸变
//TODO
可以看出两种方法效果图一致,主要区别就是尺度scale计算方式不同,一个是直接查表得到scale,另一个是拟合公式求scale,没有明显的本质区别。
2.2 参考文章[图像]畸变校正详解
3 鱼眼模型之成像投影和畸变表估计系数相互转化
来自鱼眼镜头厂商的畸变表一般为下述形式表格,其描述了光线通过透镜在相机传感器平面成像的高度信息,一般至少含有3列数据,比如下面表格有“Angle”(degrees),“Real Height”(mm),“Ref Height”(mm)等。其分别表示光线入射角(光线与摄像机光轴的夹角),实际成像高度,参考成像高度(透视投影),这些信息足以表征此镜头的畸变扭曲程度。另外还会提供一些常量,如每个像素长度为0.003mm,图像尺寸1920×1080,畸变中心位于图像中心,进一步地,结合畸变表,可以推算相机内参矩阵
K
K
K。
上述表格中第1列和第3列通常满足
R
e
f
H
=
f
⋅
t
a
n
(
θ
)
RefH=f\cdot tan(\theta)
RefH=f⋅tan(θ),
θ
\theta
θ对应第一列,一般从0°到90°之间,RefH为第三列,从此式可以推算出焦距
f
f
f。