当前位置:首页 > 嵌入式 > 嵌入式分享

很多刚接触2D视觉调试的工程师都会遇到类似的场景:相机视野选得比较大、工件模板的尺寸也不小的时候,直接做全分辨率的模板匹配,单次计算就要花几百毫秒,根本跟不上高速产线的生产节拍。过去遇到这类问题,很多人会选择升级配置更高的工控机、或者缩小相机视野减少计算量,实际上在工业视觉的算法体系里,早已有一套非常成熟的提速方案——图像金字塔技术。这套方案不需要更换任何硬件,通过对图像做分层缩放,就能在不损失定位精度的前提下,把模板匹配的速度提升数倍,也是现在绝大多数商用2D视觉库,能在普通工控机上做到毫秒级匹配响应的核心底层逻辑之一。

全分辨率匹配为什么慢:计算量的核心来源

要理解图像金字塔的加速逻辑,先要明白常规的全分辨率模板匹配,计算量是怎么累计起来的。最朴素的匹配逻辑,是拿着存好的模板图像,在实时拍摄的整张大图上从左到右、从上到下逐像素滑动,在每一个滑动位置上,计算模板和对应区域图像的相似度得分,找到得分最高的那个位置,再计算对应的平移和旋转偏差。

这种计算方式的复杂度非常高:比如一台2000万像素的工业相机,拍出来的实时图是5120*3840的尺寸,需要匹配的工件模板是500*500大小,光是模板在图上可以滑动的位置就有近1500万个,每一个位置还要计算500*500个像素的相似度差异,累计下来的总计算量是非常大的。哪怕工控机的CPU性能不错,跑完一遍全像素的匹配流程,往往也要几百毫秒,对于要求单次定位周期在100毫秒以内的高速产线来说,这个计算速度根本达不到生产要求。

过去为了解决这个问题,很多产线会选择直接缩小相机的拍摄视野,或者在很小的局部搜索区域里找目标,但这种方式牺牲了相机的观察范围,工件摆放的容错度也会跟着下降,并不是非常灵活的解决方案。

图像金字塔的基础逻辑:分层缩放的直观思路

图像金字塔的核心思路其实和人眼观察物体的逻辑非常相似:当我们在一个大空间里找某个目标时,不需要一开始就盯着地面的每一个细节,只要站在稍远的位置快速扫一眼,就能先确定目标大概在哪个区域;等找到大概位置之后,再走近这个区域,仔细辨认目标的细节位置。

对应到算法流程上,图像金字塔就是把原始的高分辨率图像,按照固定的比例一层一层缩小,形成一个分辨率从高到低的图像集合:第一层是原始分辨率的全尺寸图,第二层的宽和高都缩小到原始图的二分之一,对应的像素面积就是原始图的四分之一;第三层再在第二层的基础上,宽高再缩一半,像素面积就是原始图的十六分之一;按照这个规律一直往下缩,直到图像的尺寸小到可以快速完成匹配为止。与此同时,用来匹配的模板图像,也按照同样的比例,对应每一层的图像尺寸生成缩小版的模板,保证每一层的模板都和同层的图像分辨率匹配。

整个分层缩放的过程不需要复杂的计算,对原图做均匀的降采样处理就能完成,生成多层缩放图的时间成本非常低,几乎不会占用额外的计算资源。比如之前提到的5120*3840的原始图,缩到第三层的时候,图像尺寸就变成了640*480,整张图的像素数量只剩下原始图的十六分之一,在这张小图上做匹配,计算量就非常小了。

分层匹配的加速流程:先粗定位,再精匹配

有了分层的图像和模板之后,整个匹配的过程就从“全图逐像素扫一遍”的笨方法,变成了从低分辨率层往高分辨率层逐层向上匹配的高效流程。

第一步从分辨率最低、尺寸最小的最底层图像开始匹配。因为这层的图只有几百乘几百的像素,哪怕把缩小后的小模板在这层图上从头到尾滑动,所有需要计算的位置加起来也只有几千个,几毫秒就能跑完整个搜索流程,很快就能算出一个目标的粗位置——比如在这层缩小图里,目标工件大概在(100,200)的坐标附近。

算完粗位置之后,就不需要在高分辨率的大图上,再从左上角一路扫到右下角了。只要回到上一层,也就是分辨率比当前层高一级的图像,在刚才粗位置对应坐标的附近,圈出一个很小的搜索范围,只在这个小范围里做匹配即可。比如低分辨率层算出来的粗位置是(100,200),换算到上一层对应的位置就是(200,400),那就在这个坐标周围10个像素的小范围里搜索,这一层的计算量就比全图搜索小了两个数量级。

按照同样的逻辑,一层一层往上走,最终回到原始的高分辨率图像时,搜索范围已经被前面几层粗定位缩小到了一个很小的区域,只要在这个小范围内做精细的像素匹配,就能算出准确的平移、旋转偏差。整个流程跑下来,原来需要计算的1500万个滑动位置,现在在低分辨率层只算了几千个位置,每往上一层的搜索范围都只覆盖小区域,总计算量直接降了两个数量级,匹配速度自然就得到了大幅提升。

实际落地的效果与细节边界

某PCB视觉锁螺丝工位的实际调试案例里,之前用全分辨率直接做模板匹配,单次匹配时间要320毫秒,整个工位的生产节拍被拉得很长,机器人等视觉结果的时间占了单次循环的三分之一。后来引入三层的图像金字塔结构做加速,在同样的工控机、同样的相机硬件条件下,单次匹配时间直接降到了28毫秒,速度提升了十多倍,而且最终的定位精度和之前全分辨率直接匹配的结果几乎没有差别——因为最终的精细匹配依然是在原始高分辨率图上完成的,前面的低分辨率层只负责把搜索范围缩小,没有损失任何像素层面的测量精度。

这套技术在实际落地的时候,也有几个需要注意的细节边界。首先是分层的层数不是越多越好:如果缩的层数太多,到最低层的图像尺寸太小,工件的边缘轮廓在缩图上已经分辨不出来了,那粗定位算出来的位置就会出现偏差,后面的精匹配也会跟着找错位置。一般工业场景里分3到4层就足够了,具体的层数可以根据工件的最小特征尺寸调整,只要最低层的缩图上,还能清晰看到工件的完整轮廓,这个层数设置就是合适的。

其次是图像金字塔结构不会降低定位精度。很多人会担心用了缩小的图像做匹配,最终的定位结果会不准,实际上粗定位只是用来缩小搜索范围,最终输出的定位偏差,依然是在原始高分辨率图上做精细匹配得到的,像素级的测量精度和原来全分辨率直接匹配的结果是一致的,不会因为加速流程就损失精度。

另外是图像金字塔的提速效果,和原始图像的尺寸直接相关。对于大视野、高分辨率的相机图像来说,这套结构的提速效果非常明显;如果相机本身的视野很小,比如只有640*480的低分辨率小图,整个图的像素总量本来就不多,用不用金字塔的速度差异就不会特别大。

整体来看,图像金字塔是2D定位领域非常经典的加速技术,它的核心思路就是“先在小图上快速找大概位置,再在大图上缩小范围做精细匹配”,不需要升级任何硬件配置,就能把模板匹配的速度提升数倍,这也是现在工业2D定位系统,哪怕在普通配置的工控机上,也能做到几十毫秒内完成匹配的重要原因。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭