双目标定与三维计算:从理论到OpenCV实践
Posted zhazhiqiang2018
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双目标定与三维计算:从理论到OpenCV实践相关的知识,希望对你有一定的参考价值。
一、双目立体成像主要步骤
二、三角测量
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幅左右为宜,且拍摄每幅图片时标定板所在平面与成像平面要有夹角和距离上的变化;
-
先对左右摄像机单独标定,再利用单独标定结果进行双目标定,标定结果要好于直接利用标定图像进行双目标定。
-
参考文献
-
[书籍]学习OpenCV:第十二章 投影与三维视觉
-
[书籍]基于OpenCV的计算机视觉技术实现
-
[期刊]基于OpenCV的双目摄像机标定
http://www.doc88.com/p-7502068257943.html
以上是关于双目标定与三维计算:从理论到OpenCV实践的主要内容,如果未能解决你的问题,请参考以下文章