Autox.js 中文文档 下载 App

Autox.js 截屏与图像识别 images.requestScreenCapture findImage 入门

当选择器找不到任何东西时——图像识别

上一组讲坐标操作时提到,游戏、自绘 App、部分 WebView 内嵌页面都没有 Android 控件树,选择器 API 完全失效。这时候就要换一条路子——让脚本像人一样"看"屏幕,找到你要的那个图标或按钮。

Autox.js 的图像识别能力基于 OpenCV-mobile 4.13.0(v7.2.3 升级),提供了截屏、模板匹配、颜色查找三大能力。

图像识别的基本流程

截屏 → 在内存中找图/找色 → 拿到匹配坐标 → 点击那个坐标

第一步:请求截屏权限

图像识别的前提是拿到屏幕画面,这需要单独的权限:

// 请求截屏权限(会弹出系统确认对话框)
if (!requestScreenCapture()) {
    toast("截屏权限请求失败");
    exit();
}
toast("截屏权限已获取");

v7.2.3 新增了传统方式:

// v7.2.3+ 新增:不跳出 App 的旧版请求方式
requestScreenCaptureLegacy();

两者区别:新版 requestScreenCapture() 会跳转到系统设置页让你确认,Legacy 是不跳转直接请求(Android 11+ 部分机型可能不支持)。

第二步:截屏

// 截当前屏幕,返回一个图片对象
let img = captureScreen();

// 也可以存到文件
captureScreen("/sdcard/screen_" + Date.now() + ".png");

图片对象 img 是 OpenCV 的 Mat,包含了整个屏幕的像素数据。

第三步:找图

// 在屏幕中查找"确认按钮"的模板图片
let result = images.findImage(img, "confirm_button.png");

if (result) {
    // result = { x: 匹配中心x, y: 匹配中心y, similarity: 相似度 }
    toast("找到了,相似度:" + result.similarity);
    click(result.x, result.y);
} else {
    toast("没找到这个按钮");
}

模板图片 confirm_button.png 需要自己提前准备好——通常是从目标 App 上截下来的按钮图标,裁掉多余部分,只留你要识别的区域。

相似度阈值

// 相似度 0~1,低于阈值的匹配被丢弃
let result = images.findImage(img, "confirm.png", { threshold: 0.8 });

默认阈值 0.9(90% 像素一致)。如果模板图片和实际画面有微小差异(抗锯齿、颜色偏差),可以调低到 0.7~0.8。

第四步:找色(更轻量的替代方案)

如果找图太重(模板图片大、画面变化多),可以用找色——指定一个颜色值,让脚本找屏幕上有没有这个颜色:

// 找指定颜色的像素点(十六进制)
let point = images.findColor(img, "#FF0000");  // 红色
if (point) {
    click(point.x, point.y);
}

// 或者用 RGB
let point = images.findColor(img, colors.rgb(255, 0, 0));

找色比找图快得多,适合定位固定颜色的 UI 元素(比如 App 顶部的 Logo 色、按钮背景色)。

颜色相似度

let point = images.findColor(img, "#FF0000", { tolerance: 30 });

tolerance 是颜色容差(0~255)。屏幕上的颜色可能因为压缩、渐变等和原值有微小差异,适当放宽容差能匹配到更多点,但也可能匹配到错误的点。

实战:确认按钮点击脚本

// ========= 准备 =========
console.show();

if (!requestScreenCapture()) {
    console.error("截屏权限失败");
    exit();
}

console.log("截屏权限已获取");

// ========= 主循环 =========
// 每隔 1 秒检查一次屏幕上有没有"确认"按钮的图标
let confirmTemplate = "/sdcard/脚本/images/confirm_button.png";

setInterval(() => {
    let img = captureScreen();
    
    // 找图
    let match = images.findImage(img, confirmTemplate, { threshold: 0.8 });
    if (match) {
        console.log("找到确认按钮 @ (" + match.x + "," + match.y + ")");
        click(match.x, match.y);
        toast("已点击确认");
    }
    
    // 释放图片内存
    img.recycle();
}, 1000);

内存管理

图像识别的操作对象(captureScreen() 返回的图片对象)非常占内存。用完一定要调用 .recycle() 释放:

let img = captureScreen();
// ... 使用 img ...
img.recycle();  // 释放 OpenCV Mat 的 native 内存

忘了 recycle 会导致内存泄漏,脚本跑久了手机会越来越卡。

总结

API用途速度精度
requestScreenCapture()获取截屏权限--
captureScreen()截屏返回图片对象较快-
images.findImage(img, template)在屏幕中找模板图中等中~高
images.findColor(img, color)找屏幕上的指定颜色很快低~中
click(x, y)点击匹配到的坐标快-