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) | 点击匹配到的坐标 | 快 | - |