当前位置: 首页 > news >正文

双目相机的畸变校正以及平行校正(极线校正)的入门问题总结

转载:http://blog.csdn.net/wangxiaokun671903/article/details/37935113

做相机标定对于刚入手的人来说有很多疑惑的点,我总结个人的入手的方法和需要弄明白的问题:

一、相机标定是干什么的,需要什么器材才能做?双目校正目标是什么,又需要什么设备?


二、相机(针孔)模型是什么样的?世界坐标系,相机坐标系,图像物理坐标系,图像像素坐标系,这四个坐标系到底是什么?从世界坐标系到图像坐标系到底是怎么转换的?


三、Opencv中用到的相机标定函数,对应的算法具体是谁的,什么算法?获得的各矩阵数据的含义指的是什么?


四、获得单个相机的内参矩阵和畸变系数后,怎么对相机进行畸变校正?


五、分别获得两个相机的内参矩阵和畸变系数,以及两相机之间的相对旋转平移矩阵后。怎样进行双目平行校正?校正的结果和流程应该是怎样的?


这些问题如果搞清楚了,那么相机的畸变和平行校正的方法你一定也就明白了。


对于上述问题,我目前的理解如下:


     一、
相机标定就是要通过一定的方法对特定图像(棋盘格角点检测)计算出这个相机本身的一些参数,包扩:内参矩阵A,外参矩阵[R|T]、畸变系数[k1,k2,k3,~,p1,p2,~]内参矩阵各元素意义:一个像素的物理尺寸dxdy,焦距f,图像物理坐标的扭曲因子gama,图像原点相对于光心成像点的的纵横偏移量cxcy(像素为单位)外参矩阵:世界坐标系转换到相机坐标系的旋转R和平移T矩阵。畸变系数:包括相机的径向畸变系数k1,k2,k3,~,和相机的切向畸变系数p1,p2,~需要的器材:一个黑白棋盘格的标定板,一个相机拍摄的不同角度或距离的棋盘格图像至少三张以上。


双目校正就是通过一定的方法将两个摄像头拍摄同一个物体的图像进行处理,使得两幅图像最终达到下面的目标,同一个物体在两幅图像中的大小一样,且水平在一条直线上。需要的设备:双目摄像头(即两个同规格的摄像头水平放置左右摄像头),拍摄同一个物理的左右图像对,需要已知左右相机的内参矩阵、畸变系数、右相机相对于左相机的旋转矩阵R(通过一定的方法可将此矩阵分解成两个矩阵R1R2,即左右相机各旋转一半达到水平)。


二、针孔相机的模型:三维世界中的物体,经过相机成像系统,变成二维图像过程如下所示。


世界坐标系:就是物体在真实世界中的坐标,比如黑白棋盘格的世界坐标系原点定在第一个棋盘格的顶点,Xw,Yw,Zw互相垂直,Zw方向就是垂直于棋盘格面板的方向。可见世界坐标系是随着物体的大小和位置变化的,单位是长度单位。只要棋盘格的大小决定了,无论板子怎么动,棋盘格角点坐标一般就不再变动(因为是相对于世界坐标系原点的位置不变),且认为是Zw=0.

相机坐标系:以光心为相机坐标系的原点,以平行于图像的x和y方向为Xc轴和Yc轴,Zc轴和光轴平行,Xc,Yc,Zc互相垂直,单位是长度单位。

图像物理坐标系:以主光轴和图像平面交点为坐标原点,x和y方向如图所示,单位是长度单位。

图像像素坐标系:以图像的顶点为坐标原点,u和v方向平行于x和y方向,单位是以像素计。


     从世界坐标系到图像坐标系
的转换过程如下:世界坐标系通过外参矩阵转换到相机坐标系,相机坐标系通过内参矩阵转换到图像像素坐标系(这一步是通过两步完成的,一,相机坐标系通过焦距对角矩阵和畸变系数转换到图像物理坐标系,二图像物理坐标系通过像素转换矩阵转换到像素坐标系中)。转换过程和公式如下(将在接下来的文章里详细说明):


      三、opencv标定中用到的重要函数和算法以及获取矩阵的含义

findChessboardCorners()用来发现棋盘格的角点位置,这里用的是haaris角点检测方法。cornerSubPix()角点位置精确到亚像素级。

stereoCalibrate()通过角点推算出两个相机的内参矩阵M1,M2和畸变系数D1,D2,当然外参矩阵随之也就计算出来了(在图像校正中还没有用到外参),这里用到的是张正友相机标定算法。

stereoRectify()根据内参矩阵和畸变系数计算右相机相对于左相机的旋转R和平移矩阵T,并将这个旋转和平移矩阵分解成左、右相机各旋转一半的旋转R1,R2和平移矩阵T1,T2,这里用到的是bouguet极线校正的方法。

initUndistortRectifyMap()和remap()对左右相机拍摄的图像进行校正(在今后的文章中将会详细介绍实现方法和步骤)。


       四、获取了内参矩阵和畸变系数对图像进行畸变校正时,就是解决图像的畸变问题(径向畸变是因为透镜本身工艺的问题,切向畸变是由于安装问题带来的)。畸变校正的过程是这样的,将源图像像素坐标系通过内参矩阵转化成相机坐标系(和图像物理坐标系比较多了缩放和Z轴),通过畸变系数校正图像的相机坐标,校正后通过内参矩阵将相机坐标系转换成图像像素坐标系,并根据源图像坐标的像素值赋值给新的图像坐标(用插值的方法,将在后面的文章中叙述)。


       五、双目平行校正,是针对图像对应的相机坐标系进行的,那么极线校正的时候应该注意就是在四中叙述的畸变校正过程中,在转换到相机坐标系后,左右图像对应的相机坐标系分别通过旋转矩阵R1和R2进行平行极线校正。步骤如下:将源图像像素坐标系通过内参矩阵转化成相机坐标系(和图像物理坐标系比较多了缩放和Z轴),通过旋转矩阵R1和R2进行平行极线校正,然后通过畸变系数校正图像的相机坐标,校正后通过内参矩阵将相机坐标系转换成图像像素坐标系,并根据源图像坐标的像素值赋值给新的图像坐标

相关文章:

  • 相机针孔模型----从世界坐标系,到相机坐标系,再到图像物理坐标系,最后到图像像素坐标系的转换过程解析
  • 相机去畸变,以及双目平行校正----极线校正(一)————之单目畸变校正详细过程
  • 摄像机模型与标定—棋盘、亚像素角点和绘制棋盘角点
  • 摄像机模型与标定——单应性
  • 摄像机模型与标定——摄像机标定
  • 摄像机模型与标定——标定函数
  • 摄像机模型与标定——三个坐标系及其之间关系
  • 推导四对对应点单应矩阵的计算公式?
  • 透视投影中已知两平面的单应矩阵,能否求出这两平面的夹角?
  • 相机标定的网页收纳
  • 机器视觉的相机标定到底是什么?
  • 摄像机标定--矫正畸变
  • 机器学习(Machine Learning)深度学习(Deep Learning)资料汇总
  • 机器学习(Machine Learning)深度学习(Deep Learning)资料(下)
  • 【深度学习Deep Learning】资料大全
  • 07.Android之多媒体问题
  • 11111111
  • Apache的80端口被占用以及访问时报错403
  • ES6 学习笔记(一)let,const和解构赋值
  • Sequelize 中文文档 v4 - Getting started - 入门
  • vue脚手架vue-cli
  • 百度地图API标注+时间轴组件
  • 机器学习 vs. 深度学习
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 驱动程序原理
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 应用生命周期终极 DevOps 工具包
  • zabbix3.2监控linux磁盘IO
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $ git push -u origin master 推送到远程库出错
  • (poj1.3.2)1791(构造法模拟)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (算法)前K大的和
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (状压dp)uva 10817 Headmaster's Headache
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .Net 6.0 处理跨域的方式
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net Memory Profiler的使用举例
  • .NET MVC第三章、三种传值方式
  • .net 怎么循环得到数组里的值_关于js数组
  • .net和jar包windows服务部署
  • .sdf和.msp文件读取
  • @ConditionalOnProperty注解使用说明
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ solr入门 ] - 利用solrJ进行检索
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • []我的函数库
  • [4.9福建四校联考]
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured