GameAISDK的UI识别点击

游戏对不同分辨率手机的适配没有统一的标准或者固定方案,这样会引发一些微妙的问题,我们先拿简单的分辨率缩放举例。

在传统的图像缩放中,对于目标点的偏移都是等比的。比如:从(100×200像素)->(200×400像素)图像中的UI坐标变化过程是这样:

矩形坐上角坐标原点,横向x轴,纵向y轴,后面均沿用此规则

传统图像缩放

对于游戏来说,因为大屏、异形屏的原因较难按照等比的方法来进行适配,而且部分游戏可能有自己独特的分辨率适配规则。实际情况可能如下:

游戏图像适配

这会导致一个什么样的问题?比如你有一段程序或者代码需要ClickUI(40,50)。在100×200原始分辨率下是有效的,但是换了200×400分辨率的手机可能会有适配问题,原本期望的ClickUI(80,100)无效了。实际需要ClickUI(80,120)才有效。

当然这里有一些其他的方式能取到不同分辨率下UI的精确坐标,游戏可以利用引擎,android原生app可以利用底层接口等等,但是这些不是本文讨论的内容。

GameAISDK点击UI的过程

GameAISDK在识别UI点击的过程中做了许多工作来解决上面的问题(并不是100%解决)。其重要思想就是:把匹配区放大,在区域里面遍历查找最匹配的目标。

下面会分析它是如何解决的,我们先从流程入手,梳理整个UI的识别点击过程:

  1. 配置需要点击的UI图片(后称样本图),标注里面需要识别的模版和点击坐标;
  2. 手机取得截屏(后称预测图),缩放至样本图比例;
  3. 通过ORB算法识别样本图和预测图,得分超过阈值认为匹配成功进入下一步,否则回到步骤2;
  4. 根据样本图的模板位置去识别预测图的位置,得分超过阈值认为识别成功进入下一步,否则回到步骤2;
  5. 对样本图的点击坐标进行矩形扩充利用小矩阵扫描的方式找到得分超过阈值的位置,最后进行位置合并,计算出新的点击坐标,识别成功进入下一步,失败回到步骤2;
  6. 点击识别出来的坐标点;
UI识别点击流程参考

整个流程里可以先不用关注样本图是如何配置,以及底层cv::ORBcv::matchTemplate算法的原理与实现细节。因为这些内容比较固定,google也可以比较容易找到答案。更多的关注点放在如何利用这些cv算法解决不同分辨率下的识别点击问题。

模版匹配

注意这里模版匹配不等于cv::matchTemplate

模版匹配的流程在ORB匹配之后,如果说ORB是样本图与预测图整图相似度匹配,那么模版匹配就是图里的具有唯一性特征区域匹配

根据模版匹配的原理,也会存在文章开头的问题,因为适配导致了实际坐标偏移,导致的结果就是在不同分辨率下“找不到”模版了。我们我看下GameAISDK是怎么“找到”的:

  1. 先根据分辨率等比计算出预测图模版坐标偏移;
  2. 将预测图模版扩大,样本图模版已经等比缩放(默认数据是scale从0.8至1.2分10档);
  3. 将缩放后的样本图模版放入扩大后的预测图模版扫描匹配

大致过程可以参考:

模版匹配流程

点击坐标匹配

如果说ORB匹配和模版匹配是为了确定我们需要点击的图,那么点击坐标匹配则是最后的校准,确定最终需要点击的坐标位置

  1. 先根据分辨率等比计算出预测图点击坐标偏移;
  2. 以点击坐标为中心,根据配置在样本图与预测图四周生成矩形模版
  3. 进入模版匹配流程;
  4. 根据模版匹配出来的结果,进行矩形框合并,最终确定点击坐标位置;

大致过程可以参考:

点击坐标匹配流程

一些讨论

Q:为什么有了ORB匹配还需要模板匹配?

A:模板匹配是可选的,其首要目的的为了提高整体匹配的准确率。从实际应用的角度来看,如果同一张有很多UI,在不同状态下可能只有局部有细小差别,这个时候需要模板匹配做唯一区分。

Q:能达到100%的准确率吗?

A:通用配置无法达到,很多情况下需要微调配置。因为确实存在一些误匹配的例子,比如有两个一样的勾选框,距离也很近,默认情况容易造成误匹配。

(全文结束)


转载文章请注明出处:漫漫路 - lanindex.com

Leave a Comment

Your email address will not be published.