StereoRectify()函数定义及用法畸变矫正与立体校正

 

畸变矫正是上一篇博文的遗留问题,当畸变系数和内外参数矩阵标定完成后,就应该进行畸变的矫正,以达到消除畸变的目的,此其一。

在该系列第一部分的博文中介绍的立体成像原理中提到,要通过两幅图像估计物点的深度信息,就必须在两幅图像中准确的匹配到同一物点,这样才能根据该物点在两幅图像中的位置关系,计算物体深度。为了降低匹配的计算量,两个摄像头的成像平面应处于同一平面。但是,单单依靠严格的摆放摄像头来达到这个目的显然有些困难。立体校正就是利用几何图形变换(Geometric Image Transformation)关系,使得原先不满足上述位置关系的两幅图像满足该条件,此其二。

数学原理

  • 畸变矫正(compensate lens distortion)

畸变矫正的方法就是用上一篇博文给出的公式对像素位置进行重新映射。这里重新写出重新映射的公式。

先矫正径向畸变,

再矫正切向畸变,

  • 立体矫正(stereo rectify)

立体矫正能够有效降低立体匹配的计算量,立体矫正的具体作用见下图,

立体矫正前,

立体矫正后,

立体矫正的算法原理没有详细了解,此处从略。

OpenCV相关函数说明

  • 畸变矫正函数 undistort() 

 undistort() 是独立的一个畸变矫正函数,一次性可以完成映射矩阵的求解和重新映射。下面我们还会看到把这两步分开来做的函数。

调用方法,

 

  1. src-输入未经过矫正的图像
  2. dst-经过矫正后输出的图像
  3. cameraMatrix-标定而得到的摄像机矩阵
  4. distCoeffs-标定得到的摄像机畸变矩阵
  5. newCameraMatrix-输入矫正后的摄像机矩阵(可以省略)
  • 立体标定函数 stereoCalibrate() 

 stereoCalibrate() 是用来标定一个立体摄像头的,也就是同时标定两个摄像头。标定的结果除了能够求出两个摄像头的内外参数矩阵,跟能够得出两个摄像头的位置关系R,T。

调用方法,

double stereoCalibrate(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1,InputArrayOfArrays imagePoints2, InputOutputArray cameraMatrix1,InputOutputArray distCoeffs1, InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, Size imageSize, OutputArray R,OutputArray T, OutputArray E, OutputArray F, TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6), intflags=CALIB_FIX_INTRINSIC )

 

  1. objectPoints- vector<point3f> 型的数据结构,存储标定角点在世界坐标系中的位置
  2. imagePoints1- vector<vector<point2f>> 型的数据结构,存储标定角点在第一个摄像机下的投影后的亚像素坐标
  3. imagePoints2- vector<vector<point2f>> 型的数据结构,存储标定角点在第二个摄像机下的投影后的亚像素坐标
  4. cameraMatrix1-输入/输出型的第一个摄像机的相机矩阵。如果CV_CALIB_USE_INTRINSIC_GUESS , CV_CALIB_FIX_ASPECT_RATIO ,CV_CALIB_FIX_INTRINSIC , or CV_CALIB_FIX_FOCAL_LENGTH其中的一个或多个标志被设置,该摄像机矩阵的一些或全部参数需要被初始化
  5. distCoeffs1-第一个摄像机的输入/输出型畸变向量。根据矫正模型的不同,输出向量长度由标志决定
  6. cameraMatrix2-输入/输出型的第二个摄像机的相机矩阵。参数意义同第一个相机矩阵相似
  7. distCoeffs2-第一个摄像机的输入/输出型畸变向量。根据矫正模型的不同,输出向量长度由标志决定
  8. imageSize-图像的大小
  9. R-输出型,第一和第二个摄像机之间的旋转矩阵
  10. T-输出型,第一和第二个摄像机之间的平移矩阵
  11. E-输出型,基本矩阵
  12. F-输出型,基础矩阵
  13. term_crit-迭代优化的终止条件
  14. flag-

    •  CV_CALIB_FIX_INTRINSIC 如果该标志被设置,那么就会固定输入的cameraMatrix和distCoeffs不变,只求解

      $R,T,E,F

    • $.
    •  CV_CALIB_USE_INTRINSIC_GUESS 根据用户提供的cameraMatrix和distCoeffs为初始值开始迭代
    •  CV_CALIB_FIX_PRINCIPAL_POINT 迭代过程中不会改变主点的位置
    •  CV_CALIB_FIX_FOCAL_LENGTH 迭代过程中不会改变焦距
    •  CV_CALIB_SAME_FOCAL_LENGTH 强制保持两个摄像机的焦距相同
    •  CV_CALIB_ZERO_TANGENT_DIST 切向畸变保持为零
    •  CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6 迭代过程中不改变相应的值。如果设置了 CV_CALIB_USE_INTRINSIC_GUESS 将会使用用户提供的初始值,否则设置为零
    •  CV_CALIB_RATIONAL_MODEL 畸变模型的选择,如果设置了该参数,将会使用更精确的畸变模型,distCoeffs的长度就会变成8
  • 立体校正函数 stereoRectify() 

 stereoRectify() 的作用是为每个摄像头计算立体校正的映射矩阵。所以其运行结果并不是直接将图片进行立体矫正,而是得出进行立体矫正所需要的映射矩阵。

调用方法,

void stereoRectify(InputArray cameraMatrix1, InputArray distCoeffs1, InputArray cameraMatrix2,InputArray distCoeffs2, Size imageSize, InputArray R, InputArray T,OutputArray R1, OutputArray R2, OutputArray P1, OutputArray P2, OutputArray Q, int flags=CALIB_ZERO_DISPARITY, double alpha=-1, Size newImageSize=Size(), Rect* validPixROI1=0, Rect* validPixROI2=0 )

 

  1. cameraMatrix1-第一个摄像机的摄像机矩阵
  2. distCoeffs1-第一个摄像机的畸变向量
  3. cameraMatrix2-第二个摄像机的摄像机矩阵
  4. distCoeffs1-第二个摄像机的畸变向量
  5. imageSize-图像大小
  6. R- stereoCalibrate() 求得的R矩阵
  7. T- stereoCalibrate() 求得的T矩阵
  8. R1-输出矩阵,第一个摄像机的校正变换矩阵(旋转变换)
  9. R2-输出矩阵,第二个摄像机的校正变换矩阵(旋转矩阵)
  10. P1-输出矩阵,第一个摄像机在新坐标系下的投影矩阵
  11. P2-输出矩阵,第二个摄像机在想坐标系下的投影矩阵
  12. Q-4*4的深度差异映射矩阵
  13. flags-可选的标志有两种零或者 CV_CALIB_ZERO_DISPARITY ,如果设置 CV_CALIB_ZERO_DISPARITY 的话,该函数会让两幅校正后的图像的主点有相同的像素坐标。否则该函数会水平或垂直的移动图像,以使得其有用的范围最大
  14. alpha-拉伸参数。如果设置为负或忽略,将不进行拉伸。如果设置为0,那么校正后图像只有有效的部分会被显示(没有黑色的部分),如果设置为1,那么就会显示整个图像。设置为0~1之间的某个值,其效果也居于两者之间。
  15. newImageSize-校正后的图像分辨率,默认为原分辨率大小。
  16. validPixROI1-可选的输出参数,Rect型数据。其内部的所有像素都有效
  17. validPixROI2-可选的输出参数,Rect型数据。其内部的所有像素都有效
  • 映射变换计算函数 initUndistortRectifyMap() 

该函数功能是计算畸变矫正和立体校正的映射变换。

调用方法,

void initUndistortRectifyMap(InputArray cameraMatrix, InputArray distCoeffs, InputArray R,InputArray newCameraMatrix, Size size, int m1type, OutputArray map1, OutputArray map2)

 

  1. cameraMatrix-摄像机参数矩阵
  2. distCoeffs-畸变参数矩阵
  3. R- stereoCalibrate() 求得的R矩阵
  4. newCameraMatrix-矫正后的摄像机矩阵(可省略)
  5. Size-没有矫正图像的分辨率
  6. m1type-第一个输出映射的数据类型,可以为 CV_32FC1  或  CV_16SC2 
  7. map1-输出的第一个映射变换
  8. map2-输出的第二个映射变换
  • 几何变换函数 remap() 

调用方法,

void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation,int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

 

  1. src-原图像
  2. dst-几何变换后的图像
  3. map1-第一个映射,无论是点(x,y)或者单纯x的值都需要是CV_16SC2 ,CV_32FC1 , 或 CV_32FC2类型
  4. map2-第二个映射,y需要是CV_16UC1 , CV_32FC1类型。或者当map1是点(x,y)时,map2为空。
  5. interpolation-插值方法,但是不支持最近邻插值
  6. 剩下两个我也没看懂,但是一般示例程序中不会设置

基于OpenCV的仿真

  • 仿真程序

View Code

 

子函数calibrate()calcChessboardCorners()分别是用来表达相机和计算objectPoints的。函数体如下,

View Code

 

复制代码

1 static void calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>& corners)
2 {
3     corners.resize(0);
4     for (int i = 0; i < boardSize.height; i++)        //height和width位置不能颠倒
5     for (int j = 0; j < boardSize.width; j++)
6     {
7         corners.push_back(Point3f(j*squareSize, i*squareSize, 0));
8     }
9 }

复制代码

 

  • 仿真结果

分类: Computer Vision,OpenCV,数字图像处理

标签: opencv, Computer Vision

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

死磕 java集合之TreeMap源码分析(三)- 内含红黑树分析全过程

2019独角兽企业重金招聘Python工程师标准>>> 欢迎关注我的公众号“彤哥读源码”&#xff0c;查看更多源码系列文章, 与彤哥一起畅游源码的海洋。 删除元素 删除元素本身比较简单&#xff0c;就是采用二叉树的删除规则。 &#xff08;1&#xff09;如果删除的位置有两…

Linux:进程实例信息(/proc)

https://blog.csdn.net/test1280/article/details/73632333 Linux:进程实例信息&#xff08;/proc&#xff09; 问几个问题&#xff1a; 1.怎么知道一个进程对应哪个可执行文件&#xff1f; 2.怎么知道一个进程的资源限制&#xff1f; 3.怎么知道一个进程所处的环境&#xff1f…

四元素理解

旋转变换_四元数 2017年03月29日 11:59:38 csxiaoshui 阅读数&#xff1a;5686 1.简介 四元数是另一种描述三维旋转的方式&#xff0c;四元数使用4个分量来描述旋转&#xff0c;四元数的描述方式如下&#xff1a; qsxiyjzk,(s,x,y,z∈ℝ&#xff09;i2j2k2ijk−1 四元数的由…

31、SAM文件中flag含义解释工具--转载

转载&#xff1a;http://www.cnblogs.com/nkwy2012/p/6362996.html SAM是Sequence Alignment/Map 的缩写。像bwa等软件序列比对结果都会输出这样的文件。samtools网站上有专门的文档介绍SAM文件。具体地址&#xff1a;http://samtools.sourceforge.net/SAM1.pdf很多人困惑SAM文…

《Head First设计模式》批注系列(一)——观察者设计模式

最近在读《Head First设计模式》一书&#xff0c;此系列会引用源书内容&#xff0c;但文章内容会更加直接&#xff0c;以及加入一些自己的理解。 观察者模式&#xff08;有时又被称为模型-视图&#xff08;View&#xff09;模式、源-收听者(Listener)模式或从属者模式&#xff…

PYPL 4 月排行:Python 最流行,Java 还行不行?

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; PYPL 发布了 4 月份的编程语言排行榜。 前五的分别是&#xff1a;Python、Java、Javascript、C# 和 PHP。可以看到&#xff0c;榜单没有什么大变化&#xff0c;但是相比去年 4 月份&#xff0c;…

两个向量的旋转矩阵与四元素

两向量的夹角 2017年06月20日 17:38:11 csxiaoshui 阅读数&#xff1a;36764 怎么计算两个向量间的夹角呢&#xff1f; 这里主要分两种情况&#xff0c;对于二维向量和三维向量来分别讨论。 1. 二维向量 二维向量的情况相对简单&#xff0c;根据向量间的点乘关系 v1⋅v2|…

顺序表

一、数据是如何在内存中存储的&#xff1f; 32位系统中char&#xff0c;int型数据在内存中的存储方式&#xff1a; char占1byte&#xff08;8bit&#xff09;int占4byte&#xff08;32bit&#xff09;假设我们有一个int类型的值&#xff0c;它从0x01开始&#xff0c;一个int占据…

Establishing SSL connection without server's identity verification is not recommended.

完全描述:Establishing SSL connection without servers identity verification is not recommended. According to MySQL 5.5.45, 5.6.26 and 5.7.6 requirements SSL connection must be established by default if explicit option isnt set. For compliance with existing …

四元素的真面目..........简单粗暴

作者&#xff1a;Yang Eninala 链接&#xff1a;https://www.zhihu.com/question/23005815/answer/33971127 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 根据我的理解&#xff0c;大多数人用汉密尔顿四元数就只…

2.自定义变量调节器

① 使用registerPlugin()方法来扩充变量调节器 该方法接收3个参数 1. 字符串modifier 2. 插件函数的名字 3. PHP回调函数 示例&#xff1a;自定义一个变量调节器&#xff0c;可以改变文字的颜色和大小 第一步&#xff1a;调用smarty对象的registerPlugin&#xff08;&#x…

SpringBoot2构建基于RBAC权限模型的驾校代理小程序后端

本项目是使用SpringBoot2构建的一套基于RBAC权限模型的后台管理系统&#xff0c;前端是微信小程序。 项目地址: github.com/fuyunwang/D… 项目的缘由 最近接了个外包,主要是针对于驾校开发一个代理小程序。目的是为了方便驾校的管理来招揽学员,同时方便维护学员和代理信息。 项…

while read line的问题

循环中的重定向或许你应该在其他脚本中见过下面的这种写法&#xff1a;while read linedo…done < file刚开始看到这种结构时&#xff0c;很难理解< file是如何与循环配合在一起工作的。因为循环内有很多条命令&#xff0c;而我们之前接触的重定向都是为一条命令工作的。…

Linemod;理解

Linemod 代码笔记 2019年03月11日 16:18:30 haithink 阅读数&#xff1a;197 最近了解到 Linemod 这个模板匹配算法&#xff0c;印象不错 准备仔细学习一下&#xff0c;先做点代码笔记&#xff0c;免得后面不好回顾 目前的笔记基本上把 核心流程都分析得比较清楚了&#xff0…

Swift3中数组创建方法

转载自&#xff1a;http://blog.csdn.net/bwf_erg/article/details/70858865 数组是由一组类型相同的元素构成的有序数据集合。数组中的集合元素是有 序的&#xff0c;而且可以重复出现。 1 数组创建 在Swift语言中&#xff0c;数组的类型格式为&#xff1a; Array<ElementT…

BZOJ 5249: [2018多省省队联测]IIIDX(贪心 + 线段树)

题意 这一天&#xff0c;\(\mathrm{Konano}\) 接到了一个任务&#xff0c;他需要给正在制作中的游戏 \(\mathrm{《IIIDX》}\) 安排曲目 的解锁顺序。游戏内共有\(n\) 首曲目&#xff0c;每首曲目都会有一个难度 \(d\) &#xff0c;游戏内第 \(i\) 首曲目会在玩家 Pass 第 \(\lf…

手眼标定

Eye-in-hand和Eye-to-hand问题求解和实验 2018年12月07日 00:00:40 百川木易 阅读数 3018 2018/12/5 By Yang Yang&#xff08;yangyangipp.ac.cn&#xff09; 本文所有源码和仿真场景文件全部公开&#xff0c;点击Gitee仓库链接。 文章目录 问题描述Eye-in-hand问题求解公式…

RNN总结

RNN既可以表述为循环神 经网络&#xff08;recurrent neural network&#xff09;&#xff0c;也可以表述为递归神经网络&#xff08;recursive neural network&#xff09;&#xff0c;前者一般用于处理以时间序列为输入的问题&#xff08;比如把一个句子看成词组成的序列&…

Problem 2. number题解

number&#xff1a;数学二分图匹配 首先&#xff0c;如果S<N,那么S1&#xff0c;S2...N这些数直接放在S1,S2...N的位置上(如果其他数x放在这些位置上面&#xff0c;这些数不放在对应位置&#xff0c;那么x一定能放在这些数放的位置&#xff0c;所以直接交换即可)所以可以直接…

SSD列子

一、介绍 本博文主要介绍实现通过SSD物体检测方式实现工件裂纹检测。裂纹图像如下所示&#xff1a; 二、关于SSD算法 具体算法不再阐述&#xff0c;详细请参考&#xff1a; https://blog.csdn.net/u013989576/article/details/73439202 https://blog.csdn.net/xiaohu2022/arti…