(1)输入两个左视图左视图和右视图,这两个视图已经被校准以实现线对齐。
向左扫描左视图,选择一个锚点,构建一个类似卷积核的小窗口。
向左覆盖-用这个小窗口,选择小窗口覆盖区域的所有像素
用这个小窗口覆盖——选择小窗口覆盖区域的所有像素。
从左覆盖区域的像素中减去右覆盖区域的像素,计算所有像素差值的绝对值之和。
移动右图小窗口,重复-操作。注意这里会设置一个搜索范围,如果超过这个范围就会跳出
找到该范围内SAD值最小的小窗口,然后找到与左图像锚点匹配最好的像素块。
2.1.1基于opencv的sadsumofaabsolutedifferences的c代码实现
首先定义了SAD算法的头文件SAD _ algorithm.h
# includei ostream # includeo penc v2/opencv . HPP # includeiomanpusingnamespace TD;使用usingnamespacecvclass SAD { public : SAD(): WinSize(7),DSR(30){}SAD(int_winSize,int_DSR):winSize(_winSize),DSR(_DSR){}MatcomputerSAD(MatL,MatR);//计算SADprivate:intwinSize//卷积核intDSR的大小;//视差搜索范围};matsad : computer sad(MatL,MatR){ 18行;int width l . cols;MatKernel_L(Size(winSize,winSize),CV_8U,scalar :3360 all(0));MatKernel_R(Size(winSize,winSize),CV_8U,scalar :3360 all(0));mat视差(高度、宽度、CV_8U、标量(0));//用于(inti0iWidth-winSize;I)//左图从DSR出发,穿越{ for(intj 0;jhx8e-winSize;j){Kernel_LL(Rect(i,j,winSize,WinSize));MatMM(1,DSR,CV_32F,标量(0));for(int k0;kDSRk){ intxi-k;if(x0){Kernel_RR(Rect(x,j,winSize,WinSize));MatDif内核_ 1,内核_R,Dif//求差ScalarADDsum(Dif)绝对值之和;浮动添加[0];mm . at float(k)a;} } PointminLoc最小最大值(毫米,空,空,最小最大值,空);intlocminLoc.x//intlocDSR-loc;视差. atchar(j,I)loc * 16;} double rate double(I)/(Width);Cout已完成设定精度(2)率* 100% endl;//显示处理进度} return视差;}调用示例# include sad _ algorithm . hint main(int argc,char * argv[]){ matimg _ limread(teddy _ l.png,0);//这里调用的图像已经放在项目文件夹MatImg_Rimread(Teddy_R.png,0);mat视差;//创建视差图SADmySAD(7,30);//给SAD参数disparitymsad。computersad (img _ l,img _ r);imshow(Teddy_L,Img _ L);imshow(Teddy_R,Img _ R);不一致,不一致;//显示视差图waitKey();系统(暂停//按任意键退出return0{}
2.1.2SAD算法的运行效果
可见SAD算法运行速度较快但效果较差。
2.2平方差最小原则
SSDsumofsquareddifferences的算法大致类似于SADsumofabsolutedifferences。
数学公式如下
由于SSD匹配算法的流程和代码实现与SAD匹配算法类似,并且考虑到空间的长度,这里不描述SSD算法的基本流程和代码实现。
2.3 sgbm半全局块调度的原理
SGM(半全局匹配)是一种用于计算双目立体视觉中视差的半全局匹配算法。opencv中的实现是SGBMsemi-globalblockmatching。
根据SGBM原理,与由每个像素的视差组成的视差图相关的全局能量函数被设置为最小化该能量函数。
原创文学heikohirschmuller。立体匹配和信息处理。模式分析与机器智能,IEEE Transactionson,30(2):328341,2008。
它的能量函数如下
三维视差图(视差图)
p,q—图像中的一个像素
NP像素Pd的相邻像素通常被认为是8连接的
Cp,Dp-当前像素视差为Dp时的成本
当像素p的相邻像素中的视差值和p的视差值分别为1和大于1时,P1、p2惩罚系数是适用的
I[]—当[]中的参数为真时返回1,否则返回0
SGBM算法的基本流程如下
(1)预处理使用sobel算子对源图像进行处理,将sobel算子处理后的图像映射成新的图像,获取图像的梯度信息,用于后续的计算开销。
成本计算:利用抽样方法计算预处理得到的图像梯度信息的梯度成本,利用抽样方法计算源图像的SAD成本。
动态规划默认的四条路径,设置路径规划的参数P1P2,包括P1、P2、cn图像通道数,以及SADWindowsizeSAD窗口大小。
后处理包括唯一性检测、亚像素插值、左右一致性检测和连通区域检测。
2.3.1基于opencv的sgbmsemi-globalblockscheduling的c代码实现
首先,定义一个SGBM算法SGBM算法的头文件
有关具体参数,请参见代码及其注释。如果读者需要优化,可以自行调整,不赘述
枚举{立体声_BM0,立体声_SGBM1,立体声_HH2,立体声_VAR3,立体声_ 3way 4 };# includei ostream # includeo penc v2/opencv . hppusingnamespace TD;使用usingnamespacecvvoidcalDispWithSGBM(MatImg_L,MatImg_R,matimgdisparity 8u){ SizeimgSizeImg _ L . size();intnumberofdsparities((imgsize . width/8)15-16;ptrstereosgmsgbmstereosgbm 33603360 create(0,16,3);intcnImg _ l . channels();//左图像intSADWindowSize9中的通道数;intsgbmWinSizeSADWindowSize0?SADWindowSize:3sgbm-SetMindisparity(0);//minDisparity最小视差默认为0sgbm-setnum视差(视差数);//numDisparity差异搜索范围必须是16 sgbm-setp1的整数倍(8 * cn * sgbmwinsize * sgbmwinsize);sgbm-SetP 2(32 * cn * sgbmWinSize * sgbmWinSize);//一般建议惩罚系数P1和P2取这两个值来控制视差图的平滑度。//P2越大,视差图越平滑。sgbm-setdisp 12 MaxDiff(1);//最大允许误差阈值sgbm-setPreFilterCap(31用于左右一致性检测(31);//预处理滤波器的截断值只保持预处理的输出值在/[-prefirmecap,prefirmecap]范围内,参数范围为1-3ss GBM-setuniquenesratio(10);//视差窗口内最低成本为次低成本的(1唯一性比/100)倍时的视差唯一性百分比//最低成本对应的视差值为该像素的视差;否则,该像素的视差为0,不能为负。一般去5——15 sgbm-set sparklewindowsize(100);//视差连通区域的像素数大小对于每个视差点,当连通区域的像素数小于//sparkwindowsize时,认为视差值作为噪声无效。sgbm-SetSpakRange(32);//视差连通条件在计算一个视敏度的连通面积时,如果下一个视差像素的视差变化绝对值大于//sparkrange,则认为下一个视差像素与当前视差像素无关。sgbm-SetMOde(0);//选择sgbm-SetBlockSize(sgbmwinSize);//设置SAD代价计算窗口一般在3*3到21*21之间//块大小越小(sad windowize),即匹配代价计算窗口越小,视差图的噪声越大//块大小越大,视差图越平滑//太大容易导致过平滑和不匹配的增加,体现在视差图中空洞的增加//选择三种模式:HH,SGBM,3way intalgorithm stereo _ SGBM if(algorithm stereo _ HH)sgbm-set mode(立体声M33)else if(Algorithm Streamer _ SGBM)sgbm-set mode(Streamogbm :3360 mode _ SGBM);else if(algorithm stereo _ 3 way)sgbm-set mode(立体声m :3360 mode _ SGBM _ 3 way);matimgdisparity 16 smat(Img _ l . rows,Img_L.cols,CV _ 16S);sgbm-compute(Img_L,Img_R,IMgdispirity 16s);//-displayitasacv _ 8uc1image 16位有符号到8位无符号img显示16s。convertto (img display 8u,cv _ 8u,255/(显示器数量* 16。));}调用示例# includes GBM _ algorithm . hint main(){ matimg _ limread(teddy _ l.png,0);MatImg_Rimread(Teddy_R.png,0);MatDisparity8UMat(Img_L.rows,Img_R.cols,CV _ 8UC 1);//创建视差图像caldispwitshgbm(img _ l,img _ r,视差8u);imshow(Teddy_L,Img _ L);imshow(Teddy_R,Img _ R);imshow(视差,Disparity 8U);WaitKey();系统(暂停//按任意键退出return0{}
2 . 3 . 2 sgbm算法的运行效果
我还顺便调整了SADWindowsize的大小,讨论并展示了设置不同的SADWindowsize大小对视差渲染的影响。结果都是模式_SGBM模式,如下所示
通过比较上述不同SADWindowsize尺寸和其他参数不变的效果图,我们可以知道以下结论
当SADWindowsize太小时,视差图的噪声更大。随着SADWindowsize的增加,视图更加平滑,但是当SADWindowsize过大时,视差图中的空洞现象会增加。所以在选择SADWindowsize的大小时,要选择合适的大小。建议选择SADWindowsize9。
3.双目立体视觉的发展现状
目前,双目立体视觉技术在国外已经广泛应用于生产和生活中,但在中国,双目立体视觉技术仍处于起步阶段,在座的各位仍然需要努力工作,争取创新。
3.1双目立体视觉的发展方向
就双目立体视觉的发展现状和发展目标而言,实现类似人眼的通用双目立体视觉还有很长的路要走。我认为进一步的发展方向可以概括如下
(1)探索新的更具普适性的计算理论和匹配算法结构,解决现有的灰度失真、噪声干扰和几何失真等问题。
提高算法性能,优化算法,尽可能推向实时效果。
建立更有效的双目立体模型可以充分反映立体视觉不确定性的本质属性,为匹配提供更多的约束信息,降低立体匹配的难度。
强调场景和任务的约束,建立适合不同场景和任务的双目立体视觉系统的标准和方法。
3.2国内外双目立体视觉发展
双目立体视觉主要应用于机器人导航、微操作系统参数检测、三维测量和虚拟现实。
目前,日本大阪大学自适应机械系统研究所已经开发了一种自适应双目视觉伺服系统,利用双目立体视觉的原理,以每幅图像中三个相对静止的标记为参考,实时计算目标图像的雅可比短阵,从而预测目标的下一个运动方向,实现对未知运动模式目标的自适应跟踪。这个系统只要求在没有相机参数的情况下,两幅图像中仍然有参考标记。
日本奈良科技大学信息科学学院提出了一种基于双目立体视觉的增强现实系统ar配准方法,通过动态校正特征点的位置来提高配准精度。
日本东京大学将实时双目立体视觉与机器人的整体姿态信息相结合,开发了机器人动态长线导航系统,根据实时情况构建实时地图,从而实现障碍物检测。
日本冈山大学开发了一种视觉反馈系统,利用立体显微镜控制操纵细胞的微机械手、基因注射和钟罩的微组装等。
麻省理工学院的计算机系统提出了一种新的智能车辆传感器融合方法。雷达系统提供目标深度的近似范围,双目立体视觉结合改进的图像分割算法提供粗略的目标深度信息,从而高速分割视频图像中的目标位置。
华盛顿大学与微软公司合作,为火星卫星“探索者”开发了一种宽基线立体视觉系统,使“探索者”能够准确定位和导航其即将在火星上穿越的几公里范围内的地形。
在国内,浙江大学机械系统充分利用透视成像原理,采用双目立体视觉方法,实现多自由度机械设备的动态精确位姿检测。只需要从两幅对应的图像中提取必要的特征点,三维坐标信息少,处理速度快,特别适合动态情况。
视觉图像公司利用双目ccd摄像机,从工业摄像机内参考标定、镜头畸变标定、立体匹配、特征点分割等方面给出了详细的数学模型和算法界面。其双目标定软件ccas采用张的平面标定方法,可实现机器人导航、微操作系统参数检测、三维测量和虚拟现实。
基于双目立体视觉,东南大学电子工程系提出了一种灰度相关多峰视差绝对值最小化的立体匹配新方法,可以无接触精确测量三维不规则物体偏转线圈的三维空间坐标。
哈尔滨工业大学利用异构双目视觉系统实现足球机器人自主导航。固定摄像机和水平旋转摄像机
火星863项目“人体三维尺寸的非接触测量”是由两台相机利用“双视图投影光栅三维测量”原理获得的
相关阅读
标签: #双目视觉研究最新动态