摄像机标定工具箱
1.1 Matlab 摄像机标定工具箱
工具箱下载:http://www.vision.caltech.edu/bouguetj/calib_doc/download/index.html
说明文档:http://www.vision.caltech.edu/bouguetj/calib_doc/
安装:将下载的工具箱文件 toolbox_calib.zip 解压缩,将目录 toolbox_calib 拷贝到 Matlab
的目录下。
采集图像:采集的图像统一命名后,拷贝到 toolbox_calib 目录中。命名规则为基本名和
编号,基本名在前,后面直接跟着数字编号。编号最多为 3 位十进制数字。
1.1.1 标定模型
内参数标定采用的模型如式(1-1)所示,Brown 畸变模型式(1-2)所示。
u
v
1
k
x
0
0
s
k
k
y
0
z
c
z
c
0
u
v
0
1
x
c
y
c
/
/
1
M
in
x
1
c
y
1
c
1
(1-1)
式中:(u, v)是特征点的图像坐标,(xc, yc, zc)是特征点在摄像机坐标系的坐标,kx、ky 是焦距
归一化成像平面上的成像点坐标到图像坐标的放大系数,ks 是对应于图像坐标 u、v 的摄像
机的 x、y 轴之间不垂直带来的耦合放大系数,(u0, v0)是光轴中心点的图像坐标即主点坐标,
(xc1, yc1)是焦距归一化成像平面上的成像点坐标。ks=ckx,c 是摄像机的实际 y 轴与理想 y
轴之间的夹角,单位为弧度。
2
2)
yxk
1
1
c
c
c
6
2
)
2
k
1(
1(
2
2
x
1
c
yxk
1
c
c
(
r
k
4
c
2
2)
1
c
rk
2
c
rk
2
c
rk
5
c
rk
5
c
rk
1
c
rk
1
c
x
1
dc
y
1
dc
x
1
c
y
1
c
4
4
(1-2)
3
(
r
c
3
2
6
y
2
4
)
1
c
式中:(xc1d, yc1d)是焦距归一化成像平面上的成像点畸变后的坐标,kc1 是 2 阶径向畸变系数,
kc2 是 4 阶径向畸变系数,kc5 是 6 阶径向畸变系数,kc3、kc4 是切向畸变系数,r 为成像点到
摄像机坐标系原点的距离,r2= xc12 + yc12。
1.1.2 操作界面
将 Matlab 的当前目录设定为含有标定工具箱的目录,即 toolbox_calib 目录。在 Matlab
命令窗口运行 calib_gui 指令,弹出图 1 所示选择窗口。
图 1 内存使用方式窗口
图 1 窗口中,具有两个选项,分别是“Standard”和“Memory efficient”。如果点击选
择“Standard”,则将目录中的所有图像读入内存中,所需内存较大。如果点击选择“Memory
efficient”,则将目录中的图像按照需要每次一幅图像读入内存中,所需内存较小。在选择了
1
内存使用方式后,弹出标定工具箱操作面板。图 2 是选择“Standard”后弹出的标定工具箱
操作面板。
图 2 标定工具箱操作面板
图 2 所示的标定工具箱操作面板具有 16 个操作命令键,其功能如下:
(1) “Image names”键:指定图像的基本名(Basename)和图像格式,并将相应的图像读
入内存。
(2) “Read names”键:将指定基本名和格式的图像读入内存。
(3) “Extract grid corners”键:提取网格角点。
(4) “Calibration”键:内参数标定。
(5) “Show Extrinsic”键:以图形方式显示摄像机与标定靶标之间的关系。
(6) “Project on images”键:按照摄像机的内参数以及摄像机的外参数(即靶标坐标系
相对于摄像机坐标系的变换关系),根据网格点的笛卡尔空间坐标,将网格角点反投影到图
像空间。
(7) “Analyse error”键:图像空间的误差分析
(8) “Recomp. corners”键:重新提取网格角点。
(9) “Add/Suppress images”键:增加/删除图像。
(10) “Save”键:保存标定结果。将内参数标定结果以及摄像机与靶标之间的外参数
保存为 m 文件 Calib_results.m,存放于 toolbox_calib 目录中。
(11) “Load” 键:读 入标定结果。 从存放于 toolbox_calib 目录中 的标定结果文件
Calib_results.mat 读入。
(12) “Exit”键:退出标定。
(13) “Comp. Extrinsic”键:计算外参数。
(14) “Undistort image”键:生成消除畸变后的图像并保存。
(15) “Export calib data”键:输出标定数据。分别以靶标坐标系中的平面坐标和图像中
的图像坐标,将每一幅靶标图像的角点保存为两个 tex 文件。
(16) “Show calib results”键:显示标定结果。
1.1.3 内参数标定
预先将命名为 Image1~Image20 的 tif 格式的 20 幅靶标图像保存在 toolbox_calib 目录中。
当然,采集的靶标图像也可以采用不同的格式,如 bmp 格式、jpg 格式等。但应注意,用于
标定的靶标图像需要采用相同的图像格式。摄像机的内参数标定过程,如下所述。
(1) 指定图像基本名与图像格式
在图 2 所示的标定工具箱操作面板点击“Image names”键,在 Matlab 命令窗口分别输
入基本名 Image 和图像格式 t,出现下述对话内容:
Basename camera calibration images (without number nor suffix): Image
Image format: ([]='r'='ras', 'b'='bmp', 't'='tif', 'p'='pgm', 'j'='jpg', 'm'='ppm') t
Loading image 1...2...3...4...5...6...7...8...9...10...11...12...13...14...15...16...17...18...19...20...
done
同时,在 Matlab 的图形窗口显示出 20 幅靶标图像,如图 3 所示。
2
Calibration images
图 3 靶标图像
(2) 提取角点
在图 2 所示的标定工具箱操作面板点击“Extract grid corners”键。
在 Matlab 命令窗口出现“Number(s) of image(s) to process ([] = all images) =”时,
输入要进行角点提取的靶标图像的编号并回车。直接回车表示选用缺省值。选择缺
省值式,对读入的所有的靶标图像进行角点提取。
在 Matlab 命令窗口出现“Window size for corner finder (wintx and winty): ”时,分
别在“wintx ([] = 5) =”和“winty ([] = 5) =”输入行中输入角点提取区域的窗口半
宽 m 和半高 n。m 和 n 为正整数,单位为像素,缺省值为 5 个像素。选定 m 和 n
后,命令窗口显示角点提取区域的窗口尺寸(2n+1)x(2m+1)。例如,选择缺省时角
点提取区域的窗口尺寸为 11x11 像素。
在 Matlab 命令窗口出现“Do you want to use the automatic square counting mechanism
to enter the number of squares manually
(0=[]=default) or do you always want
(1,other)? ”时,选择缺省值 0 表示自动计算棋盘格靶标选定区域内的方格行数和
列数,选择值 1 表示人工计算并输入棋盘格靶标选定区域内的方格行数和列数。
到显示所选择靶标图像的图形窗口,利用鼠标点击设定棋盘格靶标的选定区域。点
击的第一个角点作为靶标坐标系的原点,顺序点击 4 个角点形成四边形。注意,所
形成的四边形的边应与棋盘格靶标的网格线基本平行。否则,影响角点提取精度,
甚至导致角点提取错误。
在 Matlab 命令窗口出现“Size dX of each square along the X direction ([]=100mm) = ”
和“Size dY of each square along the Y direction ([]=100mm) = ”时,分别输入方格
长度和宽度,单位为 mm。方格长度和宽度的缺省值均为 100mm。
在 Matlab 命令窗口出现“Need of an initial guess for distortion? ([]=no, other=yes) ”
时,如果选择 no 则不输入畸变初始值,如果选择 yes 则输入畸变初始值。输入的
畸变初始值,将同时赋值给需要估计的 5 个畸变系数,即径向畸变系数 kc(1)、kc(2)、
kc(5)和切向畸变系数 kc(3)、kc(4)。如果不估计 6 阶径向畸变系数 kc(5),则 kc(5)
被赋值为 0。
按照上述步骤,对用于标定的每一幅靶标图像进行角点提取。例如,m=5,n=5 时,角
点提取区域的窗口尺寸为 11x11 像素,未输入畸变初始值,此时图像 Image6 的角点提取结
果如图 4 所示。图 4(a)只标出了待提取角点的位置,图 4(b)标出了角点提取区域窗口和提取
出的角点。从图 4 中可以发现,图 4(a)中的十字标记位置与角点具有明显偏差,但在角点附
3
近;图 4(b)中的每个角点提取区域窗口包含了角点,表示角点提取结果的十字标记位置与角
点位置具有很好的吻合度。同样在 m=5,n=5 时,未输入畸变初始值,但通过鼠标点击设定
棋盘格靶标的选定区域时,所形成的四边形的边与棋盘格靶标的网格线成较大夹角,此时图
像 Image1 的角点提取结果如图 5 所示。从图 5 中可以发现,图 5(a)中的十字标记位置与角
点具有明显偏差,部分十字标记远离角点;图 5(b)中的很多角点提取区域窗口没有包含角点,
表示角点提取结果的十字标记位置并不在角点位置,说明角点提取存在错误。
The red crosses should be close to the image corners
50
100
150
200
250
300
350
400
450
Y
O
100
200
X
300
(a)
400
500
600
Extracted corners
)
e
m
a
r
f
a
r
e
m
a
c
n
i
(
c
Y
50
100
150
200
250
300
350
400
450
dY
O
dX
100
200
300
400
Xc (in camera frame)
500
600
(b)
图 4 合适的靶标选定区域与角点提取结果,(a) 靶标选定区域,(b) 角点提取结果
(3) 内参数标定
对用于标定的每一幅靶标图像进行角点提取后,在图 2 所示的标定工具箱操作面板点击
“Calibration”键,即可完成摄像机的内参数标定。
内参数标定时,Matlab 工具箱首先进行初始化,即将图像中心点坐标作为主点坐标的
初始值,采用平面靶标网格的消失点估计出摄像机的内参数作为内参数的初始值,畸变初始
值设为 0。镜头畸变采用包括径向畸变和切向畸变的 Brown 畸变模型,并假设 6 阶径向畸变
系数 kc(5)=0。假设摄像机的 x 轴与 y 轴严格垂直,即图像坐标(u, v)与归一化成像平面内的
成像点坐标(xc1, yc1)解耦,ks=0,内参数采用 4 参数模型。数组 est_dist(1:5)是畸变系数 kc(1:5)
是否标定的标志,只对标志取值为 1 的畸变系数标定,标志取值为 0 的畸变系数不标定。
4
The red crosses should be close to the image corners
50
100
150
200
250
300
350
400
450
)
e
m
a
r
f
a
r
e
m
a
c
n
i
(
c
Y
50
100
150
200
250
300
350
400
450
Y
O
100
200
dY
O
dX
100
200
X
400
300
(a)
Extracted corners
500
600
300
400
Xc (in camera frame)
500
600
图 5 错误的靶标选定区域与角点提取结果,(a) 靶标选定区域,(b) 角点提取结果
(b)
内参数标定给出初始化后的标定结果和优化后的标定结果。其中,对内参数的优化采用
L-M 梯度下降法。优化后的结果中给出的参数不确定性,是 3 倍的标准方差。fc 中的两个
数据分别是 kx 和 ky,即焦距归一化成像平面上的成像点坐标到图像坐标的放大系数。cc 为
光轴中心点的图像坐标(u0, v0),又称为主点坐标,单位为像素。alpha_c 是对应于图像坐标 v
的摄像机的实际 y 轴与理想 y 轴之间的夹角c,单位为弧度,默认值为 0 弧度。后续给出的
图像轴之间的夹角为对应于图像坐标 u、v 的摄像机的 x、y 轴之间的夹角,默认值为 90。
est_alpha 是 alpha_c 是否标定的标志位,只有 est_alpha=1 时对 alpha_c 进行标定。kc 为畸变
系数 kc1~kc5,kc(1)为二阶径向畸变系数 kc1,kc(2)为 4 阶径向畸变系数 kc2,kc(5)为 6 阶径向
畸变系数 kc5,kc(3)为图像坐标 u 对应于 xy 项的切向畸变系数 kc3,kc(4)为图像坐标 v 对应
于 xy 项的切向畸变系数 kc4。err 为将网格角点反投影到图像空间的误差的标准方差,单位为
像素。在优化后的结果中,不确定性的数值越小,说明标定的精度越高。如果不确定性项的
数值与结果值相比所占比例较大,则需要重新标定。
初始化后的标定结果:
Focal Length:
Principal point:
fc = [ 673.45516
cc = [ 319.50000
673.45516 ]
239.50000 ]
5
Skew:
Distortion:
lpha_c = [ 0.00000 ]
=> angle of pixel = 90.00000 degrees
kc = [ 0.00000
0.00000
0.00000
0.00000
0.00000 ]
优化后的标定结果:
fc = [ 657.80887
cc = [ 302.95191
658.51372 ] ±[ 1.86106
248.06759 ] ±[ 1.88046
1.34683 ]
2.85817 ]
Focal Length:
Principal point:
Skew:
Distortion: kc = [ -0.25853
0.00000 ]
0.00042
0.00085
alpha_c = [ 0.00000 ]±[ 0.00000] => angle of pixel axes = 90.00000 ±0.00000 degrees
0.03727
0.00000 ] ±[ 0.00784
-0.00030
0.14834
0.00074
Pixel error:
err = [ 0.15205
0.12424 ]
(4) 显示摄像机与标定靶标之间的关系
完成内参数标定后,在标定工具箱操作面板点击“Show Extrinsic”键,即可在新的图
形窗口显示摄像机与标定靶标之间的关系,如图 6 所示。图 6(a)为假设摄像机固定时摄像机
与靶标之间的关系,图 6(b)为假设靶标固定时摄像机与靶标之间的关系。
Extrinsic parameters (world-centered)
Extrinsic parameters (camera-centered)
500
0
-500
-500
5
4213
500
0
Oc
Zc
Xc
0
Yc
500
2500
2000
1500
1000
(a)
1
5
1500
1000
d
l
r
o
w
Z
500
0
0
500
1000
Xw orld
2
3
4
1000
500
0
-500
Yw orld
-1000
(b)
图 6 摄像机坐标系与靶标之间的关系,(a) 摄像机固定,(b) 靶标固定
(5) 误差分析
完成内参数标定后,在标定工具箱操作面板点击“Analyse error”键,即可在新的图形
窗口显示出标定使用的所有角点反投影到图像空间的图像坐标误差,如图 7 所示。在图 7
所示的图形窗口,利用鼠标移动十字标尺可以选择角点,即可在命令窗口显示出该角点的信
息,包括该角点所属图像、索引号、以方格为单位的坐标、图像坐标、反投影后的图像坐标
误差、角点提取区域的窗口半宽 m 和半高 n。
选择角点后在命令窗口显示的信息:
Selected image: 5
Selected point index: 51
Pattern coordinates (in units of (dX, dY)): (X,Y)=(11, 8)
Image coordinates (in pixel): (426.32, 261.58)
Pixel error = (-0.05908, 0.17309)
Window size: (wintx,winty) = (6, 6)
(6) 反投影到图像空间
完成内参数标定后,在标定工具箱操作面板点击“Project on image”键,在 Matlab 命
令窗口出现“Number(s) of image(s) to process ([] = all images) =”时,输入要进行反投影的靶
标图像的编号并回车。直接回车表示选用缺省值。选择缺省值式,对用于标定的所有靶标图
6
像进行反投影。选择图像后,在新的图形窗口显示反投影结果,并在命令窗口输出用于标定
的所有靶标图像的角点反投影的图像误差的标准方差。Image6 反投影的结果如图 8 所示,
其中“+”为角点的图像坐标位置,“o”为角点反投影的图像坐标位置。
点击“Project on image”键后,在命令窗口显示的信息如下:
Number(s) of image(s) to show ([] = all images) = 6
Pixel error:
err = [0.66512
0.41428] (all active images)
Reprojection error (in pixel) - To exit: right button
0.4
0.3
0.2
0.1
0
-0.1
-0.2
-0.3
-0.4
-0.5
y
-0.6
-0.4
-0.2
0
x
0.2
0.4
图 7 反投影到图像空间的角点图像坐标误差
Image 6 - Image points (+) and reprojected grid points (o)
50
100
150
200
250
300
350
400
450
Y
O
X
200
100
500
图 8 Image6 的角点反投影结果
300
400
600
(7) 图像畸变校正
完成内参数标定后,在标定工具箱操作面板点击“Undistort image”键,则按照畸变系
数对读入的所有靶标图像进行处理,生成消除畸变后的图像并保存在 toolbox_calib 目录中。
生成的消除畸变后的图像,以原图像的文件名在基本名和编号之间插入_rect 作为其文件名。
图 9 所示为 Image6 的原始图像和消除畸变后的图像。
(8) 增加/删除图像
在标定工具箱操作面板点击“Add/Suppress image”键,在命令窗口输入代表增加图像、
删除图像的数字,然后输入图像编号,可以增加/删除标定使用的图像。
(9) 重新提取网格角点
7
完成内参数标定后,在标定工具箱操作面板点击“Recomp. corners”键,在命令窗口输
入角点提取区域的窗口半宽 m 和半高 n、输入重新提取网格角点的图像编号、选择冲投影方
式后,即可对所选图像重新进行角点提取。重新进行角点提取后,可以再次进行内参数标定。
重新提取网格角点时采用了以前的标定结果,经过重新提取网格角点再次标定后,内参数标
定精度会有所提高。如果初次角点提取的效果较好,则重新进行网格角点提取的作用不大。
点击“Recomp. corners”键后,在命令窗口显示的信息如下:
Re-extraction of the grid corners on the images (after first calibration)
Window size for corner finder (wintx and winty):
wintx ([] = 5) =
winty ([] = 5) =
Window size = 11x11
Number(s) of image(s) to process ([] = all images) =
Use the projection of 3D grid or manual click ([]=auto, other=manual):
Processing image 1...2...3...4...5...
done
(a)
(b)
图 9 原始图像和校正后图像,(a) 原始图像 (b) 消除畸变后的图像
1.1.4 外参数标定
外参数标定是在内参数已知的前提下进行的。在完成摄像机的内参数标定后,或者在命
令窗口输入摄像机的内参数后,可以对棋盘格靶标相对于摄像机的外参数进行标定。在标定
工具箱操作面板点击“Comp. Extrinsic”键,在命令窗口输入靶标图像名称和图像格式,再
按照 1.1.2 节(2)中的过程提取角点,可实现靶标相对于摄像机的外参数标定。
外参数标定时,在命令窗口显示的信息如下:
Computation of the extrinsic parameters from an image of a pattern
The intrinsic camera parameters are assumed to be known (previously computed)
Image name (full name without extension): Image1
Image format: ([]='r'='ras', 'b'='bmp', 't'='tif', 'p'='pgm', 'j'='jpg', 'm'='ppm') t
Extraction of the grid corners on the image
Window size for corner finder (wintx and winty):
wintx ([] = 5) =
winty ([] = 5) =
Window size = 11x11
8