本篇文章8635字,读完约22分钟
(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{}# #包括iostream #包括opencv2/ opencv.HPP #包括域名空间; usingnamespacecvclasssad:sad ( ):winsize(7(7)、dsr(30 ) {}sad(int_winsize )、 int_dsr ):winsize ( ) sad专用性: int winsize//计算卷积核intdsr的大小//视差搜索范围: matsad :计算机sad ( matl,matr ) { mat kernel _ l (大小( winsize、winsize )、cv_8u、缩放: 3360全部(0) ) mat kernel _ r (大小、winsize ) ) I )//从左图dsr出发,{ for(intj 0; jhx8e-winsize; j ) { kernel _ ll (反应( I,j,winsize,winsize ) }最大毫米( 1,dsr,cv_32f,标量(0) :最大值( int k0 ); kdsrk ) {英特西- k; if(x0 ) { kernel _ RR (反应( x、j、灵敏度、灵敏度) }; 求matdif内核_ 1、内核_r、dif//差scalaraddsum(dif )的绝对值之和的浮动追加[0]; 美国航空母舰( k ) a; } } pointminloc的最小最大值(毫米、/K0/]、/K0/]、最小值、/K0/ ); intlocminloc.x//intlocdsr-loc; 视差. atchar(j,I ) loc * 16; 双重速率双重( I )/(width ); cout设定精度(2)率* 100% endl已完成。 //显示解决的进度}返回视差; 调用示例# includesad _ algorithm.hint main (整数数组、字符数组[ ] ) { matimg _ lim读( teddy _ l.png,0 ) /在此处调用 mat视差; /传递创建视差图sadmysad的( 7,30 ) sad参数disparitymsad。 计算机辅助存储( img _ r、img _ r ); im show (特迪迪_ l、img _ l ); im show (泰迪_ r、img _ r ); 显示不匹配、不匹配/视差图waitkey ( )的系统(暂停//按任意键退出return0{} )
可见,sad算法运行速度很快,但效果很差。
2.2平方偏差最小的大致是
ssdsumofsquareddifferences的算法与sadsumofabsolutedifferences大致相似。
由于ssd匹配算法的流程和代码实现与sad匹配算法相似,考虑到空之间的长度,这里不赘述ssd算法的基本流程和代码实现。
2.3 sgbm半全局块调度原理
SGM(semi-globalmatching )是用于计算双目立体视觉中的视差的半全局匹配算法。 在opencv上的实现是sgbmsemi -全球定位匹配。
根据sgbm的原理,与由各像素的视差构成的视差图相关的全局能量函数被设定为使能量函数最小化。
原创文学heikohirschmuller。 立体匹配和新闻解决。 模式分析和机器智能,ieee transactionson,30(2):328341,2008。
三维视差图(视差图)
p、q—图像中的一个像素
cp,dp-当前像素视差为dp时的价格
当像素p的相邻像素中的视差量和p的视差量分别大于1和1时,应用p1,p2惩罚系数
sgbm算法的基本流程如下
(1)利用预求解sobel算子求解源图像,将sobel算子求解的图像映射到新图像上,获取图像梯度新闻,用于后续的计算开销。
价格计算:通过抽样方法计算预先解决的图像梯度新闻的梯度价格,通过抽样方法计算源图像的sad价格。
动态规划默认的四个路径,并设置路径规划的参数p1p2,包括p1、p2、cn图像通道数和sadwindowsizesad窗口大小。
后解决包括唯一性检测、子像素插值、左右一致性检测、连通区域检测。
2.3.1基于opencv的sgbmsemi -全球块排程的c代码实现
有关具体参数,请参阅代码及其注释。 如果网民需要优化,可以自己调整。 省略详细说明
枚举{立体声_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{}列举{立体声_bm0、立体声_sgbm1、立体声_hh2、立体声_var3、立体声_ 3路4 }; # #包括iostream #包括opencv2/ opencv.hppusingnamespacetd; 采用usingnamespacecvvoidcaldispwithsgbm ( matimg _ l、matimg_r、matimgdisparity 8u ) { sizeimgsizeimg _ l . size ( ) }。 intnumberofdsparities ( ( imgsize.width/8 ) 15-16; ptrstereosgmsgbmstereosgbm 33603360创建( 0、16、3 )英特尔迅驰移动通信( ); /左图像intsadwindowsize9中的通道数intsgbmwinsizesadwindowsize0? sad windowsize:3s GBM-setmindisparity (0)//mindisparity最小视差默认值为0sgbm-setnum视差(视差数); //numdisparity差分搜索范围必须是16 sgbm-setp1的整数倍(8 * cn * sgbmwinsize * sgbmwinsize )。 sgbm-setp2( 32 * cn * sgbmwinsize * sgbmwinsize ):/通常,惩罚系数p1和p2建议取这两个值来控制视差图的平滑度。 /p2越大,视差图越平滑。 sgbm-setdisp 12 maxdiff(1)//最大允许误差阈值sgbm-setprefiltercap(31左右一致检测用)//预失真器的截止值为/ [-prefirmm ] //当视差窗口中的最低价格是第二便宜的价格( 1唯一性比率/100 )倍时,与视差唯一性百分比//最低价格相对应的视差值是像素的视差。 否则,该像素的视差为0,不能为负。 通常去5-- 15 sgbm-setsparklewindowsize ( 100 )。 //视差连通区域的像素数的大小对于各个视域来说,在连通区域的像素数小于//sparkwindowsize的情况下,视差值作为噪声无效。 sgbm-setspakrange(32 )//视差连通条件在计算一个视差的连通面积时,如果下一个视差像素的视差变化的绝对值大于//sparkrange,则下一个视差像素被视为与当前视差像素无关。 选择sgbm-setmode(0) sgbm-set块大小( sgbmwinsize )。 //设定sad成本计算窗口通常在3*3~21*21间//块大小越小,即匹配成本计算窗口越小,视差图的噪声越大//块大小越大 视差图中出现空的3 wayintalgorithmstereo _ SGB MIF ( Algorithm stereo _ hh ) sgbm-set模式(立体m33 ) else if ( Algorithithh ELSE IF ( Algorithm Stereo _ 3路) SGBM-set模式(立体声m:3360模式_ SGBM _ 3路) Matimgdisparity 16 smat ( img _ l.rows sgbm-compute(img_l、img_r、imgdispirity 16s )//-displayitasacv _ 8u C1图像16位带符号~8位无符号img显示16s。 转换( img显示器8u、cv _ 8u、255/(显示器数量* 16 )。 ); 调用示例# includes GBM _ algorithm.hint main ( ) { matimg _ lim读( teddy _ l.png, 0 ) matimg _ rim读取( teddy _ r.png,0 ) matdisparity8umat(img_l.rows,img_r.cols,cv _ 8uc 1)//视差图像caldo im show (特迪迪_ l、img _ l ); im show (泰迪_ r、img _ r ); imshow (视差,差异8u )等待密钥( ); 系统(暂停//按任意键退出return0{})
另外,还研究并展示了调整sadwindowsize大小,设定不同的sadwindowsize大小对视差渲染的影响。 结果是模式_sgbm模式,如下所示
通过比较上述不同的sadwindowsize大小和其他参数不变的效果图,可以得出以下结论
如果sadwindowsize太小,视差图的噪声就会变大。 随着sadwindowsize的增加,视图会变得更平滑,但是如果sadwindowsize太大,视差贴图的空孔现象会增加。 因此,在选择sadwindowsize的大小时,请选择适当的大小。 建议选择sadwindowsize9。
目前,双目立体视觉技术在国外广泛应用于生产和生活,但在我国,双目立体视觉技术还处于起步阶段,在座的各位仍需努力工作以谋求创新。
. 1双目立体视觉的快速发展方向
关于双目立体视觉的快速发展现状和快速发展目标,实现人眼一般的通用双目立体视觉还有很长的路要走。 我认为更迅速的发展方向可以概括如下。
(1)探索新的更普遍的计算理论和匹配算法结构,处理现有的灰度失真、噪声干扰、几何失真等问题。
建立更有效的双目立体模型,可以充分反映立体视觉不清晰性的本质属性,为匹配提供越来越多的约束新闻,降低立体匹配的难度。
强调场景和任务的制约,建立适合不同场景和任务的双目立体视觉系统的标准和方法。
双目立体视觉主要应用于机器人导航、微操作系统参数检测、三维测量和虚拟现实。
目前,大阪大学自适应机械系统研究所利用双目立体视觉的原理,以各图像中3个相对静止的标记为基准,实时计算目标图像的雅可比短序列,预测目标的下一运动方向,开发了实现未知运动模式目标自适应跟踪的自适应双目视觉伺服系统 即使没有相机参数,该系统也只要求两张图像上有参照标记。
日本科学技术大学新闻科学学院提出了一种基于双目立体视觉的增强现实系统ar定位方法,通过动态校正特征点的位置提高了定位精度。
东京大学将实时双目立体视觉与机器人整体姿态新闻相结合,开发了机器人动态长线导航系统,根据实时情况构建了实时地图,实现了障碍物检测。
冈山大学开发了使用立体显微镜操作细胞的微型机器人、控制基因注射和钟罩的微组装等的视觉反馈系统。
麻省理工学院的计算机系统提出了一种新的智能车辆传感器融合方法。 雷达系统提供了目标深度的近似范围,双目立体视觉结合改进的图像分割算法提供了大致的目标深度新闻,并快速分割视频图像中的目标位置。
华盛顿大学与微软公司合作,为火星卫星“探险家”开发了广阔的基线立体视觉系统,使“探险家”能够准确地确定和导航穿越火星数公里范围内的地形。
在国内,浙江大学的机械系统完全利用透视成像原理,使用双目立体视觉方法,实现多自由度机械设备的动态精确姿态检测。 只需要从两个对应的图像中提取必要的特征点,三维坐标新闻少,解决速度快,特别适合于动态的情况。
视觉影像企业利用双目ccd摄像机,从工业摄像机内的参考标定、镜头畸变标定、立体匹配、特征点分割等方面提供了详细的数学模型和算法接口。 其双目标定软件ccas使用张的平面标定方法,可以实现机器人导航、微操作系统的参数检测、三维测量和虚拟现实。
基于双目立体视觉,东南大学电子工程系提出了一种将灰度相关多峰值视差绝对值最小化的立体匹配新方法,能够以非接触的方式准确测量三维不规则物体偏转线圈的三维空间坐标。
哈尔滨工业大学利用异构双目视觉系统实现足球机器人自主导航。 固定照相机和水平旋转照相机
火星863项目“人体三维尺寸的非接触测量”是两台相机利用“双视图投影光栅三维测量”的原理得到的
标题:“关于双目立体视双目视觉研究最新动态觉的三大基本算法及快速发展现状的总结”
地址:http://www.hongyupm.com/gnyw/5265.html