iOS找图找色脚本开发

脚本找不到元素怎么办,先看相似度是多少

脚本找不到元素,多半是阈值没调对。findImage 的 weakThreshold 默认 0.7 是预筛,threshold 默认 0.9 才是判定,两个摆错了永远匹配不到。

约 6 分钟

脚本找图,很多人第一反应是重做模板。先看那两行阈值,往往能省一半时间。

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 落地。官网提供完整文档、开发工具与自动化产品,免费体验。

访问 iEasyClick 官网 →