一种半全局实时立体匹配方法与流程

文档序号:18838642发布日期:2019-10-09 06:28阅读:555来源:国知局
一种半全局实时立体匹配方法与流程

本发明涉及计算机视觉的立体视觉的技术领域,特别涉及一种半全局实时立体匹配方法。



背景技术:

受人类视觉的影响,计算机想要感知真实世界,必须从外界获得感知信息,因此计算机也需要有“双眼”,这也是双目视觉的目的,通过左右两个焦距一致的摄像机,同时采集一系列的左右图像,在对相机的标定和图片极线对齐后,可以通过对两张图片进行相似度匹配,得到视差信息,从而还原真实的三维世界。立体匹配是其中重要的组成部分,障碍物识别、三维地图重建等关键技术都无法脱离立体匹配提供的视差深度信息,只有提供准确的三维信息,才能感知还原出准确的道路场景,这也是辅助驾驶的安全性保障。

已有的立体匹配算法主要分为局部,半全局,全局和基于深度学习几种算法。其中,基于局部的匹配算法一般是基于特征匹配,速度快,精度很低,并且生成的是稀疏的视差图。基于全局的算法,比如置信度传播算法,图割算法等精度较高,但速度慢。基于深度学习的算法需要大量的训练数据,对于配置要求高,精度较高,速度慢。可见,已有技术无法兼顾精度,输出实时的视差图。



技术实现要素:

本发明实施例提供的一种半全局实时立体匹配方法,解决已有技术无法兼顾精度,输出实时的视差图的问题。

根据本发明实施例提供的一种半全局实时立体匹配方法,包括:

census转换步骤,用于将左右图像的每个像素点的灰度值转换为字符串;

对比代价确定步骤,用于根据所述左右图像的所述每个像素点的字符串确定左图像或右图像的每个像素点的对比代价;

路径代价确定步骤,用于根据所述每个像素点的对比代价,确定所述每个像素点在多个方向路径的路径代价;

wta步骤,用于将所述多个方向路径的路径代价进行聚合,并确定聚合结果中的最小值对应的视差值;

其中,在所述census转换步骤中,利用开放运算语言opencl的用于census转换的工作组,将所述左右图像从全局内存复制到所述用于census转换的工作组的局部内存之后,所述用于census转换的工作组中的每个工作项根据每个像素点与其周围若干个像素点的灰度值的比较结果,将所述每个像素点的灰度值转换为字符串,并保存至所述全局内存。

优选地,在所述对比代价确定步骤中,利用opencl的用于确定对比代价的工作组,将所述每个像素点的字符串从全局内存复制到所述用于确定对比代价的工作组的局部内存之后,所述用于确定对比代价的工作组中的每个工作项在设定的视差搜索范围内对所述左右图像的对应像素点的字符串进行异或操作,得到汉明码作为对比代价,并保存至全局内存。

优选地,在所述路径代价确定步骤中,利用opencl的用于确定路径代价的工作组,将所述每个像素点的对比代价从全局内存复制到所述用于确定路径代价的工作组的局部内存之后,所述用于确定路径代价的工作组根据相应像素点的对比代价,确定多个方向路径的路径代价,并保存至全局内存。

优选地,所述用于确定路径代价的工作组包括分别对应于不同方向路径的多个工作组,所述多个工作组按照串行方式确定各自对应方向路径的路径代价,每个工作组中的每个工作项按照并行方式确定每个像素点的路径代价。

优选地,在所述wta步骤中,利用opencl的用于确定视差的工作组,将所述每个像素点的多个方向路径的路径代价从全局内存复制到所述用于确定视差的工作组的局部内存之后,所述用于确定视差的工作组中的每个工作项将相应像素点的多个方向路径的路径代价相加,得到能量函数值,在所述视差搜索范围内对所述能量函数值进行比较,得到最小值对应的视差值。

优选地,在所述wta步骤之后,还包括:

中值滤波步骤,用于将所述每个像素点的视差值进行中值滤波。

优选地,在所述中值滤波步骤中,利用opencl的用于中值滤波的工作组,将所述每个像素点的视差值从全局内存复制到所述用于中值滤波的工作组的局部内存之后,所述用于中值滤波的工作组中的每个工作项将相应像素点及其周围若干个像素点的视差值进行排序,并将排序后的中间值作为所述像素点的新视差值,并保存至所述全局内存。

优选地,在所述中值滤波步骤之后,还包括:

lrc检查步骤,用于对所述左右图像进行遮挡检查,并根据检查结果,调整中值滤波后得到的视差值。

优选地,在所述lrc检查步骤中,利用opencl的用于lrc检查的工作组,将所述每个像素点的中值滤波后的视差值从全局内存复制到所述用于lrc检查的工作组的局部内存之后,所述用于lrc检查的工作组中的每个工作项对所述左右图像进行遮挡检查,若检查出某一像素点为遮挡点,则将所述像素点的视差值设置为0,并保存至全局内存。

优选地,所述census转换步骤、所述对比代价确定步骤、所述路径代价确定步骤、所述wta步骤、所述中值滤波步骤和所述lrc检查步骤中的至少一个运行于gpu或dsp或fpga。

本发明实施例提供的技术方案具有如下有益效果:

本发明实施例采用半全局立体匹配算法,在匹配的速度和精度上达到基本平衡,并通过opencl,使半全局立体匹配的运算速度大幅度提升,能够得到实时的视差结果图,并且适用在各个平台。

附图说明

图1是本发明实施例提供的半全局实时立体匹配流程图;

图2是本发明实施例提供的整套算法的流程图;

图3是本发明实施例提供的基于opencl的路径聚合内核函数的设计和线程分配示意图;

图4是本发明实施例提供的基于opencl的最终生成的视差图;

图5是本发明实施例提供的cpu和gpu端的时间对比图;

图6是本发明实施例提供的跨平台的gpu时间对比。

具体实施方式

以下结合附图对本发明的优选实施例进行详细说明,应当理解,以下所说明的优选实施例仅用于说明和解释本发明,并不用于限定本发明。

图1是本发明实施例提供的半全局实时立体匹配流程图,如图1所示,步骤包括:

步骤s101:census转换步骤,用于将左右图像的每个像素点的灰度值转换为字符串。

本发明实施例采用opencl实现步骤s101的并行化设计,加快处理速度。具体地说,利用opencl的用于census转换的工作组,将所述左右图像(例如大小为width*height)从全局内存复制到所述用于census转换的工作组的局部内存之后,所述用于census转换的工作组中的每个工作项根据每个像素点与其周围若干个像素点的灰度值的比较结果,将所述每个像素点的灰度值转换为字符串,并保存至所述全局内存。

例如,在opencl方面,选择16*16大小的工作组,每个像素对应所述工作组中的一个工作项进行census转换,使并行的占用率最大化。

其中,census转换是指将一个像素点转换成字符串,字符串长短与选择的像素块有关,例如,选择3*3的像素块,将中间像素点的灰度值与其周围8个像素点的灰度值进行比较,若中间像素点的灰度值大于其周围像素点的灰度值,则记为0,反之记为1,按照预定顺序将比较结果进行排序,得到8位字符串。

本发明实施例的所述用于census转换的工作组内的每个工作项同步,均执行同一条指令,合并访问全局内存中连续的单元,提高了带宽利用率,并利用所述用于census转换的工作组的局部内存提高数据读取速度。

步骤s102:对比代价确定步骤,用于根据所述左右图像的所述每个像素点的字符串确定左图像或右图像的每个像素点的对比代价。

本发明实施例采用opencl实现步骤s102的并行化设计,加快处理速度。具体地说,利用opencl的用于确定对比代价的工作组,将所述每个像素点的字符串从全局内存复制到所述用于确定对比代价的工作组的局部内存之后,所述用于确定对比代价的工作组中的每个工作项在设定的视差搜索范围内对所述左右图像的对应像素点的字符串进行异或操作,得到汉明码作为对比代价,并保存至全局内存。

例如,在opencl方面,为需要在视差搜索范围内进行比较,本实施例可以设定视差搜索范围为128,比较两种工作组和二维索引空间之后,发现可以采用128*2的工作组,该工作组的每个工作项计算width除以128个像素的对比代价,提高运算速度。

其中,本发明实施例通过汉明码距的方式,对于步骤s101中得到的左右图像每个像素的字符串,在视差搜索范围内进行异或操作,最终得到汉明码距。例如,将左图像中像素点a的字符串与右图像中在视差搜索范围内的每个像素点的字符串(例如像素点b的字符串)进行异或操作,得到新字符串,统计所述新字符串中包含“1”的数量,例如有两个1,则汉明码距为2。

步骤s103:路径代价确定步骤,用于根据所述每个像素点的对比代价,确定所述每个像素点在多个方向路径的路径代价。

本发明实施例采用opencl实现步骤s103的并行化设计,加快处理速度。具体地说,在所述路径代价确定步骤中,利用opencl的用于确定路径代价的工作组,将所述每个像素点的对比代价从全局内存复制到所述用于确定路径代价的工作组的局部内存之后,所述用于确定路径代价的工作组根据相应像素点的对比代价,确定多个方向路径的路径代价,并保存至全局内存。

其中,所述用于确定路径代价的工作组包括分别对应于不同方向路径的多个工作组,所述多个工作组按照串行方式确定各自对应方向路径的路径代价,每个工作组中的每个工作项按照并行方式确定每个像素点的路径代价。

例如,在opencl内核设计方面,使用了32*8的工作组,利用局部内存和工作组的工作项之间同步,提高数据读写速度。利用并行规约的思想,发挥gpu多线程优势,将时间复杂度从n降到了logn。优化数据结构,使用更适宜gpu并行操作的数据结构,最大化减少cpu与gpu通信次数(只有最初cpu向gpu传递左右图像和最后gpu向cpu返回视差矩阵或视差图时进行通信),提高效率。

步骤s104:wta步骤,用于将所述多个方向路径的路径代价进行聚合,并确定聚合结果中的最小值对应的视差值。

本发明实施例采用opencl实现步骤s104的并行化设计,加快处理速度。具体地说,利用opencl的用于确定视差的工作组,将所述每个像素点的多个方向路径的路径代价从全局内存复制到所述用于确定视差的工作组的局部内存之后,所述用于确定视差的工作组中的每个工作项将相应像素点的多个方向路径的路径代价相加,得到能量函数值,在所述视差搜索范围内对所述能量函数值进行比较,得到最小值对应的视差值。

例如,在opencl内核设计方面,使用了32*8的工作组,所述工作组的每个线程将各个方向路径的路径代价(即能量函数)复制到所述用于确定视差的工作组的局部内存,提高运算速度。

在执行步骤s104之后,还包括中值滤波步骤,用于将所述每个像素点的视差值进行中值滤波。本发明实施例采用opencl实现中值滤波步骤的并行化设计,加快处理速度。具体地说,利用opencl的用于中值滤波的工作组,将所述每个像素点的视差值从全局内存复制到所述用于中值滤波的工作组的局部内存之后,所述用于中值滤波的工作组中的每个工作项将相应像素点及其周围若干个像素点的视差值进行排序,并将排序后的中间值作为所述像素点的新视差值,并保存至所述全局内存。

例如,在opencl方面,选择16*16大小的工作组,每个像素对应所述工作组中的一个工作项进行中值滤波处理。

其中,中值滤波是指使用一定大小的像素块的视差的中值替代原像素的视差。例如,对某一像素点a进行中值滤波处理时,选取以像素点a为中心的3*3像素块,对3*3像素块中的9个像素点的视差值进行排序,得到中值(即排序位置为第5的视差值),然后该中值作为像素点a的视差值。

在执行中值滤波步骤之后,还包括:lrc检查步骤,用于对所述左右图像进行遮挡检查,并根据检查结果,调整中值滤波后得到的视差值。本发明实施例采用opencl实现中值滤波步骤的并行化设计,加快处理速度。具体地说,利用opencl的用于lrc检查的工作组,将所述每个像素点的中值滤波后的视差值从全局内存复制到所述用于lrc检查的工作组的局部内存之后,所述用于lrc检查的工作组中的每个工作项对所述左右图像进行遮挡检查,若检查出某一像素点为遮挡点,则将所述像素点的视差值设置为0,并保存至全局内存。例如,在opencl方面,选择16*16大小的工作组,每个像素对应所述工作组中的一个工作项进行lrc检查。

本发明实施例基于平衡性考虑,采用半全局立体匹配算法,速度较快,且精度满足需求。gpgpu是通过gpu进行大规模计算的技术,相较于cpu而言,gpu架构决定了具备更大的计算能力和内存带宽,有高度的并行性,运行于cpu上面的任务是串行架构,只能按照顺序执行,gpu的硬件设计支持多任务共享,将数据和任务并行到每一个线程中同时运行,因此使用gpu并行化加速具有高度的可行性基础,可以极大提高运行效率。但是如果在多种平台(比如gpu,dsp或fpga)上都要实现并行化加速,就需要一个开放式的标准、统一的模型来连接不同的硬件。因此本发明实施例采用opencl,opencl提供了一个可以在不同平台上并行化加速的开放式架构标准,使得开发人员可以遵循一套逻辑体系在不同平台上进行并行化编程,极大的提高了运行效率和降低了移植难度。

因此,本发明实施例利用opencl设计编写各个内核函数,充分利用了gpu的多任务并行模式,相比于传统cpu的串行模式,将半全局立体匹配算法程序运算时间由秒级别降低到毫米级别,能够达到实时的密集匹配。同时,由于采用opencl,因此所述census转换步骤、所述对比代价确定步骤、所述路径代价确定步骤、所述wta步骤、所述中值滤波步骤和所述lrc检查步骤均可以运行于包括gpu、dsp、fpga在内的各种平台,实现并行化加速。

本发明实施例在考虑对比了现有的立体匹配方案的情况下,选择在速度和精度平衡性较好的半全局立体匹配,提出了使用opencl进行跨平台多线程并行化设计,使得速度运算速度有了大幅度提升,能够得到实时的结果图,而且能适用在各个平台,克服了cuda仅仅只能在n卡上使用的缺陷。

本领域普通技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于计算机可读取存储介质中。其中,所述的存储介质可以是但不限于rom、ram、磁碟、光盘或者u盘等存储装置中的一个或者两个以上的组合。

图2是本发明实施例提供的整套算法的流程图,如图2所示,基于opencl实现的跨平台的半全局实时立体匹配步骤包括:

s1.在cpu端对输入图像(左右图像)进行预处理,保证图片矫正并极线对齐。

s2.将图像从cpu传入到gpu端,左右图像的每个像素都进行census转换,像素点由灰度值转换成选定框大小的字符串,保存到gpu端的全局内存中。

s3.设定一个视差搜索范围,搜索整个视差搜索范围内的对应字符串,进行异或操作,得到汉明码距作为初始的匹配代价(即图1所述对比代价)保存在全局内存中。

s4.采用动态规划进行路径聚合,从不同方向依次寻找路径上最小的聚合代价,将结果作为优化后的代价(即图1所述路径代价)保存在新的全局内存中。

s5.wta胜者为王算法从聚合代价中寻找出最小的代价(即图1所述聚合结果中的最小值),并以此找到对应的视差大小,保存在全局内存中。

s6.对已有的视差结果进行中值滤波,减少噪点。

视差结果是一个跟图像大小分辨率一样的矩阵,左右图处理后得到一个视差矩阵。

s7.对左右图像进行lrc左右一致性检查,减少遮挡区域造成的误匹配,将最终结果保存在gpu全局内存中。

s8.数据从gpu传输回cpu端,得到最终的视差图,如图4所示。

现有算法只在cpu上运行,本实施例上述步骤都采用opencl编写,可以跨平台在cpu,gpu,dsp,fpga运行,且速度比cpu提高50倍。

上述算法流程,在opencl端设计了不同的内核函数,采用数据并行的架构,将任务分解到各个线程同时运行,多次使用局部内存以及线程同步的方式优化速度,每一个步骤都会对应opencl的一个内核函数。

opencl程序有宿主机程序和内核程序组成,宿主机程序负责决定了如何与opencl的对象进行交互,编写运行在主机上面,内核程序将输入内存对象进行运算变换成输出内存对象,在设备上执行。宿主机程序发出命令调用内核,会创建一个内核程序对应的索引空间,叫做ndrange,索引空间维度从一维空间到三维空间的选择,取决于需要执行的算法功能。对设备里各个计算节点做标识,并且所有的工作节点都有独一的全局id,同一设备节点都执行相同的内核程序,但是对应不同的输入数据,也会输出不同的结果。opencl还创建了工作组空间,全局空间被划分成各个工作组,所有的工作组对应一个编号,其中节点数量一致,在工作组中的工作节点也有对应的局部id,因此找到对应的id就建立起了虚拟id和物理线程之间的映射关系。

opencl的内存模型主要分为全局内存,局部内存,其中局部内存缓冲区驻留在物理gpu上,读写速度很快,可以保证一个工作组中一组工作项能够看到的值在工作组同步点是一致。全局内存因为gpu与cpu都可以对它进行写操作,速度较慢。因此在opencl编程中,合理设计内核的分配,以及局部内存的使用方式可以有效的提高效率和运行速度。opencl使用了工作组栅栏(work-groupbarrier)进行工作组中的线程同步。要求在栅栏之前定义的所有加载和存储必须先完成,工作组中这个栅栏之后的工作项才能继续,一般会和局部内存搭配出现。任务并行是指对运行的任务进行分解,将复杂的算法任务分解成许多小任务,也就是说把复杂任务分解成可以同时执行的各个任务。工作空间内的每个工作节点在执行内核函数时相对于其他节点是保持绝对独立的,每个工作节点都相当于工作在一个单一的计算单元内。

s1中,先对双目相机进行标定,采集左右图像数据进行预处理,保证图片是经过矫正并且极线对齐的,将视差匹配选择从二维降低到一维,以便将搜索范围从图像的分辨率(100w以上)降低到一个指定的搜索范围(例如,这里是128),然后将图像矩阵从cpu传输到gpu的全局内存中。

s2中,对每个像素选取9*7的像素块进行census转换,输入是图像像素值,输出得到一个字符串(即字符序列或字符串序列)。census变化是图像处理中经常用的一种方式,将选定的一个区域内的像素映射为一个比特串,选择像素的灰度值会被所转换的比特串所代替,得到比特串的方式是由布尔值进行比较。在opencl程序中,选取了16*16的线程块,使用了16x16大小的工作组,对width*height大小的图片,使用数据并行的并行方式,并且采用了((16+8)*(16+6))大小的局部内存,先将数据从全局内存中复制到工作组的局部内存中,在每个工作组将数据从全局内存复制到局部内存后,要使用工作组栅栏同步函数保证复制完毕再进行下面操作。接下来每个工作项对周围的62个像素灰度值进行比较,转换成字符串序列,分两次采取高低位依次比对,最后再结合起来,得到需要的字符串序列。

s3中,本实施例为了速度方面的考虑,选择了运行速度快的汉明码距计算对比代价。输入s2得到左右图像的字符序列,输出左图大小乘以搜索范围的汉明码距,作为一个对比代价。汉明码距指在码组中,相对应的各个码元中不同数值的数量和。通常使用异或操作比较两个字符串或者码组,之后将不同的位个数进行累加,得到汉明码距。对于opencl执行函数采取大小为128*2的工作组,将图像划分为(64*height,2)大小的二维索引空间,每一个工作项负责图像中每128个像素进行一次采样,每个工作项一共会计算宽度除以128个像素的汉明码距,每个工作项的局部id都会在视差搜索范围内,第一次计算必定是在视差范围内,之后定位在对局部id加上视差搜索范围的循环里,也是采取了并行化中常用的归约方法和工作组栅栏进行线程同步,左右字符序列使用异或操作计算汉明码距得到对比代价,减少了分支预判,线程的效率得到了最大化利用,并且采用了循环展开的方式也提高了速度。

s4中,只得到步骤三的对比代价精度不过,因此为了进行优化,本算法使用了dp算法(dynamicprogramming)来计算路径聚合,输入对比代价,输出一个能量函数值作为聚合代价。

其中,公式1的e(d)为一维动态规划图像所匹配到所有像素点的能量值,第一项为上一步骤中得到的对比代价,也就是上一步骤得到的汉明码距,第二项第三项为能量函数的平滑项,np表示p点的周围像素点,因此平滑项表示p点与邻域点q的约束,如果q和p的视差只差了1,那么惩罚p1,如果大于1,那么惩罚p2,这么做基本上是机器学习中的常用方法,即所谓的正则化约束,其中p2大于p1。使用正则化约束目的是确保像素点之间视差值变化较小,过渡平滑,还有则是确定了边缘的分割。惩罚项的大小设定,定义了对于情况出现的接受程度。假设q和邻域点p之间的视差值大小不相等,惩罚项大小则是视视差值差异大小而定,而目的是为了求得能量函数的最小值,因此这两项值都必须小才行。

得到能量函数,需要求解最小值,但是e(d)对p来说是不可导的,使用dp算法减少了算法的复杂度但是想利用动态规划得到一个二维图像的能量函数的最小值是一个np完全问题,因此想到在一维线上进行求解,也就是顺着行和列进行求解,这样子满足多项式时间,也被称之为扫描线优化,但是如果只沿着一行求解,忽略掉行间的约束条件,就会把周围各个方向的点转化成只在某一个方向上的点,效果不好且会产生长尾效应,因此选取多条路径。

其中,公式2所示,s(p,d)表示路径代价的累加值,lr(p,d)则表示r路径的代价值,具体表示为“当前像素点的匹配代价+(路径中相邻点和当前像素点视差值相同的聚合代价,视差相差为1的聚合代价加上惩罚项p1,视差相差大于1的聚合代价加上惩罚项p2)中的最小值,减去路径上邻点的视差大于1的代价聚合值的最小值”。

因此在使用opencl并行化中,如图3展示了三大kernel对横向,竖向和斜方向的并行化线程分配。在路径聚合这一步骤使用了8个内核函数对应8条路径,横向两个,竖方向两个,斜向四个。都使用了32*8大小的工作组,二维索引空间大小则根据内核函数的区别分为图片宽度,高度,斜方向则对应为高度加宽度。使用了局部内存将数据从全局内存复制进来,同步后再执行动态规划算法。在求取最小值时采用并行规约线程同步的方法,将时间复杂度从n下降到logn,并且优化了数据结构,在循环中多次用pragmaunroll指令使得循环充分展开并行操作,提高编译器效率,也最大化的减小了通信次数。

s5中,本实施例采用了wta(winnertakesall,胜者为王)方法在上述步骤s4中的能量函数寻找最小值,wta算法是基于实例的学习算法,模拟了一个决策问题,这种方法是指对现有数据建立一个数据库并且会加入并更新数据,采取一种测量相似性的方法从数据库里找到一个最优匹配,并且是仅有的最优匹配,除此之外的其他所有匹配都舍弃,因此即为名字所说的胜者为王。

基于opencl的内核函数中,本实施例采取了32*8大小的工作组,二维索引空间中每个全局id都对应一个像素,每个线程都会从上一步骤得到的各个方向的能量函数,因为上一步骤中各个路径的内核函数是分开执行在不同的全局内存中,因此首先需要对各个不同路径上的聚合代价进行相加,得到需要的能量函数值,因此将能量函数保存在局部内存中,以提高运算速度,再对视差搜索范围内的能量函数进行比较,得到一个最小值,舍弃其他的视差值,将找到的视差值保存到唯一对应的全局内存中。

s6中,在上一步骤得到初始的视差值之后,需要进行初步的视差值优化,在本文中选择了使用中值滤波进行优化。中值滤波(medianfiltering)通过对选定框大小的各个像素凭借灰度值进行从小到大排序,将排序后的中值用取代原本的像素,是一种常见的图像平滑法,经常用在图像处理中,可以很好地抑制椒盐噪声,并且提高边缘的锐化效果防止被过渡平滑和模糊。

因此在opencl程序设计上采取了和census转换一样的16*16大小的工作组,每个工作项对应一个像素,选择一个3*3大小的块进行中值滤波。每个工作项对9个元素进行从小到大依次排序,选择,最后将中间也就是排在第5个元素的值赋值给原本像素的视差,保存到全局内存中。.

s7中,在立体匹配的左右图像中,经常会因为左右相机拍摄的视角不同而出现遮挡现象。遮挡是指只出现在其中一张图像中,而另一幅图像中不存在的像素点或者区域,遮挡点通常是一块较连续的区域,如果对遮挡区域放任不管不进行一些处理的话,那么会出现较多的误匹配点,因此经常会需要用到左右一致性检测(lrccheck)。左右一致性检测目的是检测到遮挡区域,在右图得到左图被遮挡的图像,减少误匹配区域。

在opencl并行化设计的内核函数,依然采用16*16大小的工作组,使得每个像素点都对应一个全局id,对比左右图像对应点的视差值绝对值,假设左图中的一个点p视差值为d1,那右图中对应的像素点应该是(p-d1),在右图中找到对应点(p-d1)假设视差值为d2,理论上来说d1和d2大小应该相同,我们设置一个阈值,本文设定为1,若|d1-d2|>1,则认为p像素点是遮挡点,并将视差值d1设置为0,保存在全局内存中。

s8中,已经得到了一个由每个像素的视差值构成的视差矩阵,保存在gpu的全局内存中,因此本步骤只需要将数据从gpu读取到cpu中进行输出即可。

在本实施例中,通过比较内核和线程的分配方式,设计出合理的架构,多次使用局部内存,线程同步,并行规约等设计,对于数据结构也进行了优化,大幅度缩减了运行时间,并且比较了本套算法在cpu端和gpu端的运行时间,可以明显的看到,将运算时间从秒级别降低到毫秒级别,速度最少也提升了20多倍,且精度未发生改变,满足了精度和速度的需求,真正做到了实时的立体匹配,如图5所示。本发明还对比了各个平台上gpu的运行时间,对于nvidia,amd,fpga都进行了对比,做到了跨平台的立体匹配,如图6所示。因此综合来看,本发明采用opencl进行并行化设计,成功实现了跨平台的半全局实时立体匹配。

综上所述,本发明实施例基于opencl实现跨平台的半全局实时立体匹配。具体地说,利用opencl在gpu端进行并行化加速处理,对输入的左右图像计算匹配代价,以此来求取最小代价并得到稠密的视差结果。其中算法的主要流程包括:首先选定一个边框大小进行census转换,每个像素由灰度值转换成框大小的字符序列;选择一个视差搜索范围,在此范围内对左右对应的字符序列进行异或操作,得到汉明码距作为最初始的匹配代价;采用动态规划的算法进行路径聚合,找到每个像素点各个方向上聚合的最小代价进行扫描线优化;采用wta算法选择视差搜索范围内的最小匹配代价;采用中值滤波和左右一致性检查对选取的视差结果进行优化提高精度,得到稠密的视差图。本实施例在各平台下采用opencl并行实现多个任务,为各类gpu、fpga等多平台提供了一个进行并行编程的开放架构,使不同的硬件平台具备了统一的开发环境,属于gpgpu计算领域。利用gpu强大的浮点计算能力和内存带宽,程序设计内核采取了数据并行的架构,各个内核函数之间是并行结构,但是内核函数把任务分解到各个线程并行处理,极大的缩小了计算时间,才能得到实时的稠密视差图。

尽管上文对本发明进行了详细说明,但是本发明不限于此,本技术领域技术人员可以根据本发明的原理进行各种修改。因此,凡按照本发明原理所作的修改,都应当理解为落入本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1