摄像机标定其本质就是计算摄像机的内参和外参。关于标定板上的世界坐标对应到图像像素坐标的过程这里就不做推导,网上太多博客都有详细推导过程。本篇主要说明摄像机标定原理里的几个要点:

1. 外参矩阵所含旋转向量个数

从世界坐标系到摄像机坐标系的坐标变换其实就是刚体变换,三维坐标系的刚体变换,旋转向量一般用3个向量表示,我们在使用平面标定板标定时,为何只使用两个旋转向量呢?因为使用的标定板是个平面,标定板上的角点坐标均在三维坐标系中的一个平面上,为计算方便性,将标定板平面作为XOY平面,直接令Z=0,构成的三维世界坐标系。

我们设二维像素坐标以及对应的齐次坐标表示如下:

像素坐标的两种表示方式

设三维世界坐标以及对应的其次坐标表示如下:

世界坐标的两种表示方式

我们假设摄像机内参用矩阵A表示,外参矩阵用表示,那么从世界坐标到像素坐标的转换形式如下:

因为使用标定板平面上的坐标系,我们可以视为其上面棋盘格角点的世界坐标的Z全部为0,此时上面的等式简化为:

由此可以看出,平面的棋盘格标定所对应的相机外参,只需要两个旋转向量和一个平移向量,就可以建立与该点在像素坐标系对应像素点的等式。这里想说明的是即使棋盘格上的角点在世界坐标系上的Z坐标为0,但是通过世界坐标系转换到摄像机坐标系,这些点在摄像机坐标系上的Z坐标并非为0。当然,如果手头上有一个并非平面的标定体,但是知道每个标定体上的每个标记的三维坐标,那么同样可以进行标定,只不过此时的旋转向量个数就是3.

2. 比例因子s

根据相机模型进行推导,我们发现推导后的公式里含有一个比例因子s,世界坐标系上的坐标点转换到相机坐标系上,每个点在相机坐标系上都有一个坐标位置,坐标的z值对应的就是比例因子s,一般情况,每个点对应的比例因子s是不等的。我们知道对于一条直线且经过投影中心,那么这条直线上所有点在相机CCD上的投影点都是同一个,但是他们的比例因子s是不同的,因为他们在相机坐标系上的Z值是不同的。所以说,根据图像上的像素点,我们并不能确定该像素点所对应的世界坐标位置,但是我们可以确定该点在世界坐标系上的某一条直线上。

3. 旋转向量的正交性

首先讲解下三维旋转最简单情形,绕坐标轴进行旋转,如图所示:

当沿着某坐标轴正半轴观察原点时,绕坐标轴正向旋转方向是逆时针方向

很容易得到绕Z轴的二维旋转推广到三维:

同理可得到绕X轴旋转公式:

绕Y轴旋转公式:

对于一般情形,对象绕与每个坐标轴均不平行的轴进行旋转,此时,需要进行进行以下步骤:

【1】平移对象,使得旋转轴通过坐标原点;

【2】旋转对象使得旋转轴与某一坐标轴重合;

【3】绕坐标轴完成指定的旋转;

【4】利用逆旋转使旋转轴回到其原始方向;

【5】利用逆平移使旋转轴回到其原始位置;

下面以一个例子说明,将旋转轴变换到Z轴:

假设,两点确定旋转轴,如果沿着P2到P1的轴进行观察,并且旋转的方向为逆时针方向,则旋转轴向量可以定义为:

沿旋转轴的单位向量为:

其中a、b、c分别是旋转轴的方向余弦:

如下图所示,我们需要将旋转轴u旋转到z轴上

先做平移,将P1移至原点;第二步,将u旋转到xz平面上;第三步,绕y轴旋转到z轴上

其中第二步,将u旋转到xz平面上,需要计算alpha,u在yz平面上的投影为,那么,

其中

得到,所以u到xz平面上的旋转矩阵为:

下一步计算绕y轴的旋转矩阵

旋转角beta为:

又因为:,得到

所以得到绕y轴的旋转矩阵为:

将旋转轴对齐到Z轴的正方向后,在给定的旋转角theta可以用于关于z轴的旋转:

因此对于任意轴的旋转可以表示为:

得到复合旋转矩阵一种更快但不直观的方法是,利用任意三维旋转的复合旋转矩阵形式:

该矩阵上面的3×3子矩阵是正交的。这意味着该子矩阵的行或列形成了由矩阵R分别绕x、y、z轴旋转的正交单位向量组:

因此,可以考虑由旋转轴定义的局部坐标系,建立以局部坐标向量为列的矩阵。假设旋转轴不平行于任何坐标轴,则可以建立下列局部单位向量组:

即:

我们来计算下复合矩阵

由此可见上述的复合矩阵与矩阵R是相等的,并且观察上面3×3的子矩阵,无论行向量或列向量,他们都是正交的,可以发现旋转矩阵具有正交性特征。以上是通过一个具体例子来说明旋转矩阵正交性的特点,便于理解。

4.标定原理简介

每幅棋盘格图像上至少有4个角点,那么根据像素坐标系上的对应点坐标和标定板平面上角点对应点的世界坐标,每幅图我们都可以计算出单应性矩阵,根据旋转向量的正交性特征,我们可以列出相应等式,利用多幅图像进而可以列出更多等式,可以求解相机的内参,内参求解后,那么我们可以计算出每幅图所对应的相机外参。至此,似乎觉得摄像机标定已经完成,如果此时打完收工,那只是在理想情况下的摄像机标定,因为摄像机还存在镜头畸变现象,这里需要考虑这种情况。但是在理想情况下所解出来的内参和外参是有用的,这个解可以作为非线性优化算法的初解,因为对于非线性优化算法,一般都需要初解,初解离准确解越近,越容易找到最终的准确解而且优化效率也会更高。所以如果考虑畸变情形,我们仍需要计算出镜头畸变参数的初解,那么镜头畸变参数的初解该如何计算呢,请看下面的畸变校正。

5.畸变校正

只是觉得模拟出畸变模型的人很厉害,我们进行畸变校正,也只是利用已有的模型求解模型参数而已。畸变模型很多,这里我们只对径向畸变进行处理。

假设为点在无畸变情形下的像素坐标系中的坐标,为实际观察到的像素坐标(存在畸变)。相似,令表示点在无畸变情形下在图像坐标系中的坐标,为实际观察到的坐标(存在畸变),对于径向畸变模型而言,图像坐标系上的实际坐标与理想坐标存在关系如下:

根据摄像机模型我们知道像素坐标点与图像坐标系上点之间的关系:

其中alpha和beta均为相机内参。那么,我们可以推导如下:

整理的,

大家或许会存在疑问,如何确定上述等式中除去未知数K1和K2外其他已知变量的值?根据前面的结果,我们已经初步解出了相机的内参和外参,那么我们可以根据标定板上的每个角点的世界坐标去计算在没有畸变情形下所对应图像坐标系上的和像素坐标系上的,而是通过实际拍摄的图像(含有畸变),计算角点位置得到的,而是相机的内参也是已知的。因此每个世界坐标点,可以得到上述两个等式,由于有多幅标定板图像,比如说m幅,每幅图像上有多个点,比如说n,因此可列等式2mn个。根据投影矩阵,我们可以求解K1、K2.

至此,相机的内参、每幅图像所对应的相机外参以及畸变模型参数均解出了一个初步解,那么后续根据极大使然估计进行最优化,利用初步解反复迭代,最终得到最优参数,来表示相机模型的参数。

欢饮讨论!

摄像机标定以及镜头畸变相关推荐

  1. 多摄像机标定和去畸变

    Table of Contents 1.kalibr多摄像机标定 1.1 系统安装,环境配置:实测Ubuntu 16.04 1.2 多摄像机标定 2.OpenCV双目标定 3.Matlab多摄像机标定 ...

  2. 畸变的单目摄像机标定

    畸变的单目摄像机标定 Deep Single Image Camera Calibration with Radial Distortion 摘要 单图像标定是从一幅图像中预测摄像机参数的问题.在处理 ...

  3. 【计算机视觉】摄像机标定与畸变校正

    任务1:利用OpenCV实现摄像机参数标定 设置好棋盘格参数(边长.行列数等),打印方形棋盘格并粘贴,拍摄多张标定图像: 估计标定参数,可视化标定结果.        任务2:根据标定参数进行畸变校正 ...

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

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

  5. 用OpenCV进行摄像机标定

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

  6. Halcon算法矫正镜头畸变

    矫正畸变 1. 什么是畸变 2. 算法矫正镜头畸变的步骤 3. Halcon代码 1. 什么是畸变 畸变是指镜头的畸变,分为径向畸变和切向畸变. 需要注意的是,我们在这里讨论的是对镜头径向畸变的矫正. ...

  7. Halcon 摄像机标定流程-代码实现

    1. 标定参数的构成 • 标定参数分为相机的内参和外参: • 内参:内参标定的是摄像系统的内部结构和关系,镜头的畸变在出厂的时候就已经固定下来的,唯一可能改变的是镜头和相机之间的组装关系.所以如果相机 ...

  8. 镜头畸变矫正、鱼眼镜头(算法)

    首先这是 径向畸变+切向畸变,都需要矫正(图片保密) 径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在短焦镜头中表现更加明显,径向畸变主要 ...

  9. 【计算机视觉】摄像机标定2 原理篇

    转载 摄像机标定 http://blog.csdn.net/tiemaxiaosu/article/details/51728961 一.概述 1.摄像机标定内容 摄像机标定实际上是要求出6个外参数. ...

最新文章

  1. 波士顿动力机器人逆天,人类已无法阻挡它的三级跳!
  2. python勾股定理_Python学习第128课——在Python中实现醉汉随机游走
  3. python语音在线编辑-Python实时语音识别控制
  4. 【DIY】DIYarduino温湿度计视频图文教程
  5. 速卖通运营之如何提升商品动销率
  6. 32个最热CPLD-FPGA论坛
  7. Java指定几个标点符号(或分割)分割字符
  8. php网上实训指导书,PHP网站开发技术-实训指导书2016吐血制作
  9. Javascript脚本 : eval()函数
  10. fedora下编译运行java傻瓜入门级教程
  11. (转)Top Ten Web Hacking Techniques of 2011
  12. Java躲子弹课设,Robocode高手的诀窍 - 躲避子弹[Java编程]
  13. HTML代码实现简易购物车-web前端教程
  14. PPT处理控件Aspose.Slides功能演示:使用 Java 在 PowerPoint 中创建和操作表格
  15. openCV 简单实现身高测量(未考虑相机标定,windows)
  16. 【Protues仿真】PNP三极管驱动蜂鸣器和实际电路相同却不响问题探讨
  17. Android全面解析之Window机制
  18. 如何在线合并视频?合并视频这样做
  19. Mac和Windows共享文件,不借助任何软件
  20. 『看球笔记』20140217 红军足总杯遭枪手2-1淘汰 ,胜负手在哪?

热门文章

  1. deepin-wine
  2. 影响员工满意度下降的因素
  3. 说话人识别(speaker Recognition/Verification)简介
  4. 【软件侠】公认最常用的20个函数,案例详解
  5. pci 中断冲突_PCI设备中断冲突的基本解决办法
  6. Vbs脚本将本地文件上传到Azure存储账户
  7. 医保卡和社保卡的区别
  8. Arduino UNO AT24C32进行字符串数据读写
  9. 曹大带我学 Go(2)—— 迷惑的 goroutine 执行顺序
  10. 服务器文档链接电脑,服务器怎么链接电脑