一、相机标定的目的

确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数。

二、通用摄像机模型

世界坐标系、摄像机坐标系和像平面坐标系都不重合。同时考虑两个因素 :

(1)摄像机镜头的畸变误差,像平面上的成像位置与线性变换公式计算的透视变换投影结果有偏差;

(2)计算机中图像坐标单位是存储器中离散像素的个数,所以像平面上的连续坐标还需取整转换。

摄像机参数

l  摄像机内部参数 (Intrinsic Parameters)

摄像机坐标和理想坐标系之间的关系

图像坐标系、摄像机坐标系

The list of internal parameters:

  • Focal length(焦距): The focal length in pixels is stored in the 2x1 vector fc.
  • Principal point(主点): The principal point coordinates are stored in the 2x1 vector cc.
  • Skew coefficient(偏斜系数): The skew coefficient defining the angle between the x and y pixel axes is stored in the scalar alpha_c.
  • Distortions(畸变): The image distortion coefficients (radial and tangential distortions) are stored in the 5x1 vector kc.

l  摄像机外部参数 (Extrinsic Parameters)

摄像机在世界坐标系里的位置和方向

摄像机坐标系、世界坐标系

主要包括:旋转矩阵 R 的9个参数和平移矩阵的3个参数。或定义为 6 个。主要包括: 旋转矩阵的3个偏转角和平移矩阵的3个参数。

简而言之:

三、摄像机原理

摄像机坐标系的原点位于摄像机的镜头中心,像平面坐标中心位于光轴上,由小孔成像模型, 为焦距。从客观场景到数字图像的成像变换由 以下4步组成 :

四、摄像机标定方法分类

l  传统摄像机标定方法

l  主动视觉摄像机标定方法

l  摄像机自标定方法

标定方法

特点

优点

不足

传统摄像机标定方法

利用已知的景物结构信息。常用到标定块。

可以使用于任意的摄像机模型,标定精度高

标定过程复杂,需要高精度的已知结构信息。

主动视觉摄像机标定方法

已知摄像机的某些运动信息

通常可以线性求解,鲁棒性比较高

不能使用于摄像机运动未知和无法控制的场合

摄像机自标定方法

仅依靠多幅图像之间的对应关系进行标定

仅需要建立图像之间的对应,灵活性强

非线性标定,鲁棒性不高

四、张正友平面标定方法

算法原理

•      在这里假定模板平面在世界坐标系 的平面上

•       其中,为摄像机的内参数矩阵,为模板平面上点的齐次坐标,为模板平面上点投影到图象平面上对应点的齐次坐标,分别是摄像机坐标系相对于世界坐标系的旋转矩阵和平移向量

      

根据旋转矩阵的性质,即 ,每幅图象可以获得以下两个对内参数矩阵的基本约束

由于摄像机有5个未知内参数,所以当所摄取得的图象数目大于等于3时,就可以线性唯一求解出

算法描述

  1. 打印一张模板并贴在一个平面上
  2. 从不同角度拍摄若干张模板图象
  3. 检测出图象中的特征点
  4. 求出摄像机的内参数和外参数
  5. 求出畸变系数
  6. 优化求精

五.使用Matlab相机标定工具箱标定相机的基本步骤

1.安装MATLAB

本机安装的是MATLABR2014a

2.安装相机标定工具箱Camera Calibration Toolbox

虽然Matlab2014a已经自带了Camera Calibrator应用,基本上添加图片后,随便设置一下就能自动完成标定,因为很多以前老的论文做的实验都是基于单独的老版本的标定工具箱,所以这里还是使用老版本的工具箱来进行相机标定
将解压后的文件夹TOOLBOX_calib(文件夹可以重命名)添加到MATLAB搜索路径(可以把加压后的文件夹放在Matlab安装目录下的toolbox目录下)
工具包下载及介绍和示例教程:http://www.vision.caltech.edu/bouguetj/calib_doc/index.html

2.准备一张标定板

Doing your own calibration

上述相机标定工具箱官网教程中提供了标定板图片下载地址(下载结果见pattern.pdf)
一般来说,标定板越大越好,且尽量保证表面是平的

3、实验数据采集

将标定板摆在相机可视的范围内,每拍一张照片,标定板换一个位置和朝向,将拍摄的照片文件名命名为imgnameX.jpg的格式,前面的imgname可以自己命名,X为图片索引,可以从1开始,如imgname1.jpg,图片格式也可以使用其他格式。如bmp,tif

3、相机标定步骤

相机标定参考教程:

First calibration example - Corner extraction, calibration, additional tools

中文翻译版可以参考:http://blog.csdn.net/jkhere/article/details/8784865
3.1.启动相机标定工具箱
在Matlab命令行宽口输入calib启动相机标定工具箱
当图像量大且多时需要使用第二种方式;此处15到20张照片可以选择标准模式
 3.2 载入图片
进入图像所在目录,然后点击Image names按钮
输入标定图像序列的名称前缀(不包含数字序号)如上方式,然后输入图片格式

3.3.提取角点
在标定工具箱上点击Extract grid cornder按钮

输入需要处理的图片数目,默认回车为刚才导入的全部图片
再选择默认的corner finder窗口大小(就是十字光标),wintx=winy=5,比较合适
角落提取引擎含有自动计算方块个数的系统。这个引擎特别适合多图像的情况。避免了在X方向和Y方向手动输入方块个数的麻烦,默认使用自动方块检测机制。

然后在对每一幅测试图进行手动设置最外围的四个角点,第一个点会作为原点,一般位于左上角,其他三个点选择顺序不重要,不过还是建议按顺时针选取(为标定方便,我们未将最外层的方格包括在内)

接下来需要设定每个小方格在现实世界中的宽高,以便随后角点的自动选择;实验过程中设定为30mm×30mm;只需第一次设定

程序会自动计算方块的数量和角点(X方向和Y方向),并且显示出来。接下来看Matlab命令行的提示,如果预测的角点接近真实图片上的角点,不需要通过键入径向畸变系数(radial distortion coefficient)来“帮助”软件。(这里为简化流程就不考虑畸变系数了,如果需要处理畸变系数可以参考原文)按下“回车键”,角点自动被提取出来。

 
角点被自动提取出来,并显示在figure 3上(围着角点的蓝色方块显示了角点的边界)。
对剩下的每一幅图像都进行上述角点提取操作,(第一次标定必须很麻烦的一幅一幅的操作,若已经做过一次,可点击load选项,会自动载入Calib_Results.mat中的角点信息,这个信息在第一次标定时会生成,后面会讲到)

3.4实施标定
完成角点提取后,点击校正工具箱上的Calibration按钮来运行主要校正步骤。
初始化步骤计算校正参数的封闭解,不包括任何镜头失真(程序名称:init_calib_param.m)。非线性最优化步骤使所有参数的二次投影误差最小(9个内部自由度(DOF):焦点,投影中心,失真系数,和6X20个外部自由度,一共129个参数)

说明

A. 通过Recomp. corners按钮提高标定精确度;

B. Analyse error展示角点误差分布,用鼠标左键点击后,在命令窗口可直接显示该点信息;

C.点击Reproject on images按钮用计算出来的参数投影到图像。这些投影是基于当前的内部参数和外部参数。二次投影误差同样显示如下:

D:点击工具箱上的Show Extrinsic。外部参数(网格对于摄像机的相对坐标,即摄像机坐标系)将显示出来:
回头看一下误差图表,发现有一些二次误差很大。原因是我们没有在一些失真较大的图像上仔细提取角点(一个较好的工作是用预测失真选项)。无论如何,我们可以自动重新计算所有图像角点。方法是:点击Recomp.corners按钮,选择新的角点检测大小,wintx=winty=5,再点击Calibration按钮运行一次。
3.5保存标定结果
最优化完成后,点击Save按钮来保存校正的结果,结果保存在Calib_results.mat,得到的相机参数存储在Calib.Results.m文件中

转自:http://www.cnblogs.com/star91/p/6012425.html

二、采用opencv的方法

1.OpenCV Camera Calibration

OpenCV提供具体的标定策略和说明文档,可以直接使用,说明文档的位置"D:\opencv\sources\doc\tutorials\calib3d\camera_calibration";

例程的位置“D:\opencv\sources\samples\cpp\camera_calibration.cpp”

如何使用例程呢?首先修改配置文档xml

[html] view plaincopy
  1. <?xml version="1.0"?>
  2. <opencv_storage>
  3. <Settings>
  4. <!-- 标定板的宽高各有多少角点Number of inner corners per a item row and column. (square, circle) -->
  5. <BoardSize_Width>7</BoardSize_Width>
  6. <BoardSize_Height>7</BoardSize_Height>
  7. <!--标定板上的方块边长,以毫米为单位 The size of a square in some user defined metric system (pixel, millimeter)-->
  8. <Square_Size>50</Square_Size>
  9. <!-- 选择标定模式The type of input used for camera calibration. One of: CHESSBOARD CIRCLES_GRID ASYMMETRIC_CIRCLES_GRID -->
  10. <Calibrate_Pattern>"CHESSBOARD"</Calibrate_Pattern>
  11. <!-- The input to use for calibration. 所采集的标定图像存储的路径及名称xml档
  12. To use an input camera -> give the ID of the camera, like "1"
  13. To use an input video  -> give the path of the input video, like "/tmp/x.avi"
  14. To use an image list   -> give the path to the XML or YAML file containing the list of the images, like "/tmp/circles_list.xml"
  15. -->
  16. <Input>"./vtDirTest.xml"</Input>
  17. <!--  If true (non-zero) we flip the input images around the horizontal axis.-->
  18. <Input_FlipAroundHorizontalAxis>0</Input_FlipAroundHorizontalAxis>
  19. <!-- Time delay between frames in case of camera. -->
  20. <Input_Delay>100</Input_Delay>
  21. <!-- How many frames to use, for calibration. -->
  22. <Calibrate_NrOfFrameToUse>25</Calibrate_NrOfFrameToUse>
  23. <!-- Consider only fy as a free parameter, the ratio fx/fy stays the same as in the input cameraMatrix.
  24. Use or not setting. 0 - False Non-Zero - True-->
  25. <Calibrate_FixAspectRatio> 1 </Calibrate_FixAspectRatio>
  26. <!-- If true (non-zero) tangential distortion coefficients  are set to zeros and stay zero.-->
  27. <Calibrate_AssumeZeroTangentialDistortion>1</Calibrate_AssumeZeroTangentialDistortion>
  28. <!-- If true (non-zero) the principal point is not changed during the global optimization.-->
  29. <Calibrate_FixPrincipalPointAtTheCenter> 1 </Calibrate_FixPrincipalPointAtTheCenter>
  30. <!-- 输出标定后的内参/外参以及其他参数的文档名称路径The name of the output log file. -->
  31. <Write_outputFileName>"out_camera_vt.xml"</Write_outputFileName>
  32. <!-- If true (non-zero) we write to the output file the feature points.-->
  33. <Write_DetectedFeaturePoints>1</Write_DetectedFeaturePoints>
  34. <!-- If true (non-zero) we write to the output file the extrinsic camera parameters.-->
  35. <Write_extrinsicParameters>1</Write_extrinsicParameters>
  36. <!-- If true (non-zero) we show after calibration the undistorted images.-->
  37. <Show_UndistortedImage>1</Show_UndistortedImage>
  38. </Settings>
  39. </opencv_storage>

大概修改上述标注的几个位置,然后运行camera_calibration.cpp即可;

运行时间比较长,耐心等待图片的显示,"out_camera_vt.xml"文件的输出表明程序执行完成。

工程下载地址

参考【1】 【2】

转自:http://blog.csdn.net/felix86/article/details/38401447

相机标定的理解及采用opencv和matlab工具箱的标定方法相关推荐

  1. matlab相机标定工具箱进行相机标定,相机标定的理解及采用opencv和matlab工具箱的标定方法...

    一.相机标定的目的 确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数. 二.通用摄像机模型 世界坐标系.摄像机坐标系和像平面 ...

  2. 相机标定+鸟瞰图生成(VS2017+OpenCV)

    一.要求: 1.用自己的手机采集棋盘板定标数据: 2.实现或调用 角点检测.局部特征提取.局部特征匹配算法,标定自己手机的内参: 3.改变外参,生成不同视角的新图像. 二.实验过程: 1.实验前准备: ...

  3. 内参、外参、畸变参数三种参数与相机的标定方法与相机坐标系的理解

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangdashi888/article/details/51356385 1. 相机参数是三种不同的 ...

  4. 经典手眼标定算法之Navy的OpenCV实现

    经典手眼标定算法之Navy的OpenCV实现 在我的上一篇博客中已经介绍了Tsai的手眼标定算法,下面主要介绍Frank C. Park and Bryan J. Martin在文献Robot sen ...

  5. 鱼眼摄像头标定与畸变校正(OPENCV版)

    转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://github.com/WordZzzz/fisheye_calibration 软件版本 ...

  6. 双目立体视觉源代码 双目立体视觉匹配程序 双目视觉3d成像(三维重构图像处理) 基于双目视觉的深度计算和三维重建 opencv写的双目视觉摄像机标定和三维重建代码

    双目视觉/双目标定源码/图片集标定匹配三维重建坐标计算OpenCV 1.双目立体视觉源代码(包括标定,匹配,三维重建) 2.双目视觉实验图片集(双目立体视觉中使用的标准实验图,适合初学者进 行实验使用 ...

  7. opencv读取MATLAB双目标定的结果进行双目校正

    概述: opencv内部也有双目标定的函数,但是结果有时候会飘,所以想先用MATLAB标定工具箱试试看.使用MATLAB先队两个相机进行单目标定,然后进行双目标定,将结果保存在xml文件中.xml文件 ...

  8. 采用OpenCV和深度学习的钢印识别

    采用OpenCV和深度学习的钢印识别 [这个帖子标题党了很久,大概9月初立贴,本来以为比较好做,后来有事情耽搁了,直到现在才有了一些拿得出手的东西.肯定不会太监的.好,转入正题:] 原始需求: 系统将 ...

  9. 自动驾驶之车位线检测之二单路鱼眼相机矫正裁剪(python ,C++,opencv)

    前篇博文https://blog.csdn.net/xiao__run/article/details/89190112涉及到了使用四路鱼眼图像拼接并识别车位线,这个过程涉及到鱼眼图像的标定,矫正以及 ...

最新文章

  1. 完成端口模式下的高性能网络服务器【转】
  2. 学科实践活动感悟50字_课改实践提素养 示范引领促教研 ——复兴镇小学语文课堂教学改革“五环四让”教学模式 研讨成果展示活动...
  3. 云考古 | Azure 自建 RDS 让 iPad 跑 Office 97
  4. Insider Dev Tour 2019 全球巡演 苏州站
  5. 数据可视化图表,你选对了吗?
  6. Windows环境配置Apache+Mysql+PHP
  7. Mr.J--JavaScript-恶搞小代码
  8. 【英语学习】【WOTD】 putsch 释义/词源/示例
  9. moto txt阅读器java版,moto txt阅读器手机版下载
  10. scala函数进阶篇
  11. 国内外sns源码搜集
  12. 当前的安全设置不允许从该位置下载文件--解决方法
  13. 弱口令总结(什么是弱口令)
  14. 禁止网页 切屏 切换标签
  15. 程序 多核优化 linux,linux 多核CPU性能调优
  16. hive表分区上传数据出现的一个问题及解决思路
  17. clone别人远程仓库的代码,运行npm install报错npm ERR! Maximum call stack size exceeded
  18. 从比尔盖茨嫁女看商战真经
  19. 《数据结构与抽象:Java语言描述(原书第4版)》一2.1.7 删除项的方法
  20. 无限度修正的随机块模型(2014)

热门文章

  1. C#(Winform)+H5(Html)微信/支付宝对接接口及前端支付页面
  2. 夜光带你走进通信网络(九) 新的领域
  3. shrio 多次掉登陆没有cookies_速度直线上升!育碧游戏下载没有速度怎么办?这2种方法帮你完美解决!...
  4. 单词APP的工作历程复盘
  5. vbs关不掉的计算机窗口,vbs怎么关闭_vbs整人代码-关不掉的窗口
  6. python educoder 第3关:列表基本操作
  7. 蓝牙定位--多点质心定位
  8. 用python做一张带背景的二维码
  9. Java实现图片转换PDF文件
  10. matlab等于本身是什么命令,matlab中的m=size是什么意思