- 2.1 主光线在无穷远处相交
- 2.2 主光线在有限距离内相交
- 2.3 深度与视差
- 2.4 双目立体坐标系
- 2.5 实际情况的双目
- 3.1 对极几何的定义
- 3.2 极点极线极面的定义
- 3.3 对极几何的一些结论
- 4.1 基本信息
- 4.2 两者区别
- 4.3 本征矩阵 E 的表达式
- 4.4 基础矩阵 F 的表达式
- 4.5 基础矩阵 F 的求解算法
- 6.1 立体标定目的
- 6.2 R 和 T 理论到 OpenCV 求解
- 7.1 立体校正目的
- 7.2 八个校正项
- 7.3 两种校正算法
- 7.4 校正映射
- 10.1 双目标定流程与对应主要函数
- 10.2 主要相关函数详解
- 10.3 双目标定示例代码
- 11.1 2.1 版增强了 Stereo Vision 方面的功能
双目标定与三维计算:从理论到 OpenCV 实践
2.1 主光线在无穷远处相交
2.2 主光线在有限距离内相交
2.3 深度与视差
2.4 双目立体坐标系
2.5 实际情况的双目
3.1 对极几何的定义
立体成像的基本几何学就是对极几何。
对极几何就是将两个针孔模型和极点结合起来。
3.2 极点极线极面的定义
3.3 对极几何的一些结论
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 坐标。
结果:
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 双目标定示例代码
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
https://www.cnblogs.com/zhazhiqiang2018/p/9538986.html