码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-08-26 22:02:16      阅读:464      评论:0      收藏:0      [点我收藏+]

标签:学习   测量   序列   目标   rect   ati   stat   find   transform   

双目标定与三维计算:从理论到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 RT理论到OpenCV求解    11

6.2.1 OpenCV处理函数    11

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

6.2.3 RT的理论推导    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

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

标签:学习   测量   序列   目标   rect   ati   stat   find   transform   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!