@wuqi0616
2017-04-27T14:29:10.000000Z
字数 11895
阅读 1974
视觉伺服
立体匹配是一种从平面图像中恢复深度信息的技术。由于双目立体匹配系统通过模拟人眼视觉感知原理,仅需要两台数字摄像机安装在同一水平线上,经过立体矫正就可以投入使用。具有实现简单,成本低廉,并且可以在非接触条件下测量距离等优点。在机器人制导系统中可以用于导航判断、目标拾取,在工业自动化控制系统中可用于零部件安装、质量检测,环境检测,在安防监控系统中可用于人流检测,危害报警。
近年来,随着社会的科技进步,立体匹配技术的发展日新月异,随着匹配算法精度与速度的提高,其应用场景进一步扩大。在此背景下,研究立体匹配变的意义非凡。
立体匹配作为三维重建、立体导航、非接触测距等技术的关键步骤通过匹配两幅或者多幅图像来获取深度信息。并且广泛应用于,工业生产自动化、流水线控制、无人驾驶汽车(测距,导航)、安防监控、遥感图像分析、机器人智能控制等方面。虽然立体匹配应用广泛但是还有很多尚未解决的难题因此该技术成为了近年来计算机视觉领域广泛关注的难点和热点。
立体匹配作为一种工程化问题,在实施过程中有多种因素影响其精度与速度,通常根据立体匹配算法所采用的约束,可以将其分为两大类算法:
第一类为基于区域约束的局部匹配算法。如采用匹配窗的代价聚合算法(平方差算法SSD,绝对差算法SAD,归一化算法NCC等);采用特征点的匹配算法;采用相位匹配的的匹配算法。这些算法的优点是运算速度快,能够快速恢复出纹理丰富区域的视差。缺点是在低纹理区域会造成误匹配,得到的视差图不致密,需要在后期通过插值算法来进行修正。
第二类为基于全局约束的优化算法,如图割算法(Graph Cuts, GC),人工智能算法(神经网络,遗传算法),置信传播算法(Belief Propagation, BP),动态规划算法(Dynamic Programming, DP)。这些算法虽然运算时间较长并且会产生一些误匹配,但是基本上能够获得所有的视差信息从而生成稠密的视差图。
国外在计算机立体视觉上的研究开展较早,Roy最早将图割算法应用于立体匹配,并通过实验表明,图割算法能有效克服其他全局优化算法的缺点(如动态规划算法等生成视差图产生的横向条纹瑕疵),避免了视差在临近极线处不连续的问题。但该算法生成的视差图轮廓边缘模糊,视差层的区分度低。Geiger等,针对高分辨率图像立体匹配运算时间长的问题,创造性的提出了使用强约束点(纹理或特征信息较为丰富)作为支撑点,在强约束点之间通过三角剖分对视差图进行插值计算,结合OpenMP技术在通用CPU上实现了并行计算,操作简单易于搭建环境,在通用微型计算机上实现了实时立体匹配,但是匹配效果和基于全局优化的匹配算法有一定差距。
国内对于立体视觉的研究起步较晚,早期主要采用基于特征点匹配的方法,随着技术的进步,后序对立体匹配的改进工作主要集中在对全局优化算法性能和准确度的提升上。其中大部分方法采用对待匹配图像进行图像分割后,再结合能量最优化的方法进行立体匹配。如尹等采用均值平移算法将参考图像根据颜色信息快速聚类;之后计算初始视差图;将分割结果作为能量视差函数的一个参考项;最后采用图割算法求取使全局能量最小的视差最优分配。此种基于图像分割的立体匹配方法的理论基础认为,分割区域块内的视差变化是平滑的。因此与其他基于图像分割的立体匹配算法相比,此类算法可有效地处理大块低纹理区域,匹配精度高,更有利于估计视差图的边界。并且上述算法通过分割减少了匹配基元,使得运算速度更快,能够很好的解决的边界模糊和低纹理区域的误匹配问题。
立体匹配技术的应用十分广泛,王等改进了勇气号机遇号火星车复杂的定位技术,在嫦娥3号月面巡航器的视觉导航系统中,将SIFT(scale-invariant feature transform) 匹配、相关系数匹配、最小二乘匹配和光束法平差等多项技术融合, 实现了相邻站间月面巡视器的导航定位. 实验表明视觉定位相对精度优于4%。 朱针对工件的自动定位、识别与抓取等问题,使用立体视觉的方法进行工件识别的定位;对图像就行SIFT特征提取,并采用模板匹配方法实现工件的识别。用形态学方法获得工件特征点的二维信息,结合双目立体视觉标定技术得到工件的三维坐标,为机器人抓取工件提供信息。 顾等为实现统计实时人流,提出一种基于立体视觉的人头检测算法。该方法对双目相机采集的图像通过运动目标检测分离出运动人员所在区域,利用视差的连续性只对强纹理点进行绝对误差累积(SAD)匹配,其余点只进视差验证,因此能够得到稠密的视差图,再由三角投影关系计算出深度图。由于双目立体成像得到的深度图中人员与场景的深度分布不同,采用深度分层的方法将存在人头信息的深度层提取出来,并通过几何形态来确定人头,该算法可以很好地适应复杂场景下的人头检测,精度高、速度快。
Yang等,提出了采用全局最小生成树的代价聚合方案,像素间的相似性作为边的权值,通过无向连通图构建最小生成树,使得局部像素点获取了全局的信息。解决了低纹理区域的误匹配问题。(实际为对局部窗匹配算法的改进。),针对采集的待匹配图像可能带有噪声或者复杂纹理的问题,该团队进行了系统化流程的设计改进。
顾等为实现统计实时人流,提出一种基于立体视觉的人头检测算法。该方法对双目相机采集的图像通过运动目标检测分离出运动人员所在区域,利用视差的连续性只对强纹理点进行绝对误差累积(SAD)匹配,其余点只进行视差验证,因此能够得到稠密的视差图,再由三角投影关系计算出深度图。由于双目立体成像得到的深度图中人员与场景的深度分布不同,采用深度分层的方法将存在人头信息的深度层提取出来,并通过几何形态来确定人的头部,该算法可以很好地适应复杂场景下的人头检测,并且由于采用了基于局部优化的匹配算法结合插值计算等手段所以其在精度、速度上都有很好的实时特性。
Yang等,提出了基于最小生成树的代价聚合方案,采用像素间的相似性作为边的权值,通过无向连通图构建最小生成树,使得局部像素点获取了全局的信息。解决了低纹理区域的误匹配问题。针对采集的待匹配图像可能带有噪声或者复杂纹理的问题,Yang等在上述算法的基础上进行了系统化的流程设计与改进,利用左右交叉检验精确更新代价聚合中稳定和不稳定的点的代价,提升了算法精度。
立体匹配算法的改进,近年来主要围绕如何快速获取稠密视差图以及将匹配算法并行化,Yang等,利用保边滤波器的性质并加以改进,融合并行计算技术,分别用导向滤波器和双边滤波器,针对局部匹配算法和全局匹配算法提出了工程化系统化的立体匹配并行流程方法。
导入双目视觉获得的两幅图像:
Mat imgL = imread("Left.bmp");
Mat imgR = imread("Right.bmp");
if (!(imgL.data) || !(imgR.data))
{
cerr<<"can't load image!"<<endl;
exit(1);
}
因为输入图像的分辨率较高,我们可对其进行适当的缩放:
/********************************************/
/*利用Opencv中的图像resize函数实现图像重构、调整*/
/*****void resize(InputArray src,输入图像*****/
/***** OutputArray dst, 输出图像 *****/
/***** Size dsize, 输出图像的大小 *****/
/***** double fx=0,沿x轴缩放系数 *****/
/***** double fy=0,沿y轴缩放系数 *****/
/***** int interpolation=INTER_LINEAR 线性插值 */
/********************************************/
float stdWidth = 800, resizeScale = 1;
if (imgL.cols > stdWidth * 1.2)
{
resizeScale = stdWidth / imgL.cols;
Mat imgL1,imgR1;
resize(imgL, imgL1, Size(), resizeScale, resizeScale);
resize(imgR, imgR1, Size(), resizeScale, resizeScale);
imgL = imgL1.clone(); //克隆图像
imgR = imgR1.clone();
}
新得到的图像缩小为原来的resizeScale倍,方便后续的处理
Opencv提供了三种立体匹配求视差图的算法,分别为StereoBM、StereoSGBM、和StereoVar。
//StereoBM算法
CvStereoBMState *BMState = cvCreateStereoBMState();
int SADWindowSize = 15;
BMState->SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 9;
BMState->minDisparity = 0;
BMState->numberOfDisparities = 32;
BMState->textureThreshold = 10;
BMState->uniquenessRatio = 15;
BMState->speckleWindowSize = 100;
BMState->speckleRange = 32;
BMState->disp12MaxDiff = 1;
IplImage *img_r, *img_l;
img_r = cvLoadImage("12r.bmp", 0);
img_l = cvLoadImage("12l.bmp", 0);
CvMat* left_disp = cvCreateMat(img_l->height, img_l->width, CV_32FC1);//声明一个矩阵,大小与加载图像一致,为浮点型
CvMat* left_vdisp = cvCreateMat(img_l->height, img_l->width, CV_8U);//声明一个矩阵,大小与加载图像一致,为无符号型
cvFindStereoCorrespondenceBM(img_l, img_r, left_disp, BMState);
cvNormalize(left_disp, left_vdisp, 0, 256, CV_MINMAX);
cvShowImage("BM", left_vdisp);
cvWaitKey(0);
因StereoBM算法得到的视差图效果不佳,我们采用的是StereoSGBM算法
//StereoSGBM算法
StereoSGBM sgbm;
int cn = imgR.channels(); //图像通道数
// 预处理滤波参数
sgbm.preFilterCap = 63; //为预处理的处理值
// SAD 参数
sgbm.SADWindowSize = 3; //匹配块大小
sgbm.numberOfDisparities = nod; //视差窗口(80)
sgbm.minDisparity = 0; //最小视差,默认值为 0
// 后处理参数
sgbm.uniquenessRatio = 10; //视差唯一性百分比
//视差窗口范围内最低代价是次低代价的(1 + uniquenessRatio / 100)倍时,最低代价对应的视差值才是该像素点的视差,否则该像素点的视差为 0
//用以防止误匹配,一般取值5~15左右的值比较合适
sgbm.speckleWindowSize = 100; //检查视差连通区域变化度的窗口大小, 值为 0 时取消 speckle 检查,int 型
sgbm.speckleRange = 32; //视差变化阈值,当窗口内视差变化大于阈值时,该窗口内的视差清零,int 型
sgbm.disp12MaxDiff = 1; //左视差图(直接计算得出)和右视差图(通过cvValidateDisparity计算得出)之间的最大容许差异。
sgbm.P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize; //控制视差变化平滑性的参数。P1、P2的值越大,视差越平滑。
sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;
//P1是相邻像素点视差增 / 减 1 时的惩罚系数;P2是相邻像素点视差变化值大于1时的惩罚系数。P2必须大于P1。
sgbm.fullDP = alg == STEREO_HH; //布尔值,当设置为 TRUE 时,运行双通道动态编程算法
//会占用O(W*H*numDisparities)个字节,对于高分辨率图像将占用较大的内存空间
Mat dispTemp, disp8;
sgbm(imgL, imgR, dispTemp); //使用SGBM算法矫正立体像对
dispTemp.convertTo(disp, CV_32FC1, 1.0 / 16);
disp.convertTo(disp8, CV_8U, 255.0 / nod);
imshow("origin disparity", disp8);
// 对得到的视差图去除毛刺、平滑处理
void FixDisparity( Mat_<float> & disp, int numberOfDisparities )
{
//输入参数分别为得到的视差图和视差窗口值
Mat_<float> disp1;
float lastPixel = 10;
float minDisparity = 23;
for (int i = 0; i < disp.rows; i++)
{
for (int j = numberOfDisparities; j < disp.cols; j++)
{
if (disp(i,j) <= minDisparity) disp(i,j) = lastPixel;
else lastPixel = disp(i,j);
}
}
int an = 4;
copyMakeBorder(disp, disp1, an,an,an,an, BORDER_REPLICATE);
//扩充src的边缘,将图像变大,方便处理边界的情况
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(an*2+1, an*2+1));
//采用9*9的椭圆形结构元素
//调用形态学滤波函数对图像进行开闭运算
morphologyEx(disp1, disp1, CV_MOP_OPEN, element);
morphologyEx(disp1, disp1, CV_MOP_CLOSE, element);
disp = disp1(Range(an, disp.rows-an), Range(an, disp.cols-an)).clone();
}
经过算法得到的为值在0~255范围内的灰度图,可编辑算法将灰度图像转为伪彩色和彩虹图方便观察:
//灰度图转换伪彩色
void Pseudo_color(Mat image,Mat result)
{
int tmp = 0;
for (int y = 0; y<image.rows; y++)
{
for (int x = 0; x<image.cols; x++)
{
tmp = image.at<uchar>(y, x);
result.at<Vec3b>(y, x)[0] = abs(255 - tmp); //blue
result.at<Vec3b>(y, x)[1] = abs(127 - tmp); //green
result.at<Vec3b>(y, x)[2] = abs(0 - tmp); //red
}
}
}
//灰度图转彩虹色
//把灰度图对应的0~255的数值分别转换成彩虹色:红、橙、黄、绿、青、蓝。
// R G B gray
//----------------------------------
// 红 255, 0, 0 255
// 橙 255, 127, 0 204
// 黄 255, 255, 0 153
// 绿 0, 255, 0 102
// 青 0, 255, 255 51
// 蓝 0, 0, 255 0
void RainBow(Mat image, Mat result)
{
#define IMG_B(img,y,x) img.at<Vec3b>(y,x)[0]
#define IMG_G(img,y,x) img.at<Vec3b>(y,x)[1]
#define IMG_R(img,y,x) img.at<Vec3b>(y,x)[2]
uchar tmp2 = 0;
for (int y = 0; y<image.rows; y++)
{
for (int x = 0; x<image.cols; x++)
{
tmp2 = image.at<uchar>(y,x);
if (tmp2 <= 51)
{
IMG_B(result,y,x) = 255;
IMG_G(result,y,x) = tmp2 * 5;
IMG_R(result,y,x) = 0;
}
else if (tmp2 <= 102)
{
tmp2 -= 51;
IMG_B(result,y,x) = 255 - tmp2 * 5;
IMG_G(result,y,x) = 255;
IMG_R(result,y,x) = 0;
}
else if (tmp2 <= 153)
{
tmp2 -= 102;
IMG_B(result,y,x) = 0;
IMG_G(result,y,x) = 255;
IMG_R(result,y,x) = tmp2 * 5;
}
else if (tmp2 <= 204)
{
tmp2 -= 153;
IMG_B(result,y,x) = 0;
IMG_G(result,y,x) = 255 - uchar(128.0*tmp2 / 51.0 + 0.5);
IMG_R(result,y,x) = 255;
}
else
{
tmp2 -= 204;
IMG_B(result,y,x) = 0;
IMG_G(result,y,x) = 127 - uchar(127.0*tmp2 / 51.0 + 0.5);
IMG_R(result,y,x) = 255;
}
}
}
}
计算机立体视觉系统通过模仿人类的的视觉系统,根据对同一场景从不同位置拍摄的两视角或多视角图像,采用几何方法可以计算出深度信息。本文主要研究的双目立体视觉系统如下图所示
双相机系统
在相似三角形和中根据对应边的比例关系:
其中Z为场景的深度,b为相机基线之间的距离,f为相机焦距。且由于bf/Z 为正数,根据上式有xl>xr,由此极大简化了匹配算法。一般算法中,垂直方向上的视差采用标准的立体相机系统,即针对已经在水平方向上矫正了的图像。垂直方向上的视差为0。
由于立体匹配是从二维图像中恢复三维信息,其本身具有不确定性的特征,因此为了获取正确的匹配结果,需要借助各种约束信息来降低匹配的搜索难度,提高匹配的准确度。常用的约束信息有以下几种。
极线约束
由一个三维点和它在两相机成像平面的点构成的平面包含基线,即连接两个相机中心和连接两个极线直线构成的平面,该平面被称为极平面。图中P点及其投射点Or和Ol构成极平面,极平面与相机成像平面交线为极线。空间点P在成像平面上的投影点pl以及pr位于相应的极线上。
极线约束将搜索图像点的问题在立体匹配领域由二维搜索问题降低为一维搜索问题,极大简化了问题复杂度。在标准的立体视觉系统中,极线与图像的扫面线共线。
相容性约束
相容性约束也称为一致性约束,它要求在待匹配的两幅图像中,对应区域的特征值差别在给定阀值之内或者对应的特征点应具有相同的属性。在判断待匹配图像中的两个基元是否具有相容性约束时,可以选择的特征有以下三类:
1.像素特征,如灰度值等
2.光照特征
3.几何特征(质心,形状,边界,轮廓)
唯一性约束
唯一性约束要求对于待匹配图像,在原图像中至多对应一个点。该约束简化了匹配过程。一幅图像上的每个基元只能与另一幅图像上的唯一一个基元相对应,这样图像中的每个匹配基元最多只能有一个视差值
连续性约束
在立体匹配中,匹配问题可以被看成寻找两组数据相关程度的过程3。立体匹配方法有多种分类,本领域内对于匹配算法的经典划分方法为两组层次结构:局部匹配算法和全局匹配算法。其划分依据是基于算法运行时约束的作用范围。另外一种划分是基于生成的视差图。对于所有像素都能生成确定视差值的称为稠密视差图,该类方法成为稠密匹配该种方法应用广泛,例如图像合成等。另一方面,与稠密视差图对应的是稀疏视差图,称为稀疏匹配,其只对被选择的像素点(通常为角点或者边缘点)有视差值,此类方法计算速度快,但需要后期通过插值算法处理缺失的视差值,所以应用场景有很大限制。本文主要针对经典的划分介绍立体匹配算法。
基于局部区域约束的匹配算法利用给定位置周围的局部信息进行计算,涉及信息量较少,计算复杂度较低,大多实时性平台借鉴了此算法的思想。但其对无纹理、视差不连续和遮挡区域匹配效果不理想。局部算法一般可以分为两类:特征匹配算法,区域匹配算法。
(1)特征匹配
该类方法首先从待匹配图像中提取特征,用相似性度量和一些约束条件确定几何变换,最后将该变换作用于待匹配图像。这类方法主要包括特征提取、特征匹配、模型变换、插值与视差求精等几个步骤。
特征匹配算法是根据待匹配图像中的特征:灰度变化,边缘,光照等,建立其对应关系,并根据插值算法得到视差图的过程。特征匹配对图像噪声,遮挡不敏感,运算量小且计算时间短,但只能获取稀疏的视差图,在插值运算时容易丧失精度,对低纹理区域的匹配效果不好。
(2)区域匹配
该类方法使用匹配窗,对所有子区域匹配窗口进行相似性度量来确定对应的区域。区域匹配中有两个问题很重要,一是相似性准则的选取,一是窗口的选取。一些常用的区域匹配相关准则有:
其中互相关度量和归一化互相关度量的值越大说明相似度越高,其余的值越小说明相似度越高。在窗口选择方面,影响匹配效果的关键性因素是匹配窗口的大小,窗口过小就不能包含足够的亮度信息,使亮度变化与图像噪声的比值很小,使得误匹配率升高;窗口过大,则对视差边缘不能很好的体现,且计算量升高,同时匹配效果也有所降低。
图像问题的求解可以看成是马尔科夫随机场框架下的最大后验概率求解,并进一步转换为能量最小化问题的求解。全局匹配方法首先构造一个能量函数,其形式一般为,其中数据项描述了匹配程度,平滑项体现了定义场景的约束,动态规划(DP)、置信扩展(BP)、图割(GC)、模拟退火(SA)、扫描线优化(SO)、协作算法(CA)等优化算法都可以作为求解能量最小化的方法。其中动态规划、置信扩展和图割是最常用的方法。
(1)动态规划
该类方法利用每条扫描线上的顺序性约束将匹配的能量函数看作是从扫描线的起点到终点的最小代价路程问题。最优路径的代价是所有子路径代价之和,这些子路径所经过的点的匹配代价可以由区域相关度量算子来决定。
动态规划算法将问题分解为多个阶段决策进行。多个阶段互相联系并做出决策,从而使整个过程能量最优。通过在规划平面上搜索最佳路径得到最优的匹配。动态规划在一维优化中能够达到全局最优,但又因为它是在扫描线上进行匹配,使得它在扫描行之间存在严重的拖尾现象。
由于动态规划得到的是每条极线的最佳匹配而没有考虑极线与极线之间的约束关系,人们加入了极线间约束来得到极线间能量函数的最小值。与其他优化方法相比,动态规划的优点在于它为那些缺乏纹理而容易产生误匹配的区域提供了全局约束,解决了这些区域由于不同视差下的局部能量值都很低而难以匹配的问题。对于遮挡问题,动态规划中一般都将遮挡部分的能量用一个固定的值来代替,然后利用一致性约束来检测遮挡。动态规划方法的缺点是错误匹配可能沿核线方向扩展而导致其他正确匹配的失败,因此利用动态规划方法得到的视差图上经常有条纹出现。
(2)置信扩展
置信扩展算法最早在1988年由Pearl提出,1999年以后它被广泛应用于计算机视觉的各个领域来解决具有环的图结构的优化问题并得到了不错的结果。该算法对于没有环的图结构可以收敛到最优解,但对于有环的图结构不能保证收敛到最优解。目前该算法的研究重点是如何提高算法的效率。 Sun等[25]在2003年将置信扩展算法应用到立体匹配中并取得了很好的结果,2005年,Sun等又在算法中加入了可见性约束来检测遮挡现象。Felzenszwalb等[26]提出了层次置信扩展算法,从多个方面提高了置信扩展算法的速度。yang等[38]利用层次置信扩展算法实现了遮挡了检测。Tappen和Freemanl[28]分别用图割和置信扩展对同样参数的Potts模型马尔可夫随机场进行优化,结论是置信扩展比图割的结果更平滑,速度也比图割快,但能量高于图割,两者的效果是相当的。
(3)图割
近年来,随着图的优化算法在计算机视觉中的应用,基于图割的能量函数的最小化问题受到了很大的关注。Roy最早将图割算法应用于立体匹配,并通过实验表明,图割算法能有效克服其他全局优化算法的缺点(如动态规划算法等生成视差图产生的横向条纹瑕疵),避免了视差在临近极线处不连续的问题。但该算法生成的视差图轮廓边缘模糊,视差层的区分度低。Boykov与Kolmogorov利用特定约束构造能量函数,并通过改进的最大流方法进行能量函数的最小化,将该图割算法应用于立体匹配问题,取得了效果良好的致密视差图。(并且证明了图割方法在能量最小化时候取得的最小值和全局最小值相差一个已知常数)但该方法构建网络图时生成了大量节点,导致空间复杂度较高,同时,该算法运算过程需要多次迭代,时间复杂度高,无法达到实时计算的要求。为了提高匹配速度Li提出基于无重叠视差区域分割的立体匹配,并用分割块的能量最小化取代了常用图割算法像素级的能量最小化,降低了算法的时间复杂度,但生成的视差图边缘处有毛刺现象。Bleyer等人利用图像在每个分割块中的视差具有光滑性的特点,提出了基于图像分割的立体匹配算法的通用算法。但该方法无法得到像素级的最优分配,且复杂度高,计算量大。Bleyer与Rother针对现有采用基于低尺度分割,将图像分割成超像素形式从而减少图割算法生成节点的立体匹配方法。假设相同物体具有紧凑、连接并且物体表面视差变化平滑等特性,提出了一种新的基于物体分割的立体匹配方法。该方法虽然在物体分割与视差获取上效果良好,但是运算量大,对于物体和背景的内部区域缺少纹理的深度信息,并且物体间的区域没有准确的视差标注。
上述文献中基于图像分割的立体匹配方法,由于采用自动化非交互的彩色图像分割方法会把相同视差的区域分开或隐去了图像的部分细节信息,导致分割误差,而消除误差需要引入其他方法,如通过引入初试视差估计等方法,但这些方法增加了立体匹配算法的整体复杂度,而且没有有效利用分割信息。在实际应用场景中为了获取感兴趣区域的精细视差图,针对于以往基于图像分割的立体匹配算法复杂、计算量大,没有充分利用分割结果的信息等缺点,提出了一种基于交互式图像分割的立体匹配方法。该方法在图像分割时采用可交互的图割方法获得感兴趣目标,只针对感兴趣目标进行立体匹配,因此运算量大大减少,同时保留了原有图割算法具有的全局最优特性。
错误匹配率的定义如下:
其中,为整个图像的像素数,为计算出的视差图,为真实的视差图,在比对中,标准的真实视差图只取跟分割模板相同的部分,其余全部设置为背景,为误差容许值,一般情况下对于正整数范围内的视差标注取1。
SGBM算法作为一种全局匹配算法,立体匹配的效果明显好于局部匹配算法,但是同时复杂度上也要远远大于局部匹配算法。算法主要是参考Stereo Processing by Semiglobal Matching and Mutual Information[1],里面有讲完整的算法实现。
效果图:
BM效果图
SGBM效果图
平滑毛刺后的SGBM效果图