OpenCV 立体视觉详细解析(二)---视觉深度测量

时间:2023-02-03 08:30:51

先给出求视觉深度的算法流程图:

OpenCV 立体视觉详细解析(二)---视觉深度测量

摄像头标定:

摄像机标定的过程得出摄像机几何模型,给出透镜的畸变模型,这两个模型定义了摄像机的内参数模型。

OpenCV 立体视觉详细解析(二)---视觉深度测量

摄像机几何模型:

针孔模型:

OpenCV 立体视觉详细解析(二)---视觉深度测量

Learning Opencv中的此环节各种名词的定义很混乱,在下面做一个统一)

 

成像平面:针孔平面。

图像平面:投影平面。

光轴:穿过针孔,与针孔平面垂直的直线。

焦距:针孔到图像平面距离。

针孔:投影中心。

主点:光轴与图像平面的焦点。

Z:针孔到物体的距离。

成像仪的中心:芯片感光阵列的中心点,图片的像素中心点。

 

由三角形相似

OpenCV 立体视觉详细解析(二)---视觉深度测量

这个公式显示的图像是倒立的,为了便于计算,将针孔模型转化为计算模型,具体做法是交换图像平面与成像平面。

 

计算模型

OpenCV 立体视觉详细解析(二)---视觉深度测量

若光轴与成像仪的交点刚好是图像平面的主点。那么得到的公式是:

OpenCV 立体视觉详细解析(二)---视觉深度测量                OpenCV 立体视觉详细解析(二)---视觉深度测量

但是这种情况在实际中几乎是不可能的。因此引入两个新的参数CxCy,对可能的偏移进行建模。

最终得到的公式是:

OpenCV 立体视觉详细解析(二)---视觉深度测量


方法1Learning Opencv的第11

利用函数cvCalibrateCamera2()

 

方法2Learning Opencv的第12

利用函数cvStereoRectify();

求视觉深度,首先必须得看懂这个图

OpenCV 立体视觉详细解析(二)---视觉深度测量

CxleftCxright:像平面的像主点

OlOr:投影中心,针孔模型中的针孔。

T:投影中心间距

f:两个摄像头的焦距

d:两幅图像的视差

由三角形相似

OpenCV 立体视觉详细解析(二)---视觉深度测量

由该公式可以看出,将求视觉深度转化为求两幅图像的视差。

 

然而在实际情况中,两个摄像头不可能严格地向前平行对准,当摄像头不向前平行对准时,会出现一个新的感兴趣点,称之为极点。(eler)。

实际点P与两个极点构成的面,称为极面。

实际点P在投影面上的投影点称为,投影点,投影点与极点的连线称为极线。

OpenCV 立体视觉详细解析(二)---视觉深度测量

该图呈现的便是立体成像的基本几何学:对极几何。

 

 

每一个物理世界的3D点,都对应一个极面,两条极线。由对极几何的定义可知,pl的匹配视图pr,一定在对应的极线上。于是便可以将二维收索转化为在沿着极线的一维搜索。

 

对极几何的意义在于,减少特征匹配的计算量,并且排除虚假匹配的点。

 

立体标定:计算空间上两台摄像机几何关系的过程。

立体校正:对个体图像进行纠正的过程。

 

 

如何计算极线?

 

计算极线需要知道两个摄像机的物理相对关系和像素相对关系,需要用到两个矩阵

OpenCV 立体视觉详细解析(二)---视觉深度测量

基础矩阵和本征矩阵的对应关系

基础矩阵的计算:cvFindamentalmat();也可以通过cvStereoCalibrate()函数得来。

 

 

 

由基础矩阵计算极线。

cvComputeCorrespondEpilines();

 

根据得到的极线来立体校正图像。

 

立体匹配,匹配两个不同摄像机视图的3D点,计算视差。

 

使用cvPerspectiveTransform()或者成vReprojectImageTo3D();得到视觉深度。

 

 

 

Opencv打开指定摄像头

OpenCV 立体视觉详细解析(二)---视觉深度测量


OpenCV 立体视觉详细解析(二)---视觉深度测量