您的位置:首页 > 理论基础

【计算机视觉】摄像机标定 matlab toolbox_calib工具箱(单目标定和双目标定)

2017-05-06 22:58 691 查看

1 整体介绍相机标定为Matlab工具箱

http://www.vision.caltech.edu/bouguetj/calib_doc/

相机标定为Matlab工具箱



 

   
这是一个释放相机标定为Matlab工具箱 庐 完整的文档。
这个文档可能 也被用作一个教程自它包括摄像机标定 一般的校准信息,引用和相关链接。 
请 报告错误/问题/建议让Bouguet“jbouguet在gmail。com”。 

这个工具箱中包含的C实现 OpenCV ,一个开源的计算机视觉库免费 在线 。 

内容: 
系统需求
开始
校准的例子
校准参数的描述
描述函数的校准工具
做你自己的校准
无证工具箱的功能
引用
一些相关链接摄像机标定



系统需求

该工具箱在Matlab 5日有效。 Matlab 8 x。 x在Windows、Unix和Linux系统,并且不需要任何特定的Matlab工具箱(例如,优化工具箱不是必需的)。 
注意: 请帮我保留这个工具箱,报告给我。 在邮件主题中包括错误的类型,并在体内复制完整的错误消息。 谢谢你!



开始

去 下载页面 和检索的最新版本完成 相机标定为Matlab工具箱。
存储个人matlab文件( 00 文件)到一个独一无二的 文件夹 TOOLBOX_calib (默认文件夹名称)。
Matlab运行 并添加文件夹的位置 TOOLBOX_calib 到主 matlab的道路。 这个过程会让你调用任何的matlab
工具箱函数从任何地方。 在Windows下,这可能很容易 通过使用编辑菜单的路径。 在Unix或Linux,您可能使用 命令 路径 或 目录 (使用 帮助 命令函数描述)。
运行主matlab校准功能 calib_gui (或 calib )。 
模式选择窗口出现在屏幕上: 



这个选择窗口允许您选择工具箱的两种操作模式:标准或内存效率。 在标准模式下,所有用于标定的图像从磁盘加载到内存一次,不会再读。 这最小化磁盘访问的总体数量,加速所有的图像处理和图像显示功能。 然而,如果图像很大,或者有很多,那么 内存不足 错误消息可能会遇到。
如果是这种情况,那么新的内存可以使用有效版本的工具箱。 在这种模式下,每一个图像加载一个接一个,从不永久保存在内存中。 
如果您选择运行标准版本的工具箱,你可以切换到其他内存之后的有效模式 内存不足 遇到错误消息。 两种模式的操作是完全兼容的(输入和输出)和可互换的。 

由于两种模式有相同的用户界面,在本文档中,我们选择的标准模式通过点击按钮窗口的顶部。 主要标定工具箱窗口在屏幕上(替换模式选择窗口): 



注意,模式选择步骤可以绕过完全通过直接运行 calib_gui(0) 正常模式或 calib_gui(1) 内存高效模式(试一试 帮助calib_gui 的更多信息)。

现在,您可以使用工具箱进行校准。



校准的例子

第一次校准的例子——角落提取、标定、额外的工具

本节将介绍一个完整的校准基于示例 总共20(25)的图像平面棋盘。 这个例子 让你学习如何使用工具箱的特点:装载 标定图像,提取图像的角落,主要运行 校准引擎,显示结果,控制精度, 添加和抑制图像、undistorting图像导出 校准数据以不同的格式… 这个例子是高度 建议对于那些刚刚开始使用工具箱。

第二次校准 例子——校准使用诤友张的数据

本节将向您展示如何使用主校准引擎 诤友张的数据脚本模式。 经过, 示例中,您还将了解如何改变内在相机模型 选择哪些参数优化。 这个例子是高度 推荐给那些打算使用的主要校准引擎 在自己的matlab脚本文件。

第三次校准 例子——校准使用Heikkil閿燂拷数据(平面和non-planar 校准平台)

另一个校准的例子在Heikkil閿燂拷数据,表明主 优化引擎non-planar校准平台时同样适用。 尝试它,它只需要30秒跑!

第四次校准 例子——校准使用Bakstein和Halir的数据

另一个类似的校准的例子的主要运行优化 引擎Bakstein和Halir的数据。 试一试!

第五次校准 例子——校准立体音响系统,立体图像矫正和3 d立体三角

这个例子展示了如何使用工具箱用于校准立体音响系统(内在和外在),整流立体图像,并进行3 d立体三角。 一个新的立体声工具箱调用 stereo_gui 是证明。 



第六次校准 例子,结合两个独立的校准相同的相机

这个例子给出了一个快速演示脚本 merge_two_datasets.m 让你轻松组合两个校准数据集相同的相机单独创建。 



 校准参数的描述

校准后,参数列表可能存储在matlab 数据文件 Calib_Results.mat 通过点击 保存 。
本节 给所有校准参数的详细描述 (内在和外在)及其相应的matlab函数 的名字。 此外,一个我们之间的对应符号之一 和 Heikkil閿燂拷 和 威尔逊 符号。 



 描述函数的校准工具

本部分简要描述的主要功能 校准工具。 



 做你自己的校准

本节包含了一些相关信息的初始步骤 校准:设计校准装置,命名校准 使用图像,图像格式,… 非常有用的开始。 为 懒惰的人,甚至提供校准模式! 



 无证工具箱的功能

本节包含一个功能已经添加到列表 工具箱以来第一个版本的文档。 



 引用

一个参考文件列表,被用来设计工具箱。 



 一些相关链接摄像机标定


——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

2单目标定(例一)-运行主matlab校准功能 calib_gui (或 calib )

http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html

相机标定为Matlab工具箱
 



第一次校准的例子——角落提取、标定、额外的工具

本节将介绍一个完整的校准的例子基于共有20(25)的图像平面棋盘。 
这个例子可以让你学习如何使用工具箱的特点:装载 标定图像,提取图像的角落,主要运行 校准引擎,显示结果,控制精度, 添加和抑制图像,undistorting图像,输出校准数据 不同的格式… 这个例子是 强烈推荐对那些刚刚开始使用工具箱。 

下载校准图片 calib_example。
zip压缩(4461 kb) 或 一个接一个 ,20个图像存储到一个单独的文件夹命名 calib_example 





在matlab去例文件夹 calib_example 包含图像。

看图片: 

点击 图片的名字 按钮 相机校准工具 窗口。
进入basename标定的图像( 图像 )和图像格式( tif )。 
所有图片(20)被加载到内存中(通过命令 读取图像 自动执行)的变量 I_1 I_2 、…… I_20 
图像存储在变量的数量 n_ima(= 20) 。 
matlab窗口应该是这样的: 


 

全套的图片也显示在缩略图格式(这个图像总是可以再生,运行 马赛克 ): 



如果 内存不足 错误消息发生在图像阅读,这意味着你的计算机没有足够的内存来保存的整个图像在本地内存集。 这可以很容易地发生您正在运行的工具箱在128
mb或少笔记本为例。 在这种情况下,您可以直接切换到内存工具箱通过运行的有效版本 calib_gui 并选择内存效率的操作模式。 剩下的步骤校准(网格角落提取和校准)是完全相同的。 注意,在内存中有效模式,显示的缩略图不是自校准图像不加载。 

提取网格角: 

点击 提取网格角落 按钮 相机校准工具 窗口。 


 

按“输入”(使用一个空参数)来选择所有的图像 (否则,你将进入一个图像索引列表 [2 5 8 10 12) 提取的图像)的一个子集。
然后,选择 默认的窗口大小角落仪: wintx = winty = 5 通过 按“输入”与空的参数 wintx 和 winty 的问题。
这导致的一个有效窗口大小11 x11 像素。 


 

角落里提取引擎包含一个自动机制计算网格中的格子的数量。 这个工具是专门方便当处理大量图像自用户不必手动输入方块的数量在这两个模式的x和y方向。 然而在一些非常罕见的情况下,这段代码可能无法预测正确的数量的方块。 这通常发生在校准镜头与极端扭曲。 此时在角落里提取程序,程序给出了选择用户禁用自动平方计算代码。 在那个特殊的模式下,用户将被提示为每平方数的形象。
在这个示例中,是完全适当的继续工作在默认模式(即自动平方计算激活),因此,只需按下“输入”与一个空参数。 ( 注意: 通常情况下,应该首先使用角落里提取的代码在这个默认模式,然后,如果需要,处理文档“问题”的一些图片) 


 

第一校正图像被显示在图2: 



点击四个矩形棋盘上极端的角落 模式。 点击位置后在4所示 人物( 警告: 单击四角上的准确,
最多5像素的角落。 否则可能会错过一些角落探测器)。 

点击排序规则: 选择第一个点击点有关的起源点参考框架连接到电网。 其他三个点的矩形网格可以在任何顺序点击。
这首先点规则尤为重要如果你需要调整外部多个摄像头(即计算几个相机在空间的相对位置)。 在处理多个摄像头,同样的网格模式需要不断选择参考系为不同的相机图像(即网格点需要在对应不同的相机视图)。 例如,它是一个要求运行立体标定工具箱 stereo_gui.m (试试 帮助stereo_gui 并参观 第五个校准示例页面 的更多信息)。 



校准网格的边界被显示在图2: 



输入尺寸 dX 和 dY 在X和Y网格中的每个广场(在这种情况下, dX
= dY = 30毫米 
=默认值): 


 

请注意,您可以按下“输入”与一个空参数选择默认值。 程序自动计算方块的数量在这两个维度,并显示预测电网无失真的角落: 




 

如果预测角落接近真实图像的角落,然后下面的步骤可以跳过(如果没有多少图像失真)。 这就是现在的形象:在预测的角落是足够接近真实图像角落。 因此,没有必要“帮助”软件来检测图像通过输入一个猜 为径向畸变系数。 按“输入”,自动提取使用这些角落位置作为初始猜测。 


 

然后自动提取图像的角落,并显示在图3(角点周围的蓝色方块显示限制 角落的finder窗口): 



角落里提取的精度约为0.1像素。 
2遵循相同的过程 nd 3 理查德·道金斯 ,……
,14 th 图像。 例如,下面是检测到的角落图片2,3,4,5,6,7: 



观察广场维度 dX dY 总是保持其原始值(30毫米)。 
有时候,预测的角落不太接近现实图像角落角落允许一个有效的提取。 在这种情况下,有必要完善预测进入一个猜角落的镜头畸变系数。 这种情况发生在15形象。 图片,预测的角落: 



中观察到的一些预测角落网格足够远的真实网格角向拔错了结果。 原因:图像失真。 为了帮助系统做一个更好的猜测角落位置,用户是免费的手动输入猜测第一透镜畸变系数 kc (准确地说,它是完整的畸变系数向量的第一个元素 kc 在这个描述页面 )。
为了输入猜测透镜畸变系数,输入一个非空字符串的问题 需要一个初始猜测失真? (例如 )。
进入畸变系数 kc = -0.3 (在实践中,这个数字通常是1 - 1)。 


 

根据这一扭曲,新的预测角落位置是: 



如果新的预测角落足够接近真实图像角落(这是这里的情况),输入任何非空字符串(如 这个问题的) 对畸变满意吗? 
亚像素角位置然后计算使用新的预测位置与图像失真)(初始猜测: 


 

如果我们不满意,我们将会进入一个空字符串的问题 对畸变满意吗? (通过直接按下“输入”),然后尝试一个新的畸变系数 kc 
你可以任意多次重复这个过程,直到满意预测( 注: 扭曲的价值观在这个阶段只是用来帮助角落提取和不会影响下一个主要的校准步骤。
换句话说,既不使用这些值作为最后的畸变系数,也用作真正的初始猜测畸变系数估计通过校准优化阶段)。 

最后发现角落在图3所示: 



其余5上重复相同的过程图片(16 - 20)。 然而在这些图像,不使用预测失真选项,即使提取的角落不是完全正确。 在接下来的步骤中,我们将改正(在这个例子中,我们可以没有这个选项用于图像15,但那是相当有用的插图)。 

角落里提取后,matlab数据文件 calib_data.mat 是自动生成的。
这个文件包含所有的信息聚集在角落里提取阶段(图像坐标,相应的3 d网格坐标,网格大小,…)。 这个文件仅在紧急情况下,当创建例如matlab突然终止之前储蓄。 加载这个文件将阻止你不得不再次单击图像。 

在自己的校准,当有大量的失真图像中,该计划可能无法自动计算网格中的格子的数量。 在这种情况下,广场的数量在X和Y方向必须手动输入。 这不应该发生在现在的例子。 

另一个问题可能出现在执行自己的校准。 如果透镜扭曲真的太严重(例如鱼眼镜头),基于一个简单的指导工具畸变系数 kc 可能不足以提供足够好的初始猜测角落的位置。
对于一些困难的情况下,脚本程序包括在工具箱,允许一个完全手册角落提取(即每个角落一个点击)。 该脚本文件 manual_corner_extraction.m (在内存中有效的模式,您应该使用 manual_corner_extraction_no_read.m 相反)和后应该执行传统的角落extaction代码(脚本依赖数据,计算了传统的角落里提取代码平方计算,网格大小,点,…
——即使角落本身被错误检测到)。 显然,这个角落里提取方法可能非常耗时,当应用于大量的图像。 因此建议使用它作为最后的手段,当一切已经失败了。 大多数用户应该永远不必担心这个,也不可能在这个礼物校准的例子。 

主要校准步骤: 

后 角落里提取,单击按钮 校准 的 相机校准工具 运行主相机校正
过程。 
校准是在两个步骤完成:首先初始化, 然后非线性优化。 
初始化步骤计算 封闭的解校准参数的基础 包括任何透镜畸变(项目名称: init_calib_param.m )。 
非线性优化步骤 最小化总reprojection错误(最小二乘意义上的) 所有校准参数(9自由度内在:焦, 主点、畸变系数和6 * 20自由度外在= > 129的参数)。 校准的完整描述 参数,点击它 链接 
的 优化是通过与显式迭代梯度下降法 (封闭)计算雅可比矩阵(项目名称: go_calib_optim.m )。 


 

校准参数存储在一个数量 变量。 他们的完整描述,访问这个 页面 
请注意 的偏度系数 alpha_c 和第六阶径向畸变系数(最后的条目 kc )没有(这估计
是默认模式)。 因此,x和y像素之间的角度 轴是90度。 在大多数实际情况下,这是一个非常好 假设。 但是,后来,引入偏差的一种方式 系数 alpha_c 在优化将。 

观察到只有11梯度下降迭代是必需的 以达到最小值。 这意味着只有11个评价的 reprojection函数+雅可比矩阵计算和反演。 的原因 的快速收敛的初始猜测的质量 参数计算的初始化过程。 
现在,忽略系统的建议,以减少失真模型。 reprojection错误仍太大做出判断模型的复杂性。 这主要是因为一些网格的角落没有非常精确提取的图像。 
点击 Reproject上图片 在 相机校准工具 
显示网格的reprojections到原始图像。 这些 预测计算基于当前的内在和外在 参数。 输入空字符串(只要按“输入”)的问题 数量(s)的图像(s)显示([]=所有图片) 来表示
你想显示所有图片:


 

下图显示了前四个图像(红色十字架)检测到角落和reprojected网格角落(圈)。 




 

reprojection错误也是彩色的形式跨越所示: 



为了退出错误分析工具,右键单击任何图(稍后您可以了解使用该选项)。 
点击 外在的展示 在 相机校准工具 
外在的参数(网格的相对位置对相机)然后一种3 d图所示: 



在这个图中,框架 (O c ,X c Y c ,Z c ) 
摄像机坐标系。 红色的金字塔对应 定义的有效视野的摄像机图像平面。 从“camera-centered”视图切换到“world-centered”视图,单击 切换到world-centered视图 位于角落的图左下角的按钮。 



在这个新的图,每个相机位置和姿态是由绿色金字塔。 另一个点击 切换到camera-centered视图 按钮将图回“camera-centered”情节。 

回顾错误情节,注意reprojection误差非常大的跨越 大量的数据。 原因是我们没有做 一个细心的工作,提取高度扭曲的角落 图像(一份更好的工作,也可以做预测 扭曲选项)。 不过,我们现在可以证明这句话是正确的 再计算图像角落自动对所有图像。 这是 方式是:按 Recomp。
角落 
按钮 在主 相机校准工具 并选择再一次
角落搜索窗口的大小 wintx = winty = 5 (默认值): 


 

这个问题 数量(s)的图像处理([]=(s) 图像) 按“输入”与一个空参数重新计算
角落里的所有图像。 输入的模式提取: 自动模式(汽车)使用re-projected网格作为初始猜测 角落里的位置,手动模式让用户提取 角落里手动提取(传统的角落 方法)。 在目前的情况下,reprojected网格点 非常接近实际的图像。 因此,我们选择 自动模式:按“输入”与一个空字符串。 的角落里 然后重新计算所有图像。 matlab窗口应该是什么样子 如: 


 

通过点击运行另一个校准的优化 校准 


 

观察到只有6个迭代是必要的 收敛,没有初始化(执行步骤 优化从以前的校准结果)。 这两个 值 0.12668 和 0.12604 的标准偏差
reprojection错误(像素)在x和y方向 分别。 观察到的不确定性也校准参数估计。 数值是大约三倍标准差。 
优化后,点击 保存 为了节省
校准结果(内在和外在)在matlab文件中 Calib_Results.mat 


 

校准参数的完整描述,点击 链接 。 
再一次,点击 Reproject上图片 reproject网格到原始校准图片。
一分之四的图像看起来像: 



点击 分析错误 查看新reprojection错误(观察错误比以前小得多): 



右键单击后误差图(退出误差分析工具),点击 外在的展示 显示新的3
d网格对相机的位置: 



一个简单的点击 切换到world-centered视图 按钮改变图: 



这个工具 分析错误 允许您检查的点对应于大错误。
点击 分析错误 并点击这里显示的图地区(右上角图角): 



_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________ 

3  双目摄像机标定(例五)

相机标定为Matlab工具箱
 



第五次校准 例子——校准立体系统,立体图像矫正和3 d立体三角

这个例子展示了如何使用工具箱用于校准一个立体系统(内在和外在)和使用立体标定的结果为立体图像校正和3 d立体三角测量。
 下载stereo_example.zip立体数据集,包含14对对应的左右图像。图片命名left01.jpg,…,left14.jpg和right01.jpg…,right14.jpg。这个包包含分别的两个校准结果文件Calib_Results_left和Calib_Results_right(使用第一个例子描述的标准程序校准后产生两个摄像头的校准结果)
 
在命令行窗口输入stereo_gui运行立体标定工具箱。如下图:



(把Calib_Results_left.mat和Calib_Results_right.mat两个文件放到你现在运行的文件夹下)
点击第一个按钮


命令行窗口提示如下:



输入你的两个校正结果的名字。
(最好之前先把你的两个文件改为这个默认的名字,这样此处可以直接按回车,两个文件都加载进来后,会显示两个文件的参数,如下图)



初始的内参数的值除了显示外参数的估计om和T,还描述左右相机的相对位置。内参数fc_leftcc_leftalpha_c_leftkc_leftfc_rightcc_rightalpha_c_right kc_right和传统的fc, cc, alpha_c and kc是等价的。在三维空间中一个点P的两个姿态参数om和T定义:它的两个在左、右参考坐标系的坐标向量XL和XR分别和彼此有关,尽管严格的运动转换: XR =
R * XL + T  R是3 x3的对应的旋转矢量om旋转矩阵。
 
单击按钮 Run stereo calibration运行全局立体优化程序
此处如果警告消息"Disabling view kk - Reason: the left and right images are found inconsistent" is encountered时,这可能意味着第kk对图像,左边和右边图像在空间中不同的位置被捕获。这意味着这两个视图是不一致的,因此不能用于立体校准。
 
捕获你的图像时,确保你没有在捕获左右图像时移动校正模式。空间中的模式可以(也应该)只在两组(左、右)图像间移动。
 
不一致的另一个原因是,你选择一组在模式上不同的点运行独立的校准(导致两个文件Calib_Results_lef)。确保在两个独立的校准中选择了相同的点。换句话说,点需要一致。
 
点击Save stereo calib results,保存立体标定的结果,如下:

<align="left">          点击Show Extrinsics of the stereo rig,以一种3D图的形式显示两个摄像头的空间配置和校准平面
 



最后,点击Rectify the calibration images通过校正来校准立体图像。所有图像left_rectified01.bmp, right_rectified01.bmp,...,left_rectified14.bmp,right_rectified14.bmp都被校准(外极线与水平扫描线匹配)。除生成这些校正图片之外,脚本还保存新设置的校准参数到Calib_Results_stereo_rectified.mat。



 
因为提供了原始的图像,这两个初始的独立的校准可以得到Calib_Results_left.mat和Calib_Results_right.mat。通过角点提取的过程,需要牢记的是,对于每对图像,必须选择相同的一组左、右图像的点,即相同的网格点和相同的原点(为了保证相同的模式参考系)。因此,确保相同的起源点(第一次点击)一直被选中是至关重要的。一个简单的方法是总选择网格的左上角为原点(这样做是为了生成两个提供的校准文件)。在您自己的立体标定中,可以使用不同的策略,如标志的起源点在网格模式本身。

校准超过2相机怎么样?

如果你有兴趣校准联合一组N相机N大于2,你可能会感兴趣 的 多幅相机自校准的工具箱 分布式的 托马斯Svoboda 从 机器感知中心 的 捷克技术大学 
这是一个非常漂亮的和直观的Matlab工具箱,包括我们的相机标定工具箱。 
stereo_gui
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息