3 opencv 实现双目测距的原理
上面就是双目视觉的简单原理介绍,公式什么的不想往上写了,跟实现什么的也没多大关系。*
原理归原理,用 opencv 实现双目视觉的时候就是又一码事了。*
在 opencv 上实现双目测距主要步骤是:
1.双目校正和标定,获得摄像头的参数矩阵:*
进行标定得出俩摄像头的参数矩阵*
cvStereoRectify 执行双目校正*
initUndistortRectifyMap 分别生成两个图像校正所需的像素映射矩阵*
cvremap 分别对两个图像进行校正
2.立体匹配,获得视差图:*
stereoBM 生成视差图*
预处理:*图像归一化,减少亮度差别,增强纹理*
匹配过程:*滑动 sad 窗口,沿着水平线进行匹配搜索,由于校正后左右图片平行,左图的特征可以
在右图对应行找到最佳匹配*
再过滤:*去除坏的匹配点*通过 uniquenessratio
输出视差图 disparity:如果左右匹配点比较稠密,匹配点多,得到的图像与原图相似度比较大,*
如果匹配点比较稀疏,得到的点与原图*相似度比较小
3.得出测距:
把生成的视差图输入*reprojectImageTo3D()函数,生成 3D 点云,3D 点云中保存有 2D 图像
的三维坐标,再读出每帧图像的三维坐标中的 z 轴的值,就得出了距离数据。
4 双目测距代码说明
我的这个双目程序写是很简单和普通,部分关键代码借鉴了大神的代码,其实说是代码其实只不过
是某些 opencv 函数的使用方式而已,在大体上还是有很大的不同:
首先大神的程序整个都是基于 MFC 的,这样做的话如果你想移植到 arm 板子上或是 linux 系统上
就会很麻烦,所以我把整个程序包括图像显示,视差图显示,距离显示等都完全使用 opencv 的函
数来实现。
再者,在大神的程序中输出距离的方式,我的理解是,首先得检测到最近的物体的轮廓,然后在三
维点云中提取出这个轮廓的距离坐标。但是实现起来不是很理想,如果视差图的质量不高,根本检
测不到轮廓,不会触发这个函数,更别提距离了。所以在我的程序中,得出距离的方式是用鼠标点
评论1