利用Python开发图像识别测试框架(二)
作者:强哥   类别:Python开发    日期:2019-07-19 11:43:57    阅读:2515 次   消耗积分:0 分


本次分享《利用Python开发图像识别测试框架》实验教材中模板匹配的核心算法。

回顾前期内容请点击:教材连载:利用Python开发图像识别测试框架(一)


图像识别领取是一个很大的领域,牵涉的应用场景很不一样,对应的算法差异巨大。但是其本质的原理倒也简单,很多时候我们更多的工作都是在做优化,在做容错,在提升识别的可靠性和准确性。但是些内容不在本章内容的探讨范围。


我们针对屏幕截图的图像识别处理,其实利用基于像素的对比就已经足够,因为屏幕截图和模板图片都是矩形的,正规的,没有变形的,静态的,所以处理过程其实是相对比较简单的。


其实针对模板匹配的核心算法,其核心就是滑动+比对两个动作。所以整个算法可以设计如下:

1) 根据测试场景需要对需要操作的元素进行截图,尽量确保每个元素有唯一性。为了元素的操作作用在正确的位置,建议截图时确保模板图片的中心点一定是在当前元素的正确位置。

2) 根据需要对当前屏幕进行截图。

3) 获取到模板图片和屏幕截图的每一个像素点的颜色值,并保存到一个列表中,供后续滑动和遍历对比。

4) 通过双重循环分别进行X轴和Y轴方向的坐标点逐点判断(左上角为坐标原点),当定位到第一个点时,对模板图片的所有像素点进行扫描比对,找到其匹配的点。如果没有匹配上,继续滑动到下一个点,如此循环,直到找到一个匹配的点。

5) 根据该匹配的点的位置再加上模板图片的宽度和一半得到其X坐标,加上其高度的一半得到其Y坐标,将该坐标返回。该坐标对应的位置就是模板图片在大图中的位置的中心点位置。

6) 获取到坐标后,进行相应的鼠标或键盘操作即可。

 

但是这个过程有两个问题,一个影响匹配效率,一个影响匹配数量。


1.关于匹配效率的问题


如果我们对每一个大图的像素点都依次匹配模板图片的每一个像素点,那么效率将极其低下。我们可以简单来分析一下这个过程平均需要运算多少次。假设大图的分辨率大小为1440*900像素(这是目前相对常见的分辨率大小),而小图的分辨率是100*40(一个常规按钮的大小)。那么如果按照完全匹配,共需要循环匹配运算次。怎么得到这个结果的呢?我们看看下面这个示意图:



20190719_113857_981.jpg



上图中从第1次匹配到最后一次匹配之间,进行了按大图的每个像素点进行滑动比对。而整个个过程中,X方向滑动的次数为1440-100=1340次,Y方向滑动的次数为900-40=860次。所以整体需要滑动的次数为1340*860=1152400次。那么每一次的滑动,需要比对小图的像素100*40=4000次,所以整个过程需要比对1152400*4000=4609600000(46亿次数量级),但是由于并不是每个模板图片都是在大图的最右下角,所以整体上来说我们并不能确切知道每一次的匹配究竟需要多少次,只能按照概率来计算,将其除以2算平均值,得到23亿次的运算量。显然这个结果运算的次数太多。如果我们的模板图片更大一些,或者我们全屏大图分辨率更大,那么匹配次数将会更多。


那么应该如何来解决这个匹配性能的问题呢?


最简单的解决方案就是减小模板图片的宽和高,让其像素点变少,或者降低全屏大图的分辨率,让其减少。但是这都是不最主要的解决问题的办法,无法达到数量级的性能提升。其实我们可以将匹配分开两次进行。第一次先将模板图片的小图中最重要的5个点(4个顶点加1个中心点)进行匹配,如果与大图中对应位置的5个点一致,才进行全像素匹配,否则,可以直接滑动支下一个像素点。这样我们可以大幅减少匹配次数。比如整个模板图片的5个顶点与大图中对应位置的点的像素值是一样的可能性有100种,那么我们只需要运算最多4万次即可完成匹配。5个顶点的计算方式非常简单,假设(X,Y)是目前大图的坐标,(W,H)是模板图片的宽度和高度,则:

1) (X,Y)如果对应大图左上角顶点,(0,0)对应模板图片左上角顶点。

2) (X+W-1,Y)对应大图右上角顶点,(W-1,0)对应模板图片右上角顶点。

3) (X,Y+H-1)对应大图左下角顶点,(0,H-1)对应模板图片左下角顶点。

4) (X+W-1,Y+H-1)对应大图右下角顶点,(W-1,H-1)对应模板图片右下角顶点。

5) (X+W/2,Y+H/2)取整对应大图中心点,(W/2,H/2)取整对应模板图片中心点。


2.关于匹配数量的问题


这个问题其实很好理解,如果我们的匹配度设置得过低,那么很有可能可以匹配出多处相同的地方来,那么到底哪一处是我们需要操作的元素呢?所以我们需要调整匹配度,或者重新进行模板截图来保证匹配到的最好是唯一的一个。这样才能精准地定位元素。


下期推送:模板匹配的代码实现


为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。


20190320_095757_834.jpg





   
版权所有,转载本站文章请注明出处:蜗牛笔记, http://www.woniunote.com/article/339
上一篇: 无心敲代码,只想出去玩~
下一篇: 这里有10000元现金大奖等你拿!
提示:登录后添加有效评论可享受积分哦!
最新文章
    最多阅读
      特别推荐
      回到顶部