脚本找图,很多人第一反应是重做模板。先看那两行阈值,往往能省一半时间。
findImage 的参数表里有两个阈值连着写。文档说 weakThreshold 用于在每一轮模板匹配中检验是否继续匹配,如果相似度小于该值就不再继续。这句话我读了两遍才明白它跟后面那个 threshold 不是一回事。
一个默认 0.7,每轮匹配先过它,低于就跳过;另一个默认 0.9,是最终判定,过了才算命中。一个管速度,一个管要不要。
第一次读的时候我以为这两个是一个东西的两种叫法,随手改了一个。
摆错了会很难查。弱阈值如果比阈值大,预筛阶段就把它筛掉,根本轮不到最终判定,等于永远匹配不到。参数表里 0.7 和 0.9 挨着写,不留意很容易只动一个。
脚本找不到元素的时候,多数人第一反应是模板做错了。其实模板没动,是门槛没调。
相似度是多少,这个数最值得先看
找不到的时候,别急着换模板。先把 similarity 打出来。
function findAndClick(tpl, retry = 3) {
let levels = [0.9, 0.85, 0.8];
for (let i = 0; i < retry; i++) {
let img = image.captureFullScreen();
if (img == null) {
sleep(500);
continue;
}
let th = levels[i] || 0.8;
let pts = image.findImage(img, tpl, 0, 0, 0, 0, 0.7, th, 1, 5);
image.recycle(img);
if (pts && pts.length > 0) {
let p = pts[0];
logd("第 " + (i + 1) + " 轮命中,阈值 " + th
+ " 相似度 " + p.similarity);
clickPoint(
parseInt((p.left + p.right) / 2),
parseInt((p.top + p.bottom) / 2)
);
return true;
}
sleep(600);
}
return false;
}
三轮只用阈值在变,90%、85%、80%。中间隔 600 毫秒。很多「找不到」其实是界面还在动画,等一下就出来了,跟阈值没关系。
similarity 这个字段能告诉你命中的那轮有多接近。连着几轮都是 81%、82% 这种擦边值,说明模板该重做了。这个数一直上不去,调阈值只是把不合格的结果放进来。
相似度阈值调到多少合适,没有统一答案。我一般先拿 0.9 跑一遍,不行降到 0.85,再不行就重做模板,很少往 0.8 以下走。界面稳定、图标规整的场景,九成能用。有渐变、有阴影,或者系统版本升级过、界面渲染变了,八成五更实际。往八成以下走就要小心。那时找图找不到的情况会变少,点错地方的情况会变多。
找图和 OCR 的返回字段不是一套
findImage 返回区域对象,字段是 left、right、top、bottom,中心点是左右取中、上下取中。ocrImage 返回 x、y、width、height,中心点是 x 加半个宽、y 加半个高。
两套结构算中心的方式完全不同。把 p.x 写进找图的结果里,拿到的是 undefined,clickPoint(undefined, ...) 要么报错要么点在原点。两个模块的文档分在两个文件,来回翻也不一定能对上。
找不到的时候,先看这几条
| 现象 | 原因 | 处理 |
|---|---|---|
| 一直 null,相似度都不到八成 | 模板和实际截图差太多 | 用当前分辨率重新截模板,别用设计稿 |
| 偶尔成功偶尔失败 | 界面还在渲染 | 每轮之间加等待,别连着重试 |
| 报错说没初始化 | 漏了 image.initOpenCV() |
脚本开头调一次,第一次稍慢 |
| 点到了错误的位置 | 页面有多个相同图标,全屏查找取了第一个 | 限定查找区域 |
| 相似度到九成五还是没点中 | 用了 OCR 的字段去算找图结果 | 检查字段名,左右上下取中 |
排查就按这个顺序走,别一上来就改模板。先看日志里的相似度值。有值,说明识别到了,问题在点击逻辑。没值,说明真的没匹配上,往阈值和模板方向查。
限定区域这一项值得单独说。页面上方有返回箭头,下方也有一个一样的。全屏找永远返回第一个。把区域参数从 0,0,0,0 改成 0, 800, 1170, 2532,只在屏幕下半部分找,问题就没了。这个改动比把阈值从九成降到八成有效得多。
用按键精灵的也常遇到「找图找不到」,起因基本一样。模板截的时候和跑的时候分辨率不同,或者界面换了皮肤。那边叫找图找色,iOS 这边叫图色识别脚本,同一个东西。判定的还是相似度这一个数。
常见问题
返回 null 是不是模板做错了?
先降阈值再看模板。九成降到八成往往就有了。还要确认调过 initOpenCV。
两个阈值到底怎么设?
弱阈值 0.7、阈值 0.9 是默认值,先用着。要放宽就动 threshold,别把 weakThreshold 调到比它还大。
透明找图也要初始化吗?
不用。findImageByColor 这类不依赖 OpenCV,findImage 必须初始化。
区域参数怎么写?
0,0,0,0 是全屏。写具体范围能提速,也能避免同款图标误命中。
iEasyClick 是手机自动化 AI 智能体平台,覆盖安卓免 root、iOS 免越狱(代理/蓝牙 HID/OTG HID)、鸿蒙 Next 三大生态,提供脚本开发、苹果群控、本地中控投屏与云控系统。→ 了解全部产品
想要真实跑起来?
本文介绍的方案均可基于 EasyClick 能力在 iEasyClick 落地。官网提供完整文档、开发工具与自动化产品,免费体验。