OpenCV双目匹配BM算法和SGBM算法的速度和精度比较

       OpenCV在双目匹配上所做的工作相当不错,从1.0版本到4.3这么多年的版本迭代,官方始终在优化双目匹配算法。最常用的当属BM算法和SGBM算法了:

       BM全称是BlockMatching,可以理解为一种块匹配算法,这里一个通俗的说法就是,为了找到两张图像中某一对同名点(也就是匹配点对),我们不可能只使用该像素的像素值进行比较,因为像素值相同的点在一副图像中往往不止一个,这时自然想到的就是利用周围的像素点和待匹配点作为一个整体,毕竟在实际生活中,相同的点周围也是相似的嘛。

       SGBM算法Semi-Global-BlockMatching,本质上也是一种快匹配算法。其具体算法原理可以参考这篇博客:https://blog.csdn.net/A_L_A_N/article/details/81490043。

       本文主要是让大家对于这两种算法实际的效果有一个直观的认识,从速度以及精度方面进行详细的比较。

一、速度比较(本文主要使用的OpenCV4.3版本,我的电脑性能是Intel® Core™ i5-8400 CPU @ 2.80GHz × 6):

       首先这里需要说明的是选取的双目比较的图片是OpenCV官方提供的,原始图像分辨率为1282*1110。

OpenCV双目匹配BM算法和SGBM算法的速度和精度比较_第1张图片      OpenCV双目匹配BM算法和SGBM算法的速度和精度比较_第2张图片

         三种分辨率(mindisparity=0,ndisparities=48,SADWindowSize=9)

算法时间比较(ms) 1182*1110 640*480 320*240 160*120
BM 22 8.8 3.6 0.78
SGBM 262.5 52 12 2.5

        从上表中可以明显发现,SGBM算法速度远远慢于BM算法,但是随着分辨率下降,两者之间的差异逐步缩小。两种算法在图像分辨率减小时,所花费的时间也减小,但也不是线性变化。

二、精度比较(mindisparity=0,ndisparities=48,SADWindowSize=9)

     

OpenCV双目匹配BM算法和SGBM算法的速度和精度比较_第3张图片

OpenCV双目匹配BM算法和SGBM算法的速度和精度比较_第4张图片

       上图中,上一行为三种分辨率下的BM算法对应的视差图,下一行为三种分辨率下的SGBM算法对应的视差图。从图中可以看出,SGBM的精度整体上远远高于BM算法的精度。视差图孔洞更少,层次更为分明,这也是工业领域中常用SGBM算法的原因。而当固定匹配参数的时候,随着图像分辨率降低(从1110p--->240p),匹配精度提升,但是当分辨率下降到120p的时候,精度又下降了。说明图像分辨率太低之时,精度也将得不到保证。这主要是由于受到匹配参数的影响,这里我们主要讨论ndisparities所带来的影响。这里以1110p视差图的结果作为分析,如下图所示:

OpenCV双目匹配BM算法和SGBM算法的速度和精度比较_第5张图片

       这里修改了SGBM算法中的ndisparities参数,当增大ndisparities时,匹配精度也得到提升,这里的主要原因在于,图像分辨率越高之时,同名点之间的像素差异也会越大,搜索的最大视差也要增大,这样精度也会有提升。而对于其他参数是否有影响,大家可以根据上传的源代码进行修改测试吧,这里仅仅做一个小结,抛砖引玉!

你可能感兴趣的:(计算机视觉,数字图像处理)