在视觉工程中,涉及到测量任务时,第一步就是对相机的畸变进行矫正。此篇博文首先对坐标系变换进行简介,之后介绍畸变矫正方法,最后给出OpenCV  C++的实现代码。


目录

一、坐标系简介

1、像素坐标系

2、图像坐标系

3、相机坐标系

4、世界坐标系

二、相机的内参和外参

三、图像的畸变和矫正

四、畸变矫正代码实现

1、标定板图像采集

2、角点检测 & 亚像素级校准

3、完成相机标定


一、坐标系简介

在视觉应用中,总共有四个坐标系需要了解,分别是:像素坐标系(p)、图像坐标系(i)、相机坐标系(c)、世界坐标系(w)。我们将会从像素坐标系依次映射到世界坐标系。

1、像素坐标系

像素坐标系对于我们并不陌生,数字图像在计算机内部存储的形式类似于像素坐标系,如下图所示。图像中任意一点的坐标可以表示为:

2、图像坐标系

将像素坐标系的中心平移到中心,就得到了图像坐标系,此坐标系可以方便地反映出物体地尺寸信息。坐标系如下图所示:

设图像坐标系的中心为,相机中感光器件的尺寸为,则两坐标系之间的关系可表示为:

将其写成矩阵形式:

将偏移项纳入乘积项,转化为齐次坐标形式:

3、相机坐标系

相机坐标系算是比较难理解的一个。相机坐标系中心与图像坐标系中心的连线就是Z轴,x和y轴分别平行。并且连线的距离就是焦距。一个物体从相机坐标系成像到图像坐标系,过程如图:

根据距离关系有:

即:

转化为齐次形式:

4、世界坐标系

安装相机时,会分别绕相机坐标系的X、Y、Z轴做平移和旋转操作,最后得到世界坐标系。注意,此时三个轴与其他坐标系并不平行。

首先考虑平移操作:

其次考虑旋转操作,分别绕X、Y、Z轴旋转有旋转矩阵

1.基本旋转矩阵:

2.基本矩阵:

故整个相机坐标系到世界坐标系的变换公式为:

其中:


二、相机的内参和外参

通过几个坐标系的转化,我们现在可以直接从像素坐标系变换到世界坐标系:

其中,u和v是像素坐标系中的坐标,XYZ是世界坐标系中的坐标,剩余的两个矩阵分别为:

★ RT01矩阵:相机外参,是相机相对于世界坐标系的旋转和平移变换关系。

★ 4*3矩阵:相机内参,是相机的固有属性,含有焦距、像元尺寸等参数。

相机畸变矫正中,重要的一步就是获取相机的内参。


三、图像的畸变和矫正

图像的畸变主要有两种:径向畸变和切向畸变。

径向畸变:正中心位置的畸变最小,随着半径的增大,畸变增大。径向畸变可以分为枕形畸变和桶形畸变:

径向畸变矫正公式如下(泰勒级数展开式前3项):

其中是理想坐标,是畸变后的像素点坐标,且:

切向畸变:在透镜与成像平面不平行时就会产生,类似于透视变换。

切向畸变的矫正公式如下:

两种畸变最后都归结到五个参数:;知道这五个参数后即可完成畸变的矫正。


四、畸变矫正代码实现

畸变矫正在OpenCV中已经做的很成熟了,只需要调用封装好的API就可以。接下来简要地说明一下流程:

1. 完成标定板图像的采集(至少3张)

2. 利用findChessboardCorners()函数检测标定板角点,并利用find4QuadCornerSubpix()函数完成亚像素级校准

3. 利用calibrateCamera()函数进行相机标定,得到内参矩阵和畸变系数

1、标定板图像采集

将标定板置于不同的角度进行拍摄,此时采集的图像为畸变图像。

2、角点检测 & 亚像素级校准

主要用到了两个OpenCV内置函数:

1、角点检测函数
bool findChessboardCorners(InputArray image, Size patternSize,OutputArray corners, int flags=CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE );
// image:传入拍摄的棋盘图Mat图像,必须是8位的灰度或者彩色图像
// patternSize:每个棋盘图上内角点的行列数,一般情况下,行列数不要相同,便于后续标定程序识别标定板的方向;
// corners:用于存储检测到的内角点图像坐标位置,一般用元素是Point2f的向量来表示:vector<Point2f> image_points_buf;
// flage:用于定义棋盘图上内角点查找的不同处理方式,有默认值。
2、提取亚像素角点信息
专门用来获取棋盘图上内角点的精确位置,降低相机标定偏差,还可以使用cornerSubPix函数
bool find4QuadCornerSubpix(InputArray img, InputOutputArray corners, Size region_size);
// img:输入的Mat矩阵,最好是8位灰度图像,检测效率更高
// corners:初始的角点坐标向量,同时作为亚像素坐标位置的输出vector<Point2f> iamgePointsBuf;
// region_size:角点搜索窗口的尺寸

角点检测结果可以可视化出来:

3、完成相机标定

3、相机标定
double calibrateCamera( InputArrayOfArrays objectPoints,InputArrayOfArrays imagePoints,Size imageSize,CV_OUT InputOutputArray cameraMatrix,CV_OUT InputOutputArray distCoeffs,OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs,int flags=0, TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON));
// objectPoints:世界坐标系中的三维点,三维坐标点的向量的向量vector<vector<Point3f>> object_points
// imagePoints:每一个内角点对应的图像坐标点,vector<vector<Point2f>> image_points_seq形式
// imageSize:图像的像素尺寸大小(列数=cols,行数=rows)(宽度=width,高度=height)
// cameraMatrix:相机的3*3内参矩阵,Mat cameraMatrix=Mat(3,3,CV_32FC1,Scalar::all(0));
// distCoeffs:1*5畸变矩阵,Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0))
// rvecs:旋转向量,输入一个Mat类型的vector,即vector<Mat>rvecs;
// tvecs:位移向量,和rvecs一样,应该为vector<Mat> tvecs;
// flags:标定时所采用的算法
// criteria:最优迭代终止条件设定

具体代码细节请参看:https://blog.csdn.net/piaoxuezhong/article/details/75268535

相机畸变矫正原理及代码实现相关推荐

  1. 一文讲透鱼眼相机畸变矫正,及目标检测项目应用

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 1 个人介绍 大家好,我是潘大强. 目前博士毕业4年,主要从事智能安防行业. 之前也分享过AI从业的一 ...

  2. 立体视觉 -- 相机畸变矫正(去畸变)

    相机畸变矫正 在双目立体视觉中,常常会使用张正友的相机标定方法,得到相机的参数(相机内参和畸变),进而矫正由于相机透镜制造工艺等因素造成的图像畸变.在Opencv 和 Matlab 中都有封装好的函数 ...

  3. 基于OpenCV的鱼眼相机畸变矫正(含代码)

    首先展示一下实现的效果: 校正前: 校正后: 本文分为两部分,一部分是介绍鱼眼相机畸变校正的原理,一部分是手撕OpenCV相机矫正代码. 文章主要结构如下图所示: 一.介绍鱼眼相机的原理 1.什么是鱼 ...

  4. 相机标定的来龙去脉(详解标定原理、畸变矫正原理、使用经验)

    目录 1.相机标定的意义 2.坐标系的变换 2.1.小孔成像的原理 2.2.各个坐标系的定义 2.2.1.像素坐标系 2.2.2.图像坐标系 2.2.3.相机坐标系 2.3.相机的内参和外参 3.图像 ...

  5. 相机畸变原因与去畸变原理与代码

    相机畸变原因与去畸变原理与代码 相机主要有两种畸变:径向畸变和切向畸变 径向畸变由透镜形状引起的畸变: 切向畸变由相机组装过程中透镜与成像面不严格平行导致的. 一个畸变效果图: 我们能够看到位于图像边 ...

  6. 机器视觉-相机标定及畸变矫正

    摘要:本文首先介绍了针孔相机模型(线性模型),然后推导四个坐标轴变换的关系,引出R.T.K.D中包含相机的5个内参,6个外参.然后介绍相机畸变的原因以及畸变模型(非线性模型),引出相机的5个畸变参数. ...

  7. 0019_畸变矫正(单相机标定)

    畸变: 图像形状发生了变形(本来是直线,变成了向内凹或者向外凸的弧线) 单相机畸变矫正的处理步骤: 1. 使用标定板,在halcon中使用标定助手,得到相机的内外参数 可以将内外参数据生成到halco ...

  8. 图像畸变矫正——透视变换

    图像畸变矫正--透视变换 由于相机制造精度以及组装工艺的偏差引入的畸变,或者由于照片拍摄时的角度.旋转.缩放等问题, 可能会导致原始图像的失真,如果要修复这些失真,我们可以通过透视变换,对图像进行畸变 ...

  9. Halcon :畸变矫正与标定(2)

    相机标定 1.相机标定是什么 2.怎么使用halcon进行相机内外参标定? (1)搭建硬件 1.**相机连好电脑,用相机厂家软件打开相机,检查一下相机是否正常.** 2.**接下来使用halcon连接 ...

最新文章

  1. iptables踩坑记
  2. 错误C4146的解决方法
  3. 可视化自编码器训练结果
  4. 【图像分割模型】感受野与分辨率的控制术—空洞卷积
  5. html js php 混编,Razor标记语言和HTML,js混编
  6. 设计模式之笔记--简单工厂模式(Simple Factory)
  7. 微信小程序入门1-小程序代码构成json
  8. linux源码编译安装apache,Ubuntu 16.04源码编译安装Apache 2.4.25教程
  9. Linux chmod 修改多个文件权限
  10. 什么是脏数据,缓存中是否可能产生脏数据,如果出现脏数据该怎么处理?
  11. arping命令 《openstack 网络》
  12. 多功能智慧路灯杆商业模式解决方案
  13. python 柱状图和折线图放在一起_一款多条折线与柱状图共存图表
  14. 个人学习无人驾驶的路线
  15. java 耦合解耦_程序的耦合和解耦
  16. 一款网课学习辅助软件
  17. SOLIDWORKS怎样做填充阵列
  18. c语言回车换行符的作用,C语言中回车符和回车换行符有什么区别
  19. VMware Workstation Pro 16 XP home edition安装(ISO文件最底下)
  20. css怎么设置z坐标,CSS 定位(postion、z-index)

热门文章

  1. java里面几种锁的区别。。
  2. 三维目标检测算法汇总学习笔记
  3. 长生生物事件的反思:质量是生命
  4. 城市燃气价格体系及计量、计费
  5. effective c++阅读之旅---条款6
  6. 【超分辨率】VDSR--Accurate Image Super-Resolution Using Very Deep Convolutional Networks
  7. PCBA方案设计——医疗器械认证血氧仪方案
  8. 弄底层基础的东西往往慢,枯燥,要慢慢磨
  9. 20170622《指导生活的算法》
  10. 基于人工智能的多肽药物分析的子问题——蛋白质的三级结构预测的第一周学习记录