本发明涉及双目视觉立体匹配领域,特别涉及一种基于双目视觉的高低分辨率融合立体匹配方法。
背景技术:
双目视觉广泛应用于机器人视觉、自动驾驶等领域,能够提供物体的三维信息。比如在汽车上搭载的双目相机,除了可以提供传统二维图像上的行人形状等信息,还可以提供行人离汽车的距离这一个深度信息。双目视觉可以构建一个真实的三维世界,在三维世界中,可以解决很多在传统二维图像上难以解决的问题。
双目视觉整个流程包括相机标定、立体矫正、立体匹配、三维重建四个环节,其中立体匹配是双目视觉领域的关键环节。同一物体用双目相机拍摄,会呈现在左右两张图像中的不同位置,立体匹配旨在找到这两个不同的位置,得到一对匹配点。
目前立体匹配算法比较通用的是bm算法和sgbm算法,sgbm算法的准确率比bm算法高很多,因此更为常用。sgbm算法参见hirschmh.stereoprocessingbysemiglobalmatchingandmutualinformation[j].ieeetransactionsonpatternanalysisandmachineintelligence,2007,30(2):328-341。在嵌入式开发平台上使用sgbm算法时,可接受输入高分辨率图片或者低分辨率图片,高分辨率图片的匹配结果准确,但是耗时巨大,难以实现实时性,低分辨率图片在嵌入式平台上的计算处理时间短,能达到实时,但是结果很不准确,达不到可用的标准。
技术实现要素:
本发明的目的在于克服现有技术的缺点与不足,提供一种基于双目视觉的高低分辨率融合立体匹配方法,该方法适当地融合了高低分辨率图片的处理流程,扬长避短,既保证了高分辨率处理流程的准确,又取得了低分辨率处理流程的低耗时,节省了计算资源。
发明的目的通过以下的技术方案实现:基于双目视觉的高低分辨率融合立体匹配方法,包括步骤:
输入双目相机拍摄得到的左右两张高分辨率图片以及立体匹配的参数;
对图像进行预处理,计算左右图中处于视差搜素范围内的每一对像素点的视差代价,得到视差代价矩阵;
视差代价矩阵下采样,得到降维后的视差代价矩阵;
针对降维后的视差代价矩阵进行视差代价聚合,得到最佳匹配点;
根据上述最佳匹配点进行匹配,得到视差图。
本发明在预处理和视差代价计算步骤使用清晰的高分辨率图片,得到准确的视差代价,在视差代价聚合步骤按照低分辨率图片的流程处理,减少了计算所需的时间,既保证了高分辨率处理流程的准确,又取得了低分辨率处理流程的低耗时。
优选的,所述立体匹配的参数包括:视差搜索范围、窗口大小、唯一性检测阈值、最小视差、截断阈值、连通区域的噪点面积阈值、判定为连通区域的灰度值范围。
优选的,所述对图像进行预处理,包括步骤:
(1-1)输入一张高分辨率的图片,做水平方向的sobel处理,得到边缘信息;
(1-2)根据截断阈值处理公式得到截断处理后的值vnew,截断阈值处理公式如下:
其中,v表示某个像素点经过sobel处理后得到的值,p为截断阈值;
(1-3)截断之后,把每个像素点的vnew存储在内存中,待后续使用;原rgb图转化为灰度图,把每个像素点的灰度值也存储在内存中,待后续使用。
优选的,所述视差代价的计算步骤如下:
(2-1)设左图某个像素点sobel处理并截断后的值为pleft,右图某个像素点sobel处理并截断后的值为pright,pleft左侧邻近点为pleft-1,pleft右侧邻近点为pleft+1,pright左侧邻近点为pright-1,pright右侧邻近点为pright+1,得到如下四个亚像素点的值:
获取pright-0.5,pright,pright+0.5三个值中最大的一个记为v1,最小的一个记为v0;
获取pleft-0.5,pleft,pleft+0.5三个值中最大的一个记为u1,最小的一个记为u0;
获取pleft-v1,v0-pleft,0三个数中最大的一个,记为c0;
获取pright-u1,u0-pright,0三个数中最大的一个,记为c1;
c1与c0中小的那个作为pleft和pright匹配的代价;
(2-2)同样按照上述方法,灰度值比较得到匹配代价,得到的匹配代价再除以4,再加上步骤(2-1)得到的边缘信息匹配代价,作为左右图中一对像素点的视差匹配代价。
优选的,所述视差代价矩阵下采样的步骤如下:
(3-1)假设处理的图片宽度是width,高度是height,即图片中的像素点个数是width*height,每个像素点可得到numofdisparities个视差代价的值,其中numofdisparities表示视差搜索范围;每张图片对应得到一个三维的矩阵,维度是width*height*numofdisparities;
(3-2)降低矩阵维度到width/2*height/2*numofdisparities,得到降维后的视差代价矩阵。
优选的,针对降维后的视差代价矩阵进行视差代价聚合,步骤是:
(4-1)计算窗口视差代价。设置一个窗口,窗口长宽都为sadwindowsize,把整个窗口中的所有像素点的视差取值为d,把窗口中所有像素点的代价cost(p,d)加起来,得到整一个窗口的代价,记为c(p,d)。
(4-2)动态规划做代价聚合。动态规划的处理公式如下:
lr(p,d)=c(p,d)+min(lr(p-r,d),lr(p-r,d-1)+p1,lr(p-r,d+1)+p1,minlr(p-r,i)+p2)-minlr(p-r,k)
动态规划处理是多方向的,要一个一个方向来处理,处理过程中先选定其中某一个方向为r,p指当前像素点所在的窗口,lr(p,d)表示沿着当前方向,当p的视差取值为d时的最小的匹配代价。假设处理了n个方向的动态规划,n个方向的lr(p,d)加起来,即得到当前窗口的视差取值为d时的代价s(p,d)。视差d的取值一共有numofdisparities个,也就是说当前像素点有numofdisparities个s(p,d),其中最小的一个就是当前像素点的最佳视差,即得到最佳匹配点。
优选的,所述基于双目视觉的高低分辨率融合立体匹配方法还包括后处理步骤,该步骤包括:
(5-1)唯一性检测:设唯一性检测阈值为u,那么必须满足下述公式,才认为计算的视差代价是合理的代价:
并且,次佳视差像素点和最佳视差像素点的距离要在一个像素以上(不含一个像素)。
(5-2)亚像素插值:亚像素插值选择的是抛物线插值法,找到极小值点。
处理公式如下:
假设当前点的最佳视差值是d,那么可以得到denom2的值。s(p,d-1)、s(p,d)和s(p,d+1)这些数值可以构成一条曲线,曲线在s(p,d-1)这一点的二次导数和1这两个数值中的较大值就是denom2,也就是保证了最后denom2可以取得大于等于1的一个数值,denom2如下:denom2=max(s(p,d-1)+s(p,d+1)-2*s(p,d),1);
接着拟合得到一个新的d值d_new,如下:
(5-3)连通区域检测噪点并去除:调用opencv的filterspeckles函数,输入待处理的视差图、无效值、判定为连通区域的灰度值范围specklerange和连通区域的噪点面积阈值specklewindowsize这四个参数值,找到视差图中的噪点连通区域,把这些区域的视差值置为无效值,最后可以得到去除噪点后的视差图。
本发明与现有技术相比,具有如下优点和有益效果:
现有技术只能接受输入高分辨率图片或者低分辨率图片,然后按照sgbm算法的处理流程来走,只能接受准确率高但是耗时巨大或者准确率低但是耗时短的两种结果,无法做到又准又快。本发明在预处理和视差代价计算步骤使用清晰的高分辨率图片,得到了准确的视差代价,在视差代价聚合和后处理步骤按照低分辨率图片的流程处理,减少了计算所需的时间。后续做了立体匹配的准确率测试和耗时测试,表明本发明方法在准确率和耗时方面都取得了良好的效果,既保证了高分辨率处理流程的准确,又取得了低分辨率处理流程的低耗时。
附图说明
图1是本发明方法的流程图。
图2是传统高分辨率处理流程得到的视差图。
图3是传统低分辨率处理流程得到的视差图。
图4是本实施例方法得到的视差图。
具体实施方式
下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。
实施例
如图1所示,本实施例一种基于双目视觉的高低分辨率融合立体匹配方法,包括步骤:
一、输入一系列立体匹配的参数,包括:
视差搜索范围numofdisparities
窗口大小sadwindowsize
唯一性检测阈值uniquenessratio
最小视差mindisparity
截断阈值p
连通区域的噪点面积阈值specklewindowsize
判定为连通区域的灰度值范围specklerange。
二、预处理
(1)水平方向的sobel处理
输入一张高分辨率的图片,做水平方向的sobel处理,得到边缘信息。
水平方向的sobel处理算子如下:
(2)截断处理
设某个像素点经过sobel处理后得到的值是v,截断阈值为p,截断处理后的值为vnew,那么截断处理的公式如下。
(3)边缘值和灰度值的存储
截断之后,把每个像素点的vnew存储在内存中,待后续使用。
原rgb图转化为灰度图,把每个像素点的灰度值也存储在内存中,待后续使用。
三、视差代价计算
左图的每个像素点在右图中有numofdisparities个可能的对应匹配点,要逐一计算出这些匹配点的匹配代价,从中选出最小的一个作为最合适的匹配点。
计算的方法如下:
(1)边缘信息比较得到的代价
设左图某个像素点sobel处理并截断后的值为pleft,右图某个像素点为pright,pleft左侧邻近点为pleft-1,pleft右侧邻近点为pleft+1,pright左侧邻近点为pright-1,pright右侧邻近点为pright+1,可得如下四个亚像素点的值。
可得到pright-0.5,pright,pright+0.5三个值中最大的一个,记为v1,最小的一个记为v0。
可得到pleft-0.5,pleft,pleft+0.5三个值中最大的一个,记为u1,最小的一个记为u0。
进而可得到pleft-v1,v0-pleft,0三个数中最大的一个,记为c0。
可得到pright-u1,u0-pright,0三个数中最大的一个,记为c1。
c1与c0中小的那个作为pleft和pright匹配的代价。
这是边缘信息比较得到的代价。
(2)灰度值比较得到的代价
按照上述方法,比较灰度值同样可以得到代价。灰度值比较得到的匹配代价除以4,加上(1)中得到的边缘信息代价,作为左右图中一对像素点的视差匹配代价。
四、视差代价矩阵下采样
假设上述步骤处理的图片宽度是width,高度是height,即图片中的像素点个数是width*height,每个像素点可以得到numofdisparities个视差代价的值,也就是说处理完上述步骤后,对于每张图片实际得到了一个三维的矩阵,维度是width*height*numofdisparities。
为了降低计算处理的时间,同时不影响视差匹配的效果,这里降低矩阵维度到width/2*height/2*numofdisparities。
五、视差代价聚合
上述视差代价计算步骤得到了每个像素点的numofdisparities个匹配代价,从中可以选出最小的一个作为最适合的匹配点,但是这样很大可能会出现噪点,因此有必要考虑周围点的视差值。
考虑周围点视差值有两种方式,如下。
(1)窗口视差代价
上述步骤得到了每个像素点的视差代价,当某个像素点p视差取值为d时,代价记为cost(p,d)。考虑一个窗口,把整个窗口中的所有像素点的视差取值为d,得到整一个窗口的代价,记为c(p,d)。窗口长宽都为sadwindowsize,c(p,d)就是把窗口中所有像素点的cost(p,d)加起来。
(2)动态规划做代价聚合
选用动态规划作为代价聚合的方式。动态规划的处理公式如下:
lr(p,d)=c(p,d)+min(lr(p-r,d),lr(p-r,d-1)+p1,lr(p-r,d+1)+p1,minlr(p-r,i)+p2)-minlr(p-r,k)
动态规划处理是多方向的,要一个一个方向来处理。处理过程是:先选定其中某一个方向为r,比如从左到右。上述公式中p指当前像素点所在的窗口,lr(p,d)表示沿着当前方向,当p的视差取值为d,考虑上周围窗口的视差值时,最小的匹配代价是多少。可以看到lr(p,d)的取值除了考虑到当前窗口取视差d时的代价,还考虑了该方向前一个窗口视差值的影响。
假设处理了n个方向的动态规划,n个方向的lr(p,d)加起来,可以得到当前窗口的视差取值为d时,代价有多大,记为s(p,d)。视差d的取值一共有numofdisparities个,也就是说当前像素点有numofdisparities个s(p,d),从中找到最小的一个就是当前像素点的最佳视差。
六、后处理步骤
(1)唯一性检测
假设唯一性检测阈值为u,那么必须满足下述公式,才认为步骤五中聚合得到最佳视差是合理的视差:
并且,次佳视差像素点和最佳视差像素点的距离要在一个像素以上(不含一个像素)。
(2)亚像素插值
亚像素插值选择的是抛物线插值法,找到极小值点。处理公式如下:
假设当前点的最佳视差值是d,那么可以得到denom2的值如下。
denom2=max(s(p,d-1)+s(p,d+1)-2*s(p,d),1)
接着拟合得到一个新的d值d_new,如下。
(3)连通区域检测噪点并去除
调用opencv的filterspeckles函数,输入待处理的视差图、无效值、specklerange和specklewindowsize这四个参数值,找到视差图中的噪点连通区域,把这些区域的视差值置为无效值,最后可以得到去除噪点后的视差图。
为了说明本发明的创造性,本实施例进行了立体匹配的准确率测试实验,实验过程如下:
把摄像头放置于三脚架上,拍摄一定距离(比如1m、1.5m)外的墙体,墙体上增加一些纹理,使得纹理比较多,保证使用立体匹配方法可以求得比较准确的深度。尽可能保证摄像头所在平面跟墙体平面是平行的。拍下左右两张图片后,经过本发明方法的处理,得到视差图,如图4所示。
同样的左右两张图,输入传统的高分辨率sgbm处理流程和传统的低分辨率处理流程,同样得到图2、图3所示的视差图。
经过测试,墙体离摄像头距离为100cm。
高分辨率处理流程得到的结果是,跟100cm的实际距离有正负3cm误差的像素点个数占所有像素点个数的46.36%,跟100cm的实际距离有正负5cm误差的像素点个数占所有像素点个数的53.34%,跟100cm的实际距离有正负10cm误差的像素点个数占所有像素点个数的98.31%。
低分辨率处理流程得到的结果是,正负3cm误差的像素点占比7.01%,正负5cm误差的像素点占比21.71%,正负10cm误差的像素点占比98.68%。
本发明方法得到的结果是,正负3cm误差的像素点占比48.10%,正负5cm误差的像素点占比58.59%,正负10cm误差的像素点占比98.70%。
经过测试,本方法得到的视差图接近高分辨率处理流程得到的视差图,跟低分辨率处理流程得到的视差图很不一样,说明本方法的准确程度跟高分辨率处理流程的接近。
为了说明本发明的创造性,本实施例进行了立体匹配的耗时测试实验,实验过程如下:
测试平台为全志h3开发板,四个cpu核。测试本方法和输入高分辨率图片、低分辨率图片的现有方法的耗时。
经过测试,本方法可以取得比较接近低分辨率处理流程的耗时。在h3开发板上实测耗时为0.075s,现有方法低分辨率处理流程的耗时是0.05s,现有方法高分辨率处理流程的耗时是0.22s。如果结合一些其他现有的技术方案,本发明方法实测可以取得每秒二十多帧的处理速度。
本实施例对现有的输入高分辨率图片和低分辨率图片的方法,与本实施例方法进行了对比。实验显示,本发明方法结果准确且耗时短,有利于嵌入式系统的使用。
本领域普通技术人员可以意识到,结合本发明中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
另外,在本发明实施例中的各个步骤可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以是两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。