立体视觉BM算法原理
硬件准备
首先需要将两个摄像头固定起来就可以了。由于摄像头自身有畸变,两个摄像头不是平行的,前后不一致之类的需要进行参数标定,这个太简单就不说了。注意几点:
- BM和SGBM算法对参数敏感,一定要耐心调节参数
- 摄像头一定要标定
- 这些立体算法对光照敏感
BM算法实现原理
这种算法实现起来的优点就是快,缺点是深度图的效果不是很好。BM算法只能对8为灰度图像计算视差。大概时这种效果,我采集的是视频,BM对视频的每一帧进行处理。
BM算法原理是将两个摄像头的的帧分成很多的小方块来机型匹配,通过移动小方块来匹配另一个图中的小方块,通过发现不同小方块在另一个图像中的像素点位置在结合两个摄像头的关系数据(标定的参数中的translate 和rotation矩阵)来计算出物体的实际深度从而生成相应的深度图。
算法概述
具体一点的解释就是,BM算法会将当前的帧划分为很多小块,将每个小块与另一个摄像头采集的小块进行比较,这个过程是将这个小块进行移动比对得到的。移动的过程就是通过创建一个向量来模拟小块从一个位置运行到另一个位置的运动。
left_wtemplate_crop.png然后在另一张图中横向查找显示的像素块
right_wsearch_crop.png
找到了之后我们就得到呢同一个块在两个图中的像素距离,这个时候我们用类似三角测距的方式就可以获取这个像素块在真实世界中的距离。
stereo_depth.jpg
那么如何匹配像素块呢?
上述基本上是一个简化版的BM算法概述,在上述的介绍中一直遗漏了一个问题, 移动的过程中如何知道两个块是相似的呢?这是通过计算小方块内计算像素点矩阵的 SAD(绝对差之和来实现的)
在计算视差图之前,我们会见两个图转化成灰度图,这样每个像素点我们只有一个值[0-255],也就是单通道的,正常的数据是BRG数据也就是[0-255,0-255,0-255]这样的。
为了计算SAD,我们需要对每个像素块提取然后找到计算,通过相减当我们得到一个越小的SAD值就代表两个像素块约相似,相信看了下面这个图就懂了:
sadillustration.png
BM算法参数的实际意义
20161010163041923.pngBM算法使用OPENCV的实现的方法在网上有很多,这里不再赘述。
本文作者熊冰,个人网站Bing的天涯路,转载请注明出处。