立体视觉入门指南:相机标定之张式标定法超详细值得收藏
Posted 李迎松~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了立体视觉入门指南:相机标定之张式标定法超详细值得收藏相关的知识,希望对你有一定的参考价值。
亲爱的同学们,我们的世界是3D世界,我们的双眼能够观测三维信息,帮助我们感知距离,导航避障,从而翱翔于天地之间。而当今世界是智能化的世界,我们的科学家们探索各种机器智能技术,让机器能够拥有人类的三维感知能力,并希望在速度和精度上超越人类,比如自动驾驶导航中的定位导航,无人机的自动避障,测量仪中的三维扫描等,都是高智机器智能技术在3D视觉上的具体实现。
立体视觉是三维重建领域的重要方向,它模拟人眼结构用双相机模拟双目,以透视投影、三角测量为基础,通过逻辑复杂的同名点搜索算法,恢复场景中的三维信息。它的应用十分之广泛,自动驾驶、导航避障、文物重建、人脸识别等诸多高科技应用都有它关键的身影。
本课程将带大家由浅入深的了解立体视觉的理论与实践知识。我们会从坐标系讲到相机标定,从被动式立体讲到主动式立体,甚至可能从深度恢复讲到网格构建与处理,感兴趣的同学们,来和我一起探索立体视觉的魅力吧!
本课程是电子资源,所以行文并不会有太多条条框框的约束,但会以逻辑清晰、浅显易懂为目标,水平有限,若有不足之处,还请不吝赐教!
个人微信:EthanYs6,加我申请进技术交流群 StereoV3D,一起技术畅聊。
CSDN搜索 :Ethan Li 李迎松,查看网页版课程。
随课代码,将上传至github上,地址:StereoV3DCode:https://github.com/ethan-li-coding/StereoV3DCode
同学们好,在上一篇立体视觉入门指南(2):关键矩阵中,我们对立体视觉的3个关键矩阵:本质矩阵 E E E、基础矩阵 F F F、单应性矩阵 H H H作了较为详细的描述,同时给出了本质矩阵、单应性矩阵的求解方法以及本质矩阵分解外参 R , t R,t R,t的具体公式。更加难能可贵的是,我们在博文最后提供了几个作业题并在Github开源了参考答案代码【我知道很多心理都在默念李博666】【当然肯定也有一些人在默念这太easy了李博能不能上点难度】。无论如何,博主觉得这是一件有意义的事情,只希望没有误人子弟。
而本篇的内容,则是立体视觉的绝对核心模块:相机标定。虽然它因为技术相对成熟,如今研究的人不多,也容易被人忽略,往往用一个开源算法库如Opencv或者Matlab标定工具箱就直接搞定,但实际在立体视觉工程化、产品化时,开源工具由于其精度不高、灵活度低而不建议直接使用,企业往往是自己开发相机标定算法。相机标定作为立体视觉的核心模块,掌握其理论是相当必要的,对我们深入理解立体视觉技术大有帮助,有开山辟路之效。
相机标定,目的是确定相机的内参矩阵
K
K
K、外参矩阵
R
,
t
R,t
R,t 和 畸变系数
d
(
k
1
,
k
2
,
k
3
,
p
1
,
p
2
)
d(k_1,k_2,k_3,p_1,p_2)
d(k1,k2,k3,p1,p2)。我们暂且先不考虑畸变系数(后面再讨论它),从前篇可知,图像坐标
p
p
p和世界坐标
P
w
P_w
Pw之间,通过内外参建立投影关系,具体公式如下:
λ
p
=
K
[
R
t
]
[
P
w
1
]
(1)
\\lambda p=K\\left[\\beginmatrixR&t\\endmatrix\\right] \\left[\\beginmatrixP_w\\\\1\\endmatrix\\right] \\tag 1
λp=K[Rt][Pw1](1)
所谓标定,即是由大量观测值拟合参数模型的过程,且在此拟合的参数模型是已知的,所以应尽可能探索能便捷获取大量观测值的方案,如果观测值之间还满足一些其他的几何约束就更有助于求解具体单个参数值。
今天所述的Zhang式标定法1即提供了一种便捷获取大量观测值的的方案,同时观测值之间还满足一类明显的几何约束(即平面约束),可直接求解出内外参。其操作方式非常简单,只需要拍摄带有标定板图案的平面,即可完成相机标定,使标定难度极大降低,如果不追求高精度,打印一张棋盘格标定板图案粘贴到近似平的硬纸板上即可完成标定,加快了立体视觉的入门和普及,影响深远,是相机标定领域绝对的经典。
本篇即带大家深入了解Zhang式相机标定法,掌握本篇对立体视觉的理论掌握及工程实战来说都是非常必要的。
实施方法
Zhang式标定法能够被广泛应用,其中一个重要原因是其实施方法十分简单,不需要专业的工艺制作即可完成。
第一步,设计一张具有明显角点特征,且已知每个角点二维坐标的图案作为标定图案,常见的图案有三种:
|
|
|
规则的图案设计可以方便的计算出角点在图案内的二维坐标,拿棋盘格来说,角点之间的间隔像素数是固定的,假设左上角角点的坐标为 ( 0 , 0 ) (0,0) (0,0),则其他角点的像素坐标都可以通过格子的偏移量计算出来,而一张已知DPI的标定板图像,在打印后每个角点的二维空间坐标也是完全已知的(通过像素换算成空间尺寸)。
第二步,将标定板图案以某种方式置于一个平面上。比如最简单的方式是将标定图原尺寸打印出来,然后找一块近似平的平板,将打印后的标定图案粘贴至平板上;更专业高精度的方式是找专业厂家制作高精平板(如陶瓷板)并将标定图案以某种工艺刻印到平板上。这一步的目的是让标定图案的角点都位于一个平面上。
如此,第一步所描述的二维坐标可以转换成第三维 Z Z Z坐标等于0的三维坐标(将世界坐标系的原点放在标定板的某个角点,Z轴垂直于标定板)。
第三步,移动相机到N(N>=3)个不同的位姿拍摄标定板图案。
第四步,对上一步拍摄的标定板图案进行角点提取,解算标定参数。
以上便是相机标定的实施步骤,总结来说,在一个平面标定板上有一组已知空间坐标的角点,相机在多个不同位姿下拍摄角点图案并提取角点的像素坐标,即可完成相机内外参数的解算。这句总结蕴含2个重要的知识点:
- 标定图案中角点的空间坐标是已知的,且它们都位于一个平面上, Z Z Z坐标等于0
- 相机需要在多个不同的位姿拍摄角点图案并提取像素坐标
可以看到Zhang式标定法确实是易于实施的方法,其中蕴含的标定理论,是非常有价值的,对于立体视觉的初学者来说,掌握其理论很有必要,还请务必阅读本篇接下来的内容。
理论基础
定义
为了保持和论文的公式一致,我们改变下前两篇博客中的命名习惯,假设图像上某点像素坐标为
m
=
[
u
,
v
]
T
\\text m=[u,v]^T
m=[u,v]T,空间中某点三维坐标为
M
=
[
X
,
Y
,
Z
]
T
\\text M=[X,Y,Z]^T
M=[X,Y,Z]T,两者的齐次表达式分别为
m
~
=
[
u
,
v
,
1
]
T
,
M
~
=
[
X
,
Y
,
Z
,
1
]
T
\\widetilde\\text m=[u,v,1]^T,\\widetilde\\text M=[X,Y,Z,1]^T
m
=[u,v,1]T,M
=[X,Y,Z,1]T。则文章片头的投影公式可表达为:
s
m
~
=
A
[
R
t
]
M
~
(2)
s\\widetilde\\text m=\\text A\\left[\\beginmatrix\\text R&\\text t\\endmatrix\\right]\\widetilde\\text M \\tag 2
sm
=A[Rt]M
(2)
其中,
s
s
s为尺度因子,
R
,
t
\\text R,\\text t
R,t为外参矩阵,用于将世界坐标系坐标转换成相机坐标系坐标,前者为旋转矩阵,后者为平移矢量。
A
\\text A
A为相机的内参矩阵,具体的,
A
=
[
α
γ
u
0
0
β
v
0
0
0
1
]
A=\\left[\\beginmatrix\\alpha&\\gamma&u_0\\\\0&\\beta&v_0\\\\0&0&1\\endmatrix\\right]
A=⎣⎡α00γβ0u0v01⎦⎤
其中,
(
u
0
,
v
0
)
(u_0,v_0)
(u0,v0)为像主点坐标,
α
,
β
\\alpha,\\beta
α,β分别为图像
u
u
u轴和
v
v
v轴方向的焦距(像素单位)值,
γ
\\gamma
γ为像元轴的倾斜因子。
单应性矩阵
在实施方法中,我们一定能够关注到一个非常关键的信息:标定图案被置于一个平面上。它的目的是为了让标定图案中的角点都位于一个空间平面上,从而当相机拍摄角点成像后,空间平面和像平面之间存在一个单应性变换关系,即可通过一个单应性矩阵 H \\text H H将角点的空间坐标转换成图像坐标。
一般情况下,我们将世界坐标系置于标定板某个角点上,并让
Z
Z
Z轴垂直于标定板,此时角点的
Z
Z
Z坐标将全部等于0,则三维坐标可表示为
[
X
,
Y
,
0
,
1
]
T
[X,Y,0,1]^T
[X,Y,0,1]T。同时定义旋转矩阵
R
\\text R
R的第
i
i
i个列向量为
r
i
\\text r_i
ri,则公式
s
m
~
=
A
[
R
t
]
M
~
s\\widetilde\\text m=\\text A\\left[\\beginmatrix\\text R&\\text t\\endmatrix\\right]\\widetilde\\text M
sm
=A[Rt]M
可表示为
s
[
u
v
1
]
=
A
[
r
1
r
2
r
3
t
]
[
X
Y
0
1
]
=
A
[
r
1
r
2
t
]
[
X
Y
1
]
(3)
s\\left[\\beginmatrixu\\\\v\\\\1\\endmatrix\\right]=\\text A\\left[\\beginmatrix\\text r_1&\\text r_2&\\text r_3&\\text t\\endmatrix\\right]\\left[\\beginmatrixX\\\\Y\\\\0\\\\1\\endmatrix\\right]=\\text A\\left[\\beginmatrix\\text r_1&\\text r_2&\\text t\\endmatrix\\right]\\left[\\beginmatrixX\\\\Y\\\\1\\endmatrix\\right] \\tag 3
s⎣⎡uv立体视觉入门指南:双相机标定再不收藏我收费了~