原理简述:

三维世界中的点的位置与其对应的二维投影,遵从以下公式:

 
其中, 
M表示三维世界中的点; 
[R|T]表示欧氏变换,是一个3*4矩阵 
A表示相机参数矩阵,存放相机内部参数 
P表示M在二维空间的投影,是一个二维点(文献1)

相机成像投影图如下所示(文献2):

摄像机标定的过程就是找到相机内参,即:矩阵A

A通常为:

|afsx|

A=|0fy|

|001|

图像平面和照相机中心间的距离为焦距f。当像素数组在传感器上偏斜的时候,需要用到倾斜参数s。在大多数情况下,s可以设置为0。于是上式可变为:

|af 0x|

A= |0 fy|

|0 01|

纵横比例参数a是在像素元素非正方形的情况下使用的。通常情况下,其为1。于是上式可变为:

|f 0x|

A= |0 fy|

|0 01|

除焦距f外,标定矩阵中剩余的唯一参数为光心(有时称为主点)的坐标c=[x y],也就是光线坐标轴和图像平面的交点。因为光心通常在图像的中心,

并且图像的坐标是从左上角开始计算的,所以光心的坐标常常接近于图像宽度和高度的一半,即x=图像宽度/2,y=图像高度/2。

重要的事情说三遍,照相机标定的唯一未知变量是焦距f。


标定步骤:

使用OpenCV进行摄像机标定,在OpenCV例程中有现成的例程程序可以实现, 
/samples/cpp/tutorial_code/calib3d/camera_calibration里的程序就可以进行单目相机标定。

因为例程代码无需修改即可使用,因此,对于该例程的代码分析,在此不展开讨论,有兴趣的可以到文献[3]中查看,该博客
较详细介绍了其中函数。
在此只简单介绍下若要调用该例程生成标定矩阵,所需要做的最小工作量。
一:
准备棋盘格图标并打印,用准备标定的摄像机从不同角度拍摄10-15幅图片。
二:
在VID.xml中添加拍摄图片的路径,用于程序执行时读入图片,建议在程序当前目录下创建一个文件夹放拍摄图片,且在VID.xml中
输入路径时可用相对路径,而不是绝对路径,即便将标定程序工程拷贝到其它路径下,程序无需修改即可运行。如果图片用相对路径,
则将标定程序拷贝到其它路径下,需要修改图片的路径。如果图片路径输入有误,执行程序会出错,在本人计算机上运行错误如下:
Near the sample file you'll find the configuration file, which has detailed help of how to edit it.  It may be any OpenCV supported file format XML/YAML.
OpenCV Error: Assertion failed (src.size == dst.size && src.channels() == dst.channels()) in cvConvertScale, file /home/djt/software/opencv-3.0.0/modules/core/src/convert.cpp, line 6213
terminate called after throwing an instance of 'cv::Exception'what():  /home/djt/software/opencv-3.0.0/modules/core/src/convert.cpp:6213: error: (-215) src.size == dst.size && src.channels() == dst.channels() in function cvConvertScale

三:
程序开始会读入配置文件in_VID5.xml,该文件对棋盘格的角点数(由你使用的棋盘格决定),即在水平(BoardSize_Width)和垂直方向(BoardSize_Height)方向各有几个角点,如我用的是7*7的棋盘格,相应参数需修改为7,如果该参数设置与你使用棋盘格图片不一致会出错,错误如下:
Near the sample file you'll find the configuration file, which has detailed help of how to edit it.  It may be any OpenCV supported file format XML/YAML.
OpenCV Error: Assertion failed (src.size == dst.size && src.channels() == dst.channels()) in cvConvertScale, file /home/djt/software/opencv-3.0.0/modules/core/src/convert.cpp, line 6213
terminate called after throwing an instance of 'cv::Exception'what():  /home/djt/software/opencv-3.0.0/modules/core/src/convert.cpp:6213: error: (-215) src.size == dst.size && src.channels() == dst.channels() in function cvConvertScale

四:

配置文件in_VID5.xml还定义了矩阵输出文件"out_camera_data.xml“,当校正完成后,校正矩阵参数就保存到该文件中,对于.xml的读写,opencv中有专门的类进行操作,即
FileStorage类,具体用法自行百度。在校正程序中对校正矩阵的定义为Mat cameraMatrix = Mat::eye(3, 3, CV_64F);其取用方法为cameraMatrix.at<double>(0,0) = 1.0; 

重点来了

在之后的程序中(如增强现实中)要是调用该矩阵,一定要将FileStorage类读入数据的校正矩阵定义为Mat cameraMatrix = Mat::eye(3, 3, CV_64F);且取用时用

cameraMatrix.at<double>(0,0) = 1.0; 而不能用cameraMatrix.at<float>(0,0) = 1.0;也不能用Mat_<float>  camMatrix; camMatrix = Mat::eye(3, 3, CV_64F);否则

会因数据类型不符而导致后续程序计算错误,但却不报错。但可以通过先读到Mat cameraMatrix = Mat::eye(3, 3, CV_64F);定义变量中再逐个赋值给

Mat_<float>  camMatrix1;定义矩阵。但赋值时,camMatrix1(i,j)=cameraMatrix.at<double>(i,j); double类型一定不要写错。

程序已上传到http://download.csdn.net/detail/daijuting/9467510需要的请下载。

参考资料:

主要参考以下博客,其链接如下:

[1]:http://blog.csdn.net/chuhang_zhqr/article/details/50036443

[2]:http://blog.csdn.net/chuhang_zhqr/article/details/49894477

[3]:http://blog.csdn.net/chuhang_zhqr/article/details/49999143

以及计算机视觉的两本书(以上几篇博客也主要是参考文献5):

[4]:Python计算机视觉编程 第四章

[5]:深入理解OpenCV实用计算机视觉项目解析 第二章

因为用到程序主要是opencv的一个例程,其中用到的两个官方文档如下

opencv document:

http://docs.opencv.org/2.4/doc/tutorials/calib3d/camera_calibration/camera_calibration.html

http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

基于opencv的摄像机标定相关推荐

  1. 用OpenCV进行摄像机标定

    用OpenCV进行摄像机标定 照相机已经存在很长时间了.然而,随着廉价针孔相机在20世纪末的引入,日常生活中变得司空见惯.不幸的是,这种廉价伴随着它的代价:显著的扭曲.幸运的是,这些常数,通过校准和一 ...

  2. Python+OpenCV:摄像机标定(Camera Calibration)

    Python+OpenCV:摄像机标定(Camera Calibration) 理论 Some pinhole cameras introduce significant distortion to ...

  3. 【OpenCV】摄像机标定+畸变校正

    摄像机标定 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行校正后的显示. 首先关于校正的基本知识通过OpenCV官网的介绍即可简单了解: http://docs.opencv ...

  4. [OpenCV-Python] OpenCV 中摄像机标定和 3D 重构 部分 VII

    部分 VII 摄像机标定和 3D 重构 OpenCV-Python 中文教程(搬运)目录 42 摄像机标定 目标 • 学习摄像机畸变以及摄像机的内部参数和外部参数 • 学习找到这些参数,对畸变图像进行 ...

  5. OpenCV-Python] OpenCV 中摄像机标定和 3D 重构 部分 VII

    https://www.cnblogs.com/Undo-self-blog/p/8448500.html 42 摄像机标定 目标 • 学习摄像机畸变以及摄像机的内部参数和外部参数 • 学习找到这些参 ...

  6. 基于OpenCV进行相机标定

    相机已经存在了很长一段时间. 随着二十世纪末廉价针孔相机的推出,相机已经在日常生活中普及.虽然价格便宜,但是成像存在严重的畸变.不过,这些畸变是固定的形式,基于标定和重映技术可以纠正畸变.此外,基于标 ...

  7. 基于OPENCV的投影仪标定(源码)

    opencv3.0的源码,之前很苦恼投影仪的标定,opencv提供了一个demo,上传源码: #include <opencv2/highgui.hpp> #include #includ ...

  8. 三维重建 - 摄像机标定和立体匹配中极线约束方法

    摘自http://www.ahcit.com/lanmuyd.asp?id=2677,以作备录,若有版本问题,请告知. 关于摄像机标定和立体匹配中极线约束方法方面,描述的比较清楚. 一种基于OpenC ...

  9. 一种基于OpenCV的三维重建实现方案

    一种基于OpenCV的三维重建实现方案 来源:淘金者论文范文 作者:Www.TaoJz.Com 日期:08/30/09 摘 要 本文以计算机视觉三维重建技术为研究对象,分析了开放计算机视觉函数库Ope ...

最新文章

  1. oracle 工单查so,查询工单列表
  2. hdu 2111 Saving HDU (DP)
  3. 公众号一年能有多少收入?
  4. Linux下通过命令设置系统时间
  5. php函数声明提前,php的日期处理函数及uchome的function_coomon中日期处理函数的研究...
  6. vue过滤器微信小程序过滤器和百度智能小程序过滤器
  7. python12_Python 12 基础知识
  8. dll和so文件区别与构成
  9. Microsemi Libero使用技巧3——使用FlashPro单独下载程序
  10. [异步图书].Python机器学习:预测分析核心算法.pdf
  11. max30102c语言,max30102参考测试程序 网上找的max30102测试程序 - 下载 - 搜珍网
  12. 每次遇到浏览器主页被篡改的问题,就特别气愤加头疼
  13. c语言 节日,农历阳历之间转换和节气节日查询C语言编程
  14. Chrome书签同步方法
  15. Git创建本地仓库执行git init时报Permission denied的问题
  16. 《Modelica教程》by Fritzson 导言部分
  17. (数据科学学习手札58)在R中处理有缺失值数据的高级方法
  18. FA固定资产录入时的细节:是否输入累计折旧
  19. 又现信息泄露事 融云通讯安全守护之道
  20. Hadoop3.2.1 【 YARN 】源码分析 : NodeStatusUpdaterImpl概述

热门文章

  1. vue 管理后台 使用虚拟键盘组件 支持中英文切换
  2. 计算机毕业设计Java高校教学资源共享平台(源码+系统+mysql数据库+lw文档)
  3. FastDDS的服务器记录-译-
  4. jquery 瀑布流实例最流行瀑布流图片展示
  5. html 课件DW,DW《网页设计与制作》教学课件.ppt
  6. Js实现中国公民身份证号码有效性验证
  7. C 强制类型转换 char转int的小陷阱
  8. python为什么要创建央视对象_案例研究:使用python获取中央电视台的节目单
  9. [Graphics] 法线图生成器(Normal map generator)
  10. 组原学习笔记五:计算机的运算方法