先给出求视觉深度的算法流程图:
摄像头标定:
摄像机标定的过程得出摄像机几何模型,给出透镜的畸变模型,这两个模型定义了摄像机的内参数模型。
摄像机几何模型:
针孔模型:
(Learning Opencv中的此环节各种名词的定义很混乱,在下面做一个统一)
成像平面:针孔平面。
图像平面:投影平面。
光轴:穿过针孔,与针孔平面垂直的直线。
焦距:针孔到图像平面距离。
针孔:投影中心。
主点:光轴与图像平面的焦点。
Z:针孔到物体的距离。
成像仪的中心:芯片感光阵列的中心点,图片的像素中心点。
由三角形相似
这个公式显示的图像是倒立的,为了便于计算,将针孔模型转化为计算模型,具体做法是交换图像平面与成像平面。
计算模型
若光轴与成像仪的交点刚好是图像平面的主点。那么得到的公式是:
但是这种情况在实际中几乎是不可能的。因此引入两个新的参数Cx,Cy,对可能的偏移进行建模。
最终得到的公式是:
方法1:Learning Opencv的第11章
利用函数cvCalibrateCamera2()
方法2:Learning Opencv的第12章
利用函数cvStereoRectify();
求视觉深度,首先必须得看懂这个图
Cxleft和Cxright:像平面的像主点
Ol,Or:投影中心,针孔模型中的针孔。
T:投影中心间距
f:两个摄像头的焦距
d:两幅图像的视差
由三角形相似
由该公式可以看出,将求视觉深度转化为求两幅图像的视差。
然而在实际情况中,两个摄像头不可能严格地向前平行对准,当摄像头不向前平行对准时,会出现一个新的感兴趣点,称之为极点。(el,er)。
实际点P与两个极点构成的面,称为极面。
实际点P在投影面上的投影点称为,投影点,投影点与极点的连线称为极线。
该图呈现的便是立体成像的基本几何学:对极几何。
每一个物理世界的3D点,都对应一个极面,两条极线。由对极几何的定义可知,pl的匹配视图pr,一定在对应的极线上。于是便可以将二维收索转化为在沿着极线的一维搜索。
对极几何的意义在于,减少特征匹配的计算量,并且排除虚假匹配的点。
立体标定:计算空间上两台摄像机几何关系的过程。
立体校正:对个体图像进行纠正的过程。
如何计算极线?
计算极线需要知道两个摄像机的物理相对关系和像素相对关系,需要用到两个矩阵
基础矩阵和本征矩阵的对应关系
基础矩阵的计算:cvFindamentalmat();也可以通过cvStereoCalibrate()函数得来。
由基础矩阵计算极线。
cvComputeCorrespondEpilines();
根据得到的极线来立体校正图像。
立体匹配,匹配两个不同摄像机视图的3D点,计算视差。
使用cvPerspectiveTransform()或者成vReprojectImageTo3D();得到视觉深度。
Opencv打开指定摄像头