双目标定与三维计算:从理论到OpenCV实践

双目标定与三维计算:从理论到OpenCV实践

一、双目立体成像主要步骤    2

二、三角测量    3

2.1 主光线在无穷远处相交    3

2.2 主光线在有限距离内相交    3

2.3 深度与视差    4

2.4 双目立体坐标系    5

2.5 实际情况的双目    5

三、对级几何    6

3.1 对极几何的定义    6

3.2 极点极线极面的定义    6

3.3 对极几何的一些结论    7

四、本征矩阵E和基础矩阵F    8

4.1 基本信息    8

4.2 两者区别    8

4.3 本征矩阵E的表达式    9

4.4 基础矩阵F的表达式    9

4.5 基础矩阵F的求解    10

五、极线的计算    10

六、立体标定    10

6.1 立体标定目的    11

6.2 R和T理论到OpenCV求解    11

6.2.1 OpenCV处理函数    11

6.2.2 双目标定与单目标定的区别    11

6.2.3 R和T的理论推导    11

6.2.4 结合单目标定和双目标定求解    11

七、立体校正    12

7.1 立体校正目的    13

7.2 八个校正项    13

7.3 两种校正算法    13

7.3.1 Hartley校正算法:非标定立体校正    13

7.3.2 Bouguet校正算法:标定立体校正    13

7.4 校正映射    15

八、立体匹配    16

九、计算3D坐标    17

十、OpenCV主要相关函数    18

一、双目立体成像主要步骤

二、三角测量

2.1 主光线在无穷远处相交

2.2 主光线在有限距离内相交

2.3 深度与视差

2.4 双目立体坐标系

2.5 实际情况的双目

三、对级几何

3.1 对极几何的定义

立体成像的基本几何学就是对极几何。

对极几何就是将两个针孔模型和极点结合起来。

3.2 极点极线极面的定义

3.3 对极几何的一些结论

四、本征矩阵E和基础矩阵F

4.1 基本信息

本征矩阵E包含在物理空间中两个摄像机相关的旋转与平移信息;

基础矩阵F除了包含E的信息外还包括两个摄像机的内参数。

4.2 两者区别

4.3 本征矩阵E的表达式

本征矩阵E包含旋转参数、平移参数。

4.4 基础矩阵F的表达式

基础矩阵F包含本征矩阵E和左右相机的内参。

4.5 基础矩阵F的求解算法

在没有摄像机标定的情况下,可以通过匹配点来求解基础矩阵F,基础矩阵F包含本征矩阵E,

(1)7点算法

缺点对异常点非常敏感。

(2)8点算法

缺点对异常点非常敏感。

(3)RANSAC算法和LmedS算法

五、极线的计算

六、立体标定

6.1 立体标定目的

立体标定是计算空间上两台摄像机几何关系的过程。

立体标定依赖于查找两台摄像机之间的旋转矩阵R和平移向量T。

6.2 R和T理论到OpenCV求解

6.2.1 OpenCV处理函数

R和T都是通过函数cvStereoCalibate()来计算的。

6.2.2 双目标定与单目标定的区别

6.2.3 R和T的理论推导

(来自[文献3])

6.2.4 结合单目标定和双目标定求解

七、立体校正

7.1 立体校正目的

立体校正的目的主要是让左右相机的图像完全行对准。

7.2 八个校正项

7.3 两种校正算法

7.3.1 Hartley校正算法:非标定立体校正

Hartley校正算法只使用基础矩阵来生成非标定立体视觉;Hartley算法可以通过单个摄像机记录的运动推导出立体结构,虽然单个摄像机会比Bouguet标定算法产生更多的畸变图像。

7.3.2 Bouguet校正算法:标定立体校正

7.4 校正映射

八、立体匹配

立体匹配的目的是通过匹配得到视差。

九、计算3D坐标

通过视差,可以得出图像点对应的3D坐标。

结果:

十、OpenCV1.1主要相关函数

10.1 双目标定流程与对应主要函数

(1)查找棋盘角点:cvFindChessboardCorners;

(2)显示角点结果:cvDrawChessboardCorners;

(3)亚像素角点:cvFindCornerSubPix;

(4)立体标定:cvStereoCalibrate;

(5)双目点畸变矫正:cvUndistortPoints

(6)统计双目标定误差:

计算极线(需要基础矩阵F):cvComputeCorrespondEpilines;

注意:基础矩阵F有两种求解方式:

i.通过立体标定cvStereoCalibrate求解;

ii.通过匹配点求解cvFindFundamentalMat;

(7)立体校正(行对准)

[A]方式一:非标定立体校正

a.求基础矩阵F:cvFindFundamentalMat;

b.非标定立体校正(需要基础矩阵F):cvStereoRectifyUncalibrated;

注意:其实可以有两种使用方式:

i.未标定:cvFindFundamentalMat+cvStereoRectifyUncalibrated;

ii.标定:cvStereoCalibrate+cvStereoRectifyUncalibrated;

c.校正映射:cvInitUndistortRectifyMap+cvRemap;

[B]方式二:标定立体校正

a.标定立体校正:cvStereoRectify(注意:可获得重投影矩阵Q);

b.校正映射:cvInitUndistortRectifyMap+cvRemap;

(8)立体匹配(输出视差)

[A]方式一:BM算法

结构体:CvStereoBMState

函数:

cvCreateStereoBMState;

cvFindStereoCorrespondenceBM;

cvReleaseStereoBMState;

[B]方式二:GC算法

结构体:CvStereoGCState

函数:

cvCreateStereoGCState;

cvFindStereoCorrespondenceGC;

cvReleaseStereoGCState;

(9)根据视差d和重投影矩阵Q计算3D坐标(注意:输入项重投影矩阵Q可以从cvStereoRectify获取)

[A]方式一:获取序列点的3D坐标

cvPerspectiveTransform;

[B]方式二:获取整幅图像的3D坐标

cvReprojectImageTo3D。

10.2 主要相关函数详解

10.3 双目标定示例代码

十一、OpenCV2.1新增功能与性能提升

11.1 2.1版增强了Stereo Vision方面的功能

(1) 新增了 SGBM 立体匹配算法(源自Heiko Hirschmuller的《Stereo Processing by Semi-global Matching and Mutual Information

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.8897&rep=rep1&type=pdf),可以获得比 BM 算法物体轮廓更清晰的视差图(但低纹理区域容易出现横/斜纹路,在 GCstate->fullDP 选项使能时可消减这种异常纹路,但对应区域视差变为0,且运行速度会有所下降),速度比 BM 稍慢, 352*288的帧处理速度大约是 5 帧/秒;

(2) 视差效果:BM < SGBM < GC;处理速度:BM > SGBM > GC ;

(3) BM 算法比2.0版性能有所提升,其状态参数新增了对左右视图感兴趣区域 ROI 的支持(roi1 和 roi2,由stereoRectify函数产生);

(4) BM 算法和 GC 算法的核心代码改动不大,主要是面向多线程运算方面的(由 OpenMP 转向 Intel TBB);

(5) cvFindStereoCorrespondenceBM 函数的disparity参数的数据格式新增了 CV_32F 的支持,这种格式的数据给出实际视差,而 2.0 版只支持 CV_16S,需要除以 16.0 才能得到实际的视差数值。

11.2

十二、双目标定效果不好的原因分析

(1)OpenCV双目标定的内参结果稍差于Matlab(来自[文献3])

(2)提高标定结果的精度和稳定性的方法(来自[文献3]):

  • 在抓取图像时,要尽量让标定板占满整个图像画面;

    • 标定板拍摄图片不能太少,以20幅左右为宜,且拍摄每幅图片时标定板所在平面与成像平面要有夹角和距离上的变化;
    • 先对左右摄像机单独标定,再利用单独标定结果进行双目标定,标定结果要好于直接利用标定图像进行双目标定。

参考文献

  1. [书籍]学习OpenCV:第十二章 投影与三维视觉
  2. [书籍]基于OpenCV的计算机视觉技术实现
  3. [期刊]基于OpenCV的双目摄像机标定

http://www.doc88.com/p-7502068257943.html

原文地址:https://www.cnblogs.com/zhazhiqiang2018/p/9538986.html

时间: 2024-10-31 18:11:54

双目标定与三维计算:从理论到OpenCV实践的相关文章

HOG:从理论到OpenCV实践

原文 http://blog.csdn.net/zhazhiqiang/article/details/21047207 一.理论 1.HOG特征描述子的定义: locally normalised histogram of gradient orientation in dense overlapping grids,即局部归一化的梯度方向直方图,是一种对图像局部重叠区域的密集型描述符, 它通过计算局部区域的梯度方向直方图来构成特征. 2.本质: Histogram of Oriented G

双目标定

双目摄像机标定最主要的目的:是要得求出每个摄像机的相机内参数矩阵K和畸变系数矩阵D,左右两个摄像机的相对位置关系(即右摄像头相对于左摄像头的平移向量 t和旋转矩阵R). 由于OpenCV中StereoCalibrate标定的结果极其不稳定,甚至会得到很夸张的结果,所以决定Matlab标定工具箱立体标定,再将标定的结果读入OpenCV,来进行后续图像校准和匹配. [1]首先对左右摄像头分别进行标定,得到两个摄像头各自的内参矩阵和畸变参数向量. 注意事项: 1. 采集棋盘图的时候要注意,尽量让棋盘占

matlab、opencv、halcon双目标定汇总

相机的标定对于测距和重建还是很重要的,特把用过的工具和方法进行一次汇总,以便查阅.分析和讨论(本人扣扣1256635840) ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 1.MATLAB camera calib

双目标定精度

双目标定精度和RGB相比怎么样? 双目精度可以参考: Method for measuring stereo camera depth accuracy based onstereoscopic vision 这篇文章测量最大误差大概是在5cm左右,当然受到很多其他因素影响,这里只是一个参考值 RGBD可以参考 Measuring Depth Accuracy in RGBD Cameras 距离三米大概在16mm左右 但是因为项目需要用的双目,而且RGBD在使用时还要做深度图和色彩图匹配,因为

RHCS集群理论暨最佳实践

RHCS集群理论暨 最佳实践 什么是集群?     集群是一组(>2)相互独立的,通过高速网络互联的计算机组成的集合.群集一般可以分为科学集群,负载均衡集群,高可用性集群三大类.     科学集群是并行计算的基础.它对外就好象一个超级计算机,这种计算机内部由十至上万个独立处理器组成,并且在公共消息传递层上进行通信以运行并发应用程序,像中国的银河,曙光超级计算机.     高可用性集群,当集群中的一个系统发生故障时,集群软件迅速作出反应,将该系统的任务分配至集群中其它正在工作的系统上执行,通过消除

51信用卡金融风控场景下实时计算引擎的设计与实践

https://mp.weixin.qq.com/s/Rx43XfhgdwerQWLn1eI3Ww 51信用卡金融风控场景下实时计算引擎的设计与实践 原创: 周来 51NB技术 5月7日 原文地址:https://www.cnblogs.com/yuanjiangw/p/10961583.html

【opencv学习】使用opencv与两个摄像头实现双目标定与测距

目录 目录 说明 之前文章中的双目测距代码 效果更好的双目视觉代码 效果更好的双目视觉代码的实现 1 标定过程 2 测距过程 一些问题以及解决方法 要说的 1 说明 我之前写过一篇文章<完全基于opencv的双目景深与测距的实现>:http://blog.csdn.net/hysteric314/article/details/50456570 但是之前文章中的双目视觉代码并不完善,所以就想再找找看有没有更好的实现方法. 然后就在youtube上找到一个视频:https://www.youtu

halcon双目标定 1

寒假回家真是杂事多. 几个经验 : 1.标定助手能够对一个单独的摄像头标定,图形化,很容易. 2.标定要固定摄像头建立的坐标系才有意义. 3.标定板精度不高可以用纸: gen_caltab( : : XNum,YNum,MarkDist,DiameterRatio,CalTabDescrFile,CalTabPSFile : ) XNum                  每行黑色标志圆点的数量. YNum                  每列黑色标志圆点的数量. MarkDist      

『科学计算_理论』优化算法:梯度下降法&amp;牛顿法

梯度下降法 梯度下降法用来求解目标函数的极值.这个极值是给定模型给定数据之后在参数空间中搜索找到的.迭代过程为: 可以看出,梯度下降法更新参数的方式为目标函数在当前参数取值下的梯度值,前面再加上一个步长控制参数alpha.梯度下降法通常用一个三维图来展示,迭代过程就好像在不断地下坡,最终到达坡底.为了更形象地理解,也为了和牛顿法比较,这里我用一个二维图来表示: 懒得画图了直接用这个展示一下.在二维图中,梯度就相当于凸函数切线的斜率,横坐标就是每次迭代的参数,纵坐标是目标函数的取值.每次迭代的过程