回答
文档地址 https://docs.hamibot.com/
在 Hamibot 中使用透明底图片作为模板进行匹配时,需要确保透明区域被正确处理。目前 images.matchTemplate 和 images.findImage 函数不直接支持带透明通道(Alpha Channel)的 PNG 图片的“透明部分忽略”功能,即透明区域仍会被当作像素参与比对,这可能导致匹配失败。
如果你手动抠图得到的是带有透明背景的 PNG 图像,并希望仅对非透明部分进行匹配,可以采取以下方法:
方法一:预处理模板图像,填充透明区域为不影响匹配的颜色
将透明区域填充为与目标场景中该位置颜色差异较大的颜色(例如纯黑或纯白),以避免干扰。
// 读取原始带透明通道的图片
var template = images.read("/sdcard/template.png");
// 创建一个新的 RGB 图像(无 alpha 通道),并用指定颜色填充背景(如白色)
var bg = images.createImage(template.getWidth(), template.getHeight(), Bitmap.Config.ARGB_8888);
bg = images.cvtColor(bg, Bitmap.Config.RGB_565); // 可选:转为更紧凑格式
// 使用特定颜色绘制背景(比如白色)
var canvas = new Canvas(bg.getBitmap());
var paint = new Paint();
paint.setColor(android.graphics.Color.WHITE);
canvas.drawPaint(paint);
// 将原图绘制到新图上(自动合并 alpha)
canvas.drawBitmap(template.getBitmap(), 0, 0, null);
// 释放原图资源
template.recycle();
// 现在 bg 是一个没有透明通道、背景已填充的图像,可用于模板匹配
var result = images.findImage(captureScreen(), bg, {
threshold: 0.9
});
if (result) {
toast("找到匹配位置: " + result);
} else {
toast("未找到匹配");
}
// 记得回收图像资源
bg.recycle();
说明:此方法通过创建一个不含 Alpha 通道的新图像,并将原图绘制上去,从而实现“忽略透明区域”的效果。实际匹配时只比较可见内容。
方法二:裁剪有效区域
如果模板中的有效图案周围有大量透明边框,建议先裁剪出最小有效区域再用于匹配。
var template = images.read("/sdcard/template.png");
// 自动裁剪掉四周透明像素
var cropped = images.autoCrop(template, 0); // 0 表示完全透明的阈值
var result = images.findImage(captureScreen(), cropped);
cropped.recycle();
template.recycle();
images.autoCrop(img, threshold)能够去除边缘透明区域,提升匹配准确率。
推荐做法
- 手动抠图后保存为 PNG。
- 使用脚本加载并调用
images.autoCrop()去除多余透明边框。 - 若仍有问题,使用画布将其绘制到固定背景上(如白底/黑底),确保不会因透明混合导致颜色失真。
- 调整
threshold参数(建议从0.85~0.95开始测试)以适应实际情况。
注意:设备分辨率、屏幕缩放、UI 动态变化也会影响匹配结果,请尽量保证模板和运行环境的一致性。
如需更高阶的图像匹配能力(如掩码支持),可发送邮件至 support@hamibot.cn 提交需求反馈。
ℹ️ 本回答由 AI 生成,内容仅供参考