您的位置:首页 > 编程语言 > MATLAB

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

2017-05-15 14:30 447 查看

一、相机标定的目的

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

二、通用摄像机模型



 

 

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

(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时,就可以线性唯一求解出


算法描述

 

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

 

五.使用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
plain copy

 





<?xml version="1.0"?>  

<opencv_storage>  

<Settings>  

  <!-- 标定板的宽高各有多少角点Number of inner corners per a item row and column. (square, circle) -->  

  <BoardSize_Width>7</BoardSize_Width>  

  <BoardSize_Height>7</BoardSize_Height>  

    

  <!--标定板上的方块边长,以毫米为单位 The size of a square in some user defined metric system (pixel, millimeter)-->  

  <Square_Size>50</Square_Size>  

    

  <!-- 选择标定模式The type of input used for camera calibration. One of: CHESSBOARD CIRCLES_GRID ASYMMETRIC_CIRCLES_GRID -->  

  <Calibrate_Pattern>"CHESSBOARD"</Calibrate_Pattern>  

    

  <!-- The input to use for calibration. 所采集的标定图像存储的路径及名称xml档  

        To use an input camera -> give the ID of the camera, like "1"  

        To use an input video  -> give the path of the input video, like "/tmp/x.avi"  

        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"  

        -->  

  <Input>"./vtDirTest.xml"</Input>  

  <!--  If true (non-zero) we flip the input images around the horizontal axis.-->  

  <Input_FlipAroundHorizontalAxis>0</Input_FlipAroundHorizontalAxis>  

    

  <!-- Time delay between frames in case of camera. -->  

  <Input_Delay>100</Input_Delay>      

    

  <!-- How many frames to use, for calibration. -->  

  <Calibrate_NrOfFrameToUse>25</Calibrate_NrOfFrameToUse>  

  <!-- Consider only fy as a free parameter, the ratio fx/fy stays the same as in the input cameraMatrix.   

       Use or not setting. 0 - False Non-Zero - True-->  

  <Calibrate_FixAspectRatio> 1 </Calibrate_FixAspectRatio>  

  <!-- If true (non-zero) tangential distortion coefficients  are set to zeros and stay zero.-->  

  <Calibrate_AssumeZeroTangentialDistortion>1</Calibrate_AssumeZeroTangentialDistortion>  

  <!-- If true (non-zero) the principal point is not changed during the global optimization.-->  

  <Calibrate_FixPrincipalPointAtTheCenter> 1 </Calibrate_FixPrincipalPointAtTheCenter>  

    

  <!-- 输出标定后的内参/外参以及其他参数的文档名称路径The name of the output log file. -->  

  <Write_outputFileName>"out_camera_vt.xml"</Write_outputFileName>  

  <!-- If true (non-zero) we write to the output file the feature points.-->  

  <Write_DetectedFeaturePoints>1</Write_DetectedFeaturePoints>  

  <!-- If true (non-zero) we write to the output file the extrinsic camera parameters.-->  

  <Write_extrinsicParameters>1</Write_extrinsicParameters>  

  <!-- If true (non-zero) we show after calibration the undistorted images.-->  

  <Show_UndistortedImage>1</Show_UndistortedImage>  

   

</Settings>  

</opencv_storage>  

大概修改上述标注的几个位置,然后运行camera_calibration.cpp即可;
运行时间比较长,耐心等待图片的显示,"out_camera_vt.xml"文件的输出表明程序执行完成。

工程下载地址

参考【1】 【2】

转自:http://blog.csdn.net/felix86/article/details/38401447
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: