双目视觉学习总结(2)——立体标定
2015-10-07 21:06
253 查看
1.立体标定的目标
立体标定是计算空间上两台摄像机几何关系的过程,目的是计算双目视觉系统中两台摄像机之间的相对位置关系,即求取两台摄像机之间的旋转矩阵R和平移矩阵T。
2.立体成像
模仿人眼的立体成像能力,双目视觉可以将视差重投影成物体距离光心的距离。
图2.1 立体成像简单原理
xl和xr分别代表某个点在左图像的x左边和在右图像的x左边,假设左右图像上这两点是匹配好的特征对应点,d=xl - xr就是视差。这时利用相似三角形原理就可以求出Z值。
利用相似三角形原理得(T - (xl - xr)) / (Z - f)=T / Z 求得 Z=f * T / (xl - xr)。
3.对极几何
立体成像的基本几何学就是对极几何。从本质上来说,对极几何就是将两个针孔模型和一些新的被称为极点的感兴趣点结合起来。极面就是观测点P与两个投影中心Ol和Or确定的面,极点就是投影中心的连线与两个投影面的交点。如图所示。
图2.2 对极几何图示
根据对极几何的性质,知道给定图像上的一个特征,它在另一幅图像上的匹配视图一定在对应的极线上。这就是“对极约束”。“对极约束”意味着,一旦我们知道立体试验台的对极几何之后,两幅图像之间匹配特征的二维搜索就转变为沿着极线的一维搜索。这不仅仅节省了大量的计算时间,还允许我们排出许多导致虚假匹配的点。
3.立体校正
为了使立体匹配步骤更加容易并且更加精准,立体校正是必须的,基于对极几何立体校正将左右两幅图像调整为完全的行对准,当两幅图像是完全的行对准时,计算立体视差是最简单的。立体校正的目的是对两台摄像头的图像平面重投影,是的它们精准落在同一个平面上,而且图像的行也完全地对准到前向平行的结构上。
本征矩阵的意义就是将两个相机拍摄的同一点的两个相机坐标系下的坐标联系起来,而基础矩阵就是将同一点在两个像平面坐标系下的坐标联系起来。
关于本征矩阵和基础矩阵的东西,想知道详情的可以自行阅读《学习opencv》。
4.opencv代码示例
(部分代码,仅供参考)
ps: 文章内容大量摘自《学习opencv》,想要了解更多可以去读这本书。
立体标定是计算空间上两台摄像机几何关系的过程,目的是计算双目视觉系统中两台摄像机之间的相对位置关系,即求取两台摄像机之间的旋转矩阵R和平移矩阵T。
2.立体成像
模仿人眼的立体成像能力,双目视觉可以将视差重投影成物体距离光心的距离。
图2.1 立体成像简单原理
xl和xr分别代表某个点在左图像的x左边和在右图像的x左边,假设左右图像上这两点是匹配好的特征对应点,d=xl - xr就是视差。这时利用相似三角形原理就可以求出Z值。
利用相似三角形原理得(T - (xl - xr)) / (Z - f)=T / Z 求得 Z=f * T / (xl - xr)。
3.对极几何
立体成像的基本几何学就是对极几何。从本质上来说,对极几何就是将两个针孔模型和一些新的被称为极点的感兴趣点结合起来。极面就是观测点P与两个投影中心Ol和Or确定的面,极点就是投影中心的连线与两个投影面的交点。如图所示。
图2.2 对极几何图示
根据对极几何的性质,知道给定图像上的一个特征,它在另一幅图像上的匹配视图一定在对应的极线上。这就是“对极约束”。“对极约束”意味着,一旦我们知道立体试验台的对极几何之后,两幅图像之间匹配特征的二维搜索就转变为沿着极线的一维搜索。这不仅仅节省了大量的计算时间,还允许我们排出许多导致虚假匹配的点。
3.立体校正
为了使立体匹配步骤更加容易并且更加精准,立体校正是必须的,基于对极几何立体校正将左右两幅图像调整为完全的行对准,当两幅图像是完全的行对准时,计算立体视差是最简单的。立体校正的目的是对两台摄像头的图像平面重投影,是的它们精准落在同一个平面上,而且图像的行也完全地对准到前向平行的结构上。
本征矩阵的意义就是将两个相机拍摄的同一点的两个相机坐标系下的坐标联系起来,而基础矩阵就是将同一点在两个像平面坐标系下的坐标联系起来。
关于本征矩阵和基础矩阵的东西,想知道详情的可以自行阅读《学习opencv》。
4.opencv代码示例
(部分代码,仅供参考)
bool StereoCalibration::getStereoResult(StereoResult* &sr) { Mat R,T,E,F,R1,R2,P1,P2,Q; Rect validRoi[2]; if(objectPoints.size() == 0) { return false; } double rms = stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1], cameraMatrix[0], distCoeffs[0], cameraMatrix[1], distCoeffs[1], imgSize, R, T, E, F, TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, DBL_EPSILON), CV_CALIB_FIX_INTRINSIC); stereoRectify(cameraMatrix[0], distCoeffs[0], cameraMatrix[1], distCoeffs[1], imgSize, R, T, R1, R2, P1, P2, Q, 0,0, imgSize, &validRoi[0], &validRoi[1]); sr=new StereoResult(R,T,E,F,R1,R2,P1,P2,Q); return true; }
ps: 文章内容大量摘自《学习opencv》,想要了解更多可以去读这本书。
相关文章推荐
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- OpenCV 2.4.3 C++ 平滑处理分析
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python结合opencv实现人脸检测与跟踪
- 在树莓派2或树莓派B+上安装Python和OpenCV的教程
- OpenCV配置,从来没有这么简单!
- ubuntu下opencv和qt的安装配置
- OpenCV学习笔记(二十五)——OpenCV图形界面设计Qt+VS2008
- 分享一些OpenCV实现立体视觉的经验
- 关于OpenCv图像变换与基本图形检测
- "应用程序正常初始化失败"-0xc0150002 解决办法
- OpenCV->HSV色彩空间
- opencv 内存泄露
- OpenCV函数cvFindContours
- OpenCV 2.3.1图像文件的读入和显示
- opencv2 矩阵方式 resize图像缩放代码
- OpenCV 灰度直方图
- 彩色图转为灰度图