双目视觉算法简介

http://blog.csdn.net/u010784534/article/details/50437612

转载自:http://blog.sina.com.cn/s/blog_4a540be60102v44s.html

1. 双目视觉算法简介

1.1. 双目视觉简介

双目视觉广泛应用在机器人导航,精密工业测量、物体识别、虚拟现实、场景重建,勘测领域。

什么是双目视觉?

双目视觉是模拟人类视觉原理,使用计算机被动感知距离的方法。从两个或者多个点观察一个物体,获取在不同视角下的图像,根据图像之间像素的匹配关系,通过三角测量原理计算出像素之间的偏移来获取物体的三维信息。

得到了物体的景深信息,就可以计算出物体与相机之间的实际距离,物体3维大小,两点之间实际距离。目前也有很多研究机构进行3维物体识别,来解决2D算法无法处理遮挡,姿态变化的问题,提高物体的识别率。

1.2. 算法一般流程

图1 双目视觉算法流程

1.2.1. 离线标定

标定的目的是获取相机的内参(焦距,图像中心,畸变系数等)和外参(R(旋转)矩阵T(平移)矩阵,用于对其两个相机)。目前比较常用的方法为张正友的棋盘格标定方法,OpenCV和Matlab上均有实现。但是一般为了获取更高的标定精度,采用工业级的(60*60格子)玻璃面板效果会更好。并且有人也建议使用Matlab,因为精度包括可视化效果会更好一些,并且Matlab的结果保存为xml,Opencv也可以直接读入,但是步骤相对于Opencv的麻烦了一些。这是Matlab标定工具箱的连接:http://www.vision.caltech.edu/bouguetj/calib_doc/

步骤为:

(1)左摄像头标定,获取内外参数。

(2)右参数摄像头标定获取外参。

(3) 双目标定,获取相机之间的平移旋转关系。

图2  Matlab双目视觉标定

1.2.2. 双目矫正

矫正的目的是得到的参考图与目标图之间,只存在X方向上的差异。提高视差计算的准确性。

矫正分为两个步骤

l  畸变矫正

图3 畸变矫正

l  将相机转化为标准形式

图4 转换为标准形式

因为矫正部分,会对图像所有点的位置进行重新计算,因而算法处理的分辨率越大耗时越大,而且一般需要实时处理两张图像。而且这种算法并行化强标准化程度较高,建议使用IVE进行硬化,类似Opencv中的加速模式,先得到映射Map,再并行化使用映射Map重新得到像素位置。Opencv中的矫正函数为cvStereoRectify。

1.2.3. 双目匹配

双目匹配是双目深度估计的核心部分,发展了很多年,也有非常多的算法,主要目的是计算参考图与目标图之间像素的相对匹配关系,主要分为局部和非局部的算法。一般有下面几个步骤。

l  匹配误差计算

l  误差集成

l  视差图计算/优化

l  视差图矫正

一般局部算法,使用固定大小或者非固定大小窗口,计算与之所在一行的最优匹配位置。如下图为最简单的局部方式,求一行最佳对应点位置,左右视图X坐标位置差异为视差图。为了增加噪声,光照的鲁棒性可以使用固定窗口进行匹配,也可以对图像使用LBP变换之后再进行匹配。一般的匹配损失计算函数有:SAD,SSD,NCC等。一般采用最大视差也可以限制最大搜索范围,也可以使用积分图和Box Filter进行加速计算。目前效果较好的局部匹配算法为基于Guided Filter的使用Box Filter和积分图的双目匹配算法,局部算法易于并行化,计算速度快,但是对于纹理较少的区域效果不佳,一般对图像分割,将图像分为纹理丰富和纹理稀疏的区域,调整匹配窗大小,纹理稀疏使用小窗口,来提高匹配效果。

图5 基于线性搜索的视差计算

非局部的匹配算法,将搜索视差的任务看做最小化一个确定的基于全部双目匹配对的损失函数,求该损失函数的最小值即可得到最佳的视差关系,着重解决图像中不确定区域的匹配问题,主要有动态规划(Dynamic Programming),信任传播(Blief Propagation),图割算法(Graph Cut)。目前效果最好的也是图割算法,Opencv中提供的图割算法匹配耗时很大。

图割算法主要是为了解决动态规划算法不能融合水平和竖直方向连续性约束的问题,将匹配问题看成是利用这些约束在图像中寻求最小割问题。

图6 基于图割(左),动态规划(中),相关性计算(右)的效果。

因为考虑到全局能量最小化,非局部算法一般耗时较大,不太好使用硬件加速。但是对于遮挡,纹理稀疏的情况解决的较好。

得到了匹配点之后,一般通过左右视线一致性的方式,检测和确定具有高置信度的匹配点。很类似前后向光流匹配的思想,只有通过左右视线一致性检验的点才认为是稳定匹配点。这样也可以找出因为遮挡,噪声,误匹配得到的点。

那么我们如何得到视差和深度信息呢?

关于视差图的后处理,一般采用中值滤波的方法,对当前点的灰度值使用邻域像素的中值来代替,这种方法可以很好去除椒盐噪声。可以去除因为噪声或者弱纹理匹配失败的孤立点。

时间: 2024-10-07 07:04:25

双目视觉算法简介的相关文章

TF-IDF算法简介

TF-IDF算法全称为term frequency–inverse document frequency.TF就是term frequency的缩写,意为词频.IDF则是inverse document frequency的缩写,意为逆文档频率. 该算法在信息处理中通常用来抽取关键词.比如,对一个文章提取关键词作为搜索词,就可以采用TF-IDF算法. 要找出一篇文章中的关键词,通常的思路就是,就是找到出现次数最多的词.如果某个词很重要,它应该在这篇文章中多次出现.于是,我们进行"词频"

最小生成树 kruskal算法简介

生成树--在一个图中的一个联通子图  使得所有的节点都被(访问) 最小生成树 (MST) 即联通子图的总代价(路程)最小 已知的一个图 有n个点 m条边 kruskal的算法如下 先对边从小到大排序 从最小的边起,不停的合并这条边的两个节点到一个集合,如果这条边的两个节点已经在一个集合里,则无视,否则形成回路(显然错误)直到所有的节点并到一个集合里 这里需要用到并查集来合并节点 1 int cmp(const int i,const int j) { 2 return w[i] < w[j];

AES算法简介

AES算法简介 一. AES的结构 1.总体结构 明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位).根据密钥的长度,算法被称为AES-128,AES-192或者AE-256. 2.明文密钥组织方式 3.一些相关的的术语定义和表示 • 状态(State):密码运算的中间结果称为状态. • State的表示:状态用以字节为基本构成元素的矩阵阵列来表示,该阵列有4行,列数记为Nb. Nb=分组长度(bits)÷ 32.Nb可以取的值为4,对应的分组长

Java哈希散列算法简介 - MD5 &amp; SHA-512

Java哈希散列算法简介 - MD5 & SHA-512 在日常的开发工作中,我们常常会碰到这样的一个场景:我们需要有一种可靠的行之有效的方法来检验跟判断数据在传输过程当中的完整性.最常见的一种情况就是当我们传输文件的时候,由于网络故障或者其他的一些因素,可能会出现我们下载下来的文件不完整,这给我们日常的开发和维护带了一些难题:另外的一个较为常用的场景就是:有没有一种行之有效的方法让我们可以很方便的判断服务器上的文件是不是有最新的数据更新,比如我们现在的移动Hybird App开发,我们经常会发

MD5算法 简介

MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能 l 输入任意长度的信息,经过处理,输出为128位的信息(数字指纹): l 不同的输入得到的不同的结果(唯一性): l 根据128位的输出结果不可能反推出输入的信息(不可逆): MD5用途 1.防止被篡改: 1)比如发送一个电子文档,发送前,我先得到MD5的输出结果a.然后在对方收到电子文档后,对方也得到一个M

算法简介及算法分析

算法简介及算法分析 算法简介 算法的定义: 算法是对特定问题求解步骤的一种描述,是指令的有限序列.(所以说只要满足上述条件,即使很简单的一个循环也是算法) 算法具备5个特征: 输入 输出 有穷性 确定性 可行性 什么是好算法: 正确性 鲁棒性 简单性 抽象分级 高效性 算法分析: 高效性是评价一个算法是否是好算法的重要标准,那么我们怎么判断算法是否高效呢?有的人说,把算法用程序语言实现一下,再输入多个测试数据实际检测运行速度(时间频度)和空间开销就好了呗!这种事后统计的方法并不能准确检测,它牵扯

Java 理论与实践: 非阻塞算法简介--转载

在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情.Java 语言中主要的同步手段就是synchronized 关键字(也称为内在锁),它强制实行互斥,确保执行 synchronized 块的线程的动作,能够被后来执行受相同锁保护的synchronized 块的其他线程看到.在使用得当的时候,内在锁可以让程序做到线程安全,但是在使用锁定保护短的代码路径,而且线程频繁地争用锁的时候,锁定可能成为相当繁重的操作. 在 “流行的原子” 一文中,我们研究了原子

学习排序算法简介

学习排序算法简介 学习排序(Learning to Rank, LTR)是一类基于机器学习方法的排序算法. 传统经典的模型,例如基于TFIDF特征的VSM模型,很难融入多种特征,也就是除了TFIDF特征之外,就无法融入其他种类的特征了. 而机器学习的方法很容易融合多种特征,而且有成熟深厚的理论基础,参数也是通过迭代计算出来的,有一套成熟理论来解决稀疏.过拟合等问题. LTR方法大致可以分成三类: 1) Pointwise 单文档方法 2) Pairwise 文档对方法 3) Listwise 文

爬山算法和模拟退火算法简介(转)

源:爬山算法和模拟退火算法简介 一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解. 图1 二. 模拟退火(SA,Simulated Anne