版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
双目立体视觉一直是机器视觉研究领域的发展热点和难点,“热”是因为双目立体视觉有着及其广阔的应用前景,且随着光学、计算机科学等学科的不断发展,双目立体技术将不断进步直到应用到人类生活的方方面面。“难”则是因为受到摄像机、镜头等硬件设备及一些相关算法的限制。一.简介双目立体视觉是机器视觉中的一个重要分支,自上世纪60年代中期开创以来,经过几十年的发展,如今在机器人视觉、航空测绘、军事应及医学成像、工业检测上应用极其广泛。双目立体视觉基于视差原理并利用成像设备从不同的位置获取被测物体的左右两幅图像,然后根据三角测量原理计算空间点在二维图像的位置偏差,最后再利用位置偏差进行三维重建来获取被测物体的三维几何信息(本文不对双目立体视觉的数学原理进行详细介绍)。二.双目立体视觉的三大基本算法的原理及其代码实现(基于opencv)双目立体视觉中常用的基于区域的局部匹配准则主要有图像序列中对应像素差的绝对值之和SAD(sumofabsolutedifferences)、对应像素差的平方之和SSD(sumofsquareddifferences)及半全局匹配算法SGM(semi—globalmatching)。2.1SAD(sumofabsolutedifferences)的原理匹配算法SAD的基本思想是对经行对准后的左右视图图像的对应像素块的对应像素差的绝对值进行求和。其数学公式如下:SAD匹配算法的基本流程如下:①输入两幅已经校正实现行对准的左视图(Left-Image)及右视图(Right-Image)。②对左视图Left-Image进行扫描选定一个锚点并构建一个类似于卷积核的小窗口。③用此小窗口覆盖Left-Image,并选择出小窗口覆盖区域的全部像素点④同样用此小窗口覆盖Right-Image,并选择出小窗口覆盖区域的全部像素点。⑤Left-Image覆盖区域的像素减去Right-Image覆盖区域的像素,并求出所有像素点的差的绝对值之和。⑥移动Right-Image的小窗口并重复④—⑤的操作(注意此处会设置一个搜索范围,超过此范围则跳出)⑦找到这个范围内SAD值最小的小窗口,此时便找到了与Left-Image锚点的最佳匹配的像素块。2.1.1SAD(sumofabsolutedifferences)的基于opencv的C++代码实现首先先定义一个SAD算法的头文件(SAD_Algorithm.h):#include"iostream"#include"opencv2/opencv.hpp"#include"iomanip"usingnamespacestd;usingnamespacecv;classSAD{public:
SAD():winSize(7),DSR(30){}
SAD(int_winSize,int_DSR):winSize(_winSize),DSR(_DSR){}
MatcomputerSAD(Mat&L,Mat&R);//计算SADprivate:
intwinSize;//卷积核的尺寸
intDSR;
//视差搜索范围};MatSAD::computerSAD(Mat&L,Mat&R){
intHeight=L.rows;
intWidth=L.cols;
MatKernel_L(Size(winSize,winSize),CV_8U,Scalar::all(0));
MatKernel_R(Size(winSize,winSize),CV_8U,Scalar::all(0));
MatDisparity(Height,Width,CV_8U,Scalar(0));//视差图
for(inti=0;i<Width-winSize;i++)
//左图从DSR开始遍历
{
for(intj=0;j<Height-winSize;j++)
{
Kernel_L=L(Rect(i,j,winSize,winSize));
MatMM(1,DSR,CV_32F,Scalar(0));
for(intk=0;k<DSR;k++)
{
intx=i-k;
if(x>=0)
{
Kernel_R=R(Rect(x,j,winSize,winSize));
MatDif;
absdiff(Kernel_L,Kernel_R,Dif);//求差的绝对值之和
ScalarADD=sum(Dif);
floata=ADD[0];
MM.at<float>(k)=a;
}
}
PointminLoc;
minMaxLoc(MM,NULL,NULL,&minLoc,NULL);
intloc=minLoc.x;
//intloc=DSR-loc;
Disparity.at<char>(j,i)=loc*16;
}
doublerate=double(i)/(Width);
cout<<"已完成"<<setprecision(2)<<rate*100<<"%"<<endl;//显示处理进度
}
returnDisparity;}调用示例:#include"SAD_Algorithm.h"intmain(intargc,char*argv[]){
MatImg_L=imread("Teddy_L.png",0);
//此处调用的图像已放入项目文件夹中
MatImg_R=imread("Teddy_R.png",0);
MatDisparity;
//创建视差图
SADmySAD(7,30);
//给出SAD的参数
Disparity=mySAD.computerSAD(Img_L,Img_R);
imshow("Teddy_L",Img_L);
imshow("Teddy_R",Img_R);
imshow("Disparity",Disparity);
//显示视差图
waitKey();
system("pause");
//按任意键退出
return0;}2.1.2SAD算法的运行效果可以看出SAD算法虽然运行较快,但效果较差。2.2SSD(sumofsquareddifferences)的原理SSD(sumofsquareddifferences)算法大致与SAD(sumofabsolutedifferences)相似。其数学公式如下:因SSD匹配算法与SAD匹配算法的过程及代码实现相类似,考虑到篇幅长度的原因,故SSD算法的基本过程及代码实现在本文中不在赘述,读者可去自行实现。2.3SGBM(semi-globalblockmatching)的原理SGM(semi-globalmatching)是一种用于计算双目立体视觉中的disparity的半全局匹配算法。其在opencv中的实现为SGBM(semi-globalblockmatching)。SGBM的原理:设置一个和disparitymap(由每个像素点的disparity所构成)相关的全局能量函数,使这个能量函数最小。原始文献:HeikoHirschmuller.Stereoprocessingbysemiglobalmatchingandmutualinformation.PatternAnalysisandMachineIntelligence,IEEETransactionson,30(2):328–341,2008.其能量函数如下:D--disparitymap(视差图)p、q—图像中的某个像素Np—像素点Pd相邻像素点(一般认为是8连通)C(P,Dp)--当前像素点的disparity为Dp时,该像素点的costP1、P2—惩罚系数,分别适用于当像素P相邻像素中的disparity值与P的disparity差值为1和大于1时I[]—当[]内的参数为真时返回1,否则返回0SGBM算法的基本流程如下:①预处理:使用sobel算子对源图像进行处理,并将经sobel算子处理后的图像映射为新图像,并得到图像的梯度信息用于后续的计算代价。②代价计算:使用采样方法对经预处理得到的图像梯度信息计算梯度代价、使用采样方法对源图像计算SAD代价。③动态规划:默认四条路经,并对路径规划的参数P1,P2进行设置(包括P1、P2、cn(图像通道数量)以及SADWindowsize(SAD窗口大小)的设置)。④后处理:包括唯一性检测、亚像素插值、左右一致性检测、连通区域的检测。2.3.1SGBM(semi-globalblockmatching)的基于opencv的C++代码实现首先先定义一个SGBM算法的头文件(SGBM_Algorithm.h):具体参数见代码及其注释(若读者需优化可自行调整),不再赘述enum{STEREO_BM=0,STEREO_SGBM=1,STEREO_HH=2,STEREO_VAR=3,STEREO_3WAY=4};#include"iostream"#include"opencv2/opencv.hpp"usingnamespacestd;usingnamespacecv;voidcalDispWithSGBM(MatImg_L,MatImg_R,Mat&imgDisparity8U){
SizeimgSize=Img_L.size();
intnumberOfDisparities=((imgSize.width/8)+15)&-16;
Ptr<StereoSGBM>sgbm=StereoSGBM::create(0,16,3);
intcn=Img_L.channels();
//左图像的通道数
intSADWindowSize=9;
intsgbmWinSize=SADWindowSize>0?SADWindowSize:3;
sgbm->setMinDisparity(0);
//minDisparity最小视差默认为0;
sgbm->setNumDisparities(numberOfDisparities);
//numDisparity视差搜索范围,其值必须为16的整数倍;
sgbm->setP1(8*cn*sgbmWinSize*sgbmWinSize);
sgbm->setP2(32*cn*sgbmWinSize*sgbmWinSize);
//一般建议惩罚系数P1、P2取此两值,P1、P2控制视差图的光滑度
//P2越大,视差图越平滑
sgbm->setDisp12MaxDiff(1);
//左右一致性检测最大容许误差阈值
sgbm->setPreFilterCap(31);
//预处理滤波器的截断值,预处理的输出值仅保留
//[-preFilterCap,preFilterCap]范围内的值,参数范围:1-31
sgbm->setUniquenessRatio(10);
//视差唯一性百分比:视差窗口范围内最低代价是次低代价的(1+uniquenessRatio/100)倍时
//最低代价对应的视差值才是该像素点的视差,否则该像素点的视差为0,不能为负值,一般去5——15
sgbm->setSpeckleWindowSize(100);
//视差连通区域像素点个数的大小:对于每一个视差点,当其连通区域的像素点个数小于
//speckleWindowSize时,认为该视差值无效,是噪点。
sgbm->setSpeckleRange(32);
//视差连通条件:在计算一个视差点的连通区域时,当下一个像素点视差变化绝对值大于
//speckleRange就认为下一个视差像素点和当前视差像素点是不连通的。
sgbm->setMode(0);
//模式选择
sgbm->setBlockSize(sgbmWinSize);
//设置SAD代价计算窗口,一般在3*3到21*21之间
//blockSize(SADWindowSize)越小,也就是匹配代价计算的窗口越小,视差图噪声越大;
//blockSize越大,视差图越平滑;
//太大的size容易导致过平滑,并且误匹配增多,体现在视差图中空洞增多//三种模式选择(HH、SGBM、3WAY)
intalgorithm=STEREO_SGBM;
if(algorithm==STEREO_HH)
sgbm->setMode(StereoSGBM::MODE_HH);
elseif(algorithm==STEREO_SGBM)
sgbm->setMode(StereoSGBM::MODE_SGBM);
elseif(algorithm==STEREO_3WAY)
sgbm->setMode(StereoSGBM::MODE_SGBM_3WAY);
MatimgDisparity16S=Mat(Img_L.rows,Img_L.cols,CV_16S);
sgbm->compute(Img_L,Img_R,imgDisparity16S);
//--DisplayitasaCV_8UC1image:16位有符号转为8位无符号
imgDisparity16S.convertTo(imgDisparity8U,CV_8U,255/(numberOfDisparities*16.));}调用示例:#include"SGBM_Algorithm.h"intmain(){
MatImg_L=imread("Teddy_L.png",0);
MatImg_R=imread("Teddy_R.png",0);
MatDisparity8U=Mat(Img_L.rows,Img_R.cols,CV_8UC1);//创建一个Disparity图像
calDispWithSGBM(Img_L,Img_R,Disparity8U);
imshow("Teddy_L",Img_L);
imshow("Teddy_R",Img_R);
imshow("Disparity",Disparity8U);
waitKey();
system("pause");
//按任意键退出
return0;}2.3.2SGBM算法的运行效果还顺便调整了SADWindowsize的大小来给读者探讨并展示当设置不同SADWindowsize大小时对Disparity效果图的影响,其结果如下(皆为MODE_SGBM模式下):由上述在不同SADWindowsize大小设置(其他参数保持不变)的效果图对比下我们可得知如下结论:SADWindowsize过小时,视差图的噪声较多;随着SADWindowsize的增大,视图越平滑,但当SADWindowsize过大时,视差图中的空洞现象会增加;故在选择SADWindowsize的大小时,应选取合适的大小(建议选择SADWindowsize=9)。三.双目立体视觉的发展现状目前在国外,双目立体视觉技术已广泛运用于生产生活实际中,但在我国,双目立体视觉技术仍处在起步阶段,仍需要在座的各位发奋图强、力争创新。3.1双目立体视觉的发展方向就双目立体视觉的发展现况和发展目标(达到类似于人眼的通用双目立体视觉)仍是路漫漫其修远兮,我认为进一步的发展方向可以归纳如下:①探索新的更具有通用性的计算理论和匹配算法结构,以解决目前存在的灰度失真、噪声干扰以及几何畸变的问题。②提高算法的性能,对算法进行优化,尽可能向实时效果推进。③建立更有效的双目体视模型能更充分地反映立体视觉不确定性的本质属性,为匹配提供更多的约束信息,降低立体匹配的难度。④强调场景与任务的约束,建立适用于不同场景和任务的双目立体视觉系统的标准和方法。3.2双目立体视觉的国内外发展动态双目体视目前主要应用于四个领域:机器人导航、微操作系统的参数检测、三维测量和虚拟现实。目前在国外,日本大阪大学自适应机械系统研究院研制了一种自适应双目视觉伺服系统,利用双目体视的原理,如每幅图像中相对静止的三个标志为参考,实时计算目标图像的雅可比短阵,从而预测出目标下一步运动方向,实现了对动方式未知的目标的自适应跟踪。该系统仅要求两幅图像中都有静止的参考标志,无需摄像机参数。日本奈良科技大学信息科学学院提出了一种基于双目立体视觉的增强现实系统(ar)注册方法,通过动态修正特征点的位置提
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年甘肃兰州铁路技师学院招聘考试真题
- 2023年安康汉阴县人民医院招聘考试真题
- 2024年婚姻继承协议书
- 2024年城市公共交通车辆转手协议
- 2024年大数据分析服务合同 with 数据安全和隐私保护
- 2024年国际艺术品拍卖代理合同
- 2024年工业用水设施安装合同
- 2024年SET协议在电子商务中的应用开发合同
- 2024年品牌推广B2B电商合同
- 2024年幼儿园安全隐患整治合同
- 第7章-机器学习
- 2024年秋季新人教版7年级上册生物课件 第2单元 第2章大单元整体设计
- 第1课 课题一《课外生活小调查·周末生活我采访》(教案)-2024-2025学年三年级上册综合实践活动浙教版
- 世界的气温和降水课件
- 大学生职业发展与就业指导 课件 模块3、4 职业世界探索、大学生就业和未来发展的主要方式
- 离心压缩机设计-曼透平
- 北京市通州区2024届高三上学期期中质量检测数学试题 含解析
- Unit2 School things Lesson 3 (教学设计)-2024-2025学年人教精通版(2024)英语三年级上册
- 江苏省2024高中学业水平合格考历史试卷试题(含答案详解)
- DB11T 2256-2024 城市轨道交通钢轨踏面维修技术规范
- 堤溪沱江大桥特别重大坍塌事故工程伦理案例分析
评论
0/150
提交评论