牙叔教程 简单易懂

声明

本教程是教查找透明图的, 找透明图逻辑都是类似的, 不针对任何app.

效果

目标: 找图片中的双人头

本次测试一共使用了三种分辨率的图片

  • 1600x720
  • 2310x1080
  • 2400x1080

每种分辨率各5张,

上图中左上角的头像, 可以看出是一个黑白图片, 是把一张2400x1080的大图, 灰度化, 二值化, 然后裁剪双人区域得到的, 所有分辨率图片找图, 都是用的同一张双人头小图.

有必要继续看下去吗

  • 多分辨率找图你有思路吗
  • 你会找透明图吗
  • 你在多种分辨率下, 找透明图, 会不会?
  • 你想不想看几十篇教程来学习sift
  • 你会把java版本的sift改成autojs的吗
  • 你想花掉两个星期的时间来研究一个东西吗

如果你对以上对你来说, 没有任何问题, 那就没必要看下去, 划走吧.

环境

手机: Mi 11 Pro
Android版本: 11
Autojs版本: 9.0.10

备注

autojs8自带的opencv版本是3, 不包含sift,
autojs9自带的opencv版本是4, 包含sift,

多分辨率找透明图思路

多分辨率找图用sift,
透明图先二值化, 然后再找图

二值化图片

我们需要选择一个合适的阈值来二值化, 因此需要可视化的调整阈值,
本教程挑选的阈值是246,
在这个阈值下, 二值化后的图片上, 只剩下双人头和右下角的星星,
可以最大限度的帮助我们排除图片中的噪音,

下面是阈值为246的时候, 对应的二值图

二值化代码

本代码非常优秀, 即使在ui界面16ms刷新的频率下, 也没有内存泄漏发生,
值得新手仔细研究

"ui";
engines.all().map((ScriptEngine) => {if (engines.myEngine().toString() !== ScriptEngine.toString()) {ScriptEngine.forceStop();}
});
importClass(org.opencv.imgproc.Imgproc);
importClass(org.opencv.core.Mat);
ui.layout(<vertical><img id="原图"></img><horizontal><text>阈值: </text><text id="threshold">0</text><seekbar id="seekbar" margin="9" w="*"></seekbar></horizontal><img id="二值化"></img></vertical>
);
let imgPath = "./截图1.png";
imgPath = files.path(imgPath);
let img = images.read(imgPath);
let bitmap = img.getBitmap();
log(bitmap);
ui.原图.setImageBitmap(bitmap);ui.seekbar.setMax(255);let thresholdBitmap;
ui.seekbar.setOnSeekBarChangeListener({onProgressChanged: function (seekBar, progress, fromUser) {if (fromUser) {let lastBitmap = thresholdBitmap;ui.threshold.setText(String(progress));let threshold = parseInt(progress);log("二值化之前 img = " + img);let thresholdImg = 二值化(img, threshold);thresholdBitmap = thresholdImg.getBitmap();ui.二值化.setImageBitmap(thresholdBitmap);ui.post(function () {thresholdImg.recycle();});if (lastBitmap) {log("lastBitmap = ");log(lastBitmap);lastBitmap.recycle();}}},
});events.on("exit", function () {bitmap.recycle();img.recycle();thresholdBitmap.recycle();
});/* ---------------------------自定义函数----------------------------------------------- */function 二值化(img, threshold) {log("threshold = " + threshold);let trainImage = img.mat;let trainImage_gray = new Mat();Imgproc.cvtColor(trainImage, trainImage_gray, Imgproc.COLOR_BGR2GRAY);let binary = new Mat();// Imgproc.threshold(trainImage_gray, binary, threshold, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);Imgproc.threshold(trainImage_gray, binary, threshold, 255, Imgproc.THRESH_BINARY);trainImage_gray.release();var newImg = com.stardust.autojs.core.image.ImageWrapper.ofMat(binary);return newImg;
}

裁剪图片

电脑上的话, 我用的是ps裁剪图片,
手机上的话, 可以使用有裁剪功能的app,
如果你找不到合适的app, 可以公众号回复 照片编辑器
该app有裁剪功能,
下面是我们从二值图中, 裁剪出的双人头

保存图片到sd卡

opencv中的图片格式都是Mat, 把Mat保存到sd卡, 代码如下

function viewMat(mat) {let mat2 = mat.clone();Imgproc.cvtColor(mat, mat2, Imgproc.COLOR_BGRA2RGBA);let tempFilePath = files.join(files.getSdcardPath(), "脚本", "mat.png");Imgcodecs.imwrite(tempFilePath, mat2);mat2.release();app.viewFile(tempFilePath);
}

中间有一行转换颜色的代码, 是因为mat默认使用bgr, 而不是rgb,
不转换颜色的话, 图片颜色看着就不正常.

读到这里你应该有这些东西了

  • 原图
  • 二值化的原图
  • 裁剪出来的双人头小图

接下来就该sift上场了

sift找图效果

图片中连接双人头的彩色线两端的点, 就是sift在两种图片中找到的相似度最高的特征点,
在右下角的星星上, 也有一个特征点, 因此有一条紫色的线连过去了,
图片中的蓝色矩形是用来包裹相似特征点的,

再看看别的图

这张图效果就很好, 没有受到右下角星星的影响, 再看看别的图片

从图片中可以看到, 右下角的星星影响了我们的找图, 因此我们找图的时候,
可以先裁剪掉右侧对我们找图无用的图片, 比如把图片右侧三分之一的都裁减掉,
这样就避免了右下角星星对找图的影响.
所有没用的地方都可以预先裁减掉, 然后再去找图

因此, 我的自定义方法就有一个区域参数,
只保留我们有用的部分, 图片中的其他部分, 全部裁掉

/*** @description:* @param {img} bigImg* @param {img} smallImg* @param {Array} rect [left, top, right, bottom]* @return {Array} [left, top, right, bottom]*/
function findImageSift(bigImg, smallImg, rect) {...}

总结

以上就是查找透明图的基本步骤,
这种方法理论是可行的, 实际效果, 我们要测试后才知道,

该方法是否符合任何场景呢?
当然是不可能的, 我们会遇到不同的场景, 需要对每个场景采取合适的方法,
找图这种, 我不认为有通用的方法, 尤其是手机分辨率那么多种,
但本方案是目前此场景中最合适的方案,

学会这个, 你的找图功力又前进一大步,
你的找图功力, 即将大圆满呢, 给自己点个赞吧 !

名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问
— 牙叔教程

声明

部分内容来自网络
本教程仅用于学习, 禁止用于其他用途

bilibili

牙叔教程

微信公众号 牙叔教程

QQ群

747748653

完整源码 立即查看

autojs多分辨率找透明图相关推荐

  1. AUTOJS新手各种脚本演示-陆续更新

    AUTOJS新手各种脚本演示-陆续更新 Auto.js Pro是什么 Auto.js Pro能做什么 AUTOJS新手各功能实现代码 通过取父元素搜索子元素 点击获取到的元素 字符串查找 AUTOJS ...

  2. 史上最全的autojs代码仓库

    autojsDemo 史上最全的autojs代码仓库 https://github.com/snailuncle/autojsDemo 魔力sama的@auto.pro 开箱即用的 auto.pro ...

  3. Autojs7实戦---薅羊毛时间版APK

    薅羊毛时间版APK下载地址:薅羊毛时间版_v0.0.40.apk - 蓝奏云 薅羊毛时间版源代码下载地址:薅羊毛时间版源码.rar - 蓝奏云 薅羊毛时间表顾名思义就是支持时间账号,可以进行时间付费, ...

  4. png变成矢量图_[PPT]如何将图片背景变成透明

    说好今天要介绍一下PNG图,PNG是什么? 是Portable Network Graphics的缩写,中文意思是可携式网络图像.具体PNG的各种解释小伙伴们可以自己去找度娘. 为什么要介绍PNG格式 ...

  5. 基于Airtest抖音养号源代码

    以前就做过Python做了点Ai和Sprider有点基础就学了学Airtest这个插件,没大规模应该自己玩一玩电音还可以,不用像AutoJs那样找不到了,我这个代码也算是我记录一下也算是给大家抛砖引玉 ...

  6. autojs查找透明图

    牙叔教程 简单易懂 使用场景 查找图片中的透明按钮的位置 效果展示 透明按钮是齿轮按钮和双人按钮, 黄色矩形是找出来的位置 autojs版本 8.8.20-0 原理 观察图片, 可以明显的看到, 按钮 ...

  7. autojs教程:完善找图函数,图片内随机点击

    两个找图封装的 函数 autojs找图两种方法. 为什么又分享,因为很多人问我,找图找到了,但是点击为什么没反应?? !!! 找到图片了,但是点击的点是否在可点击有反应的区域内呢? 现在下面代码完美解 ...

  8. autojs教程:找图函数

    两个找图封装的 函数 autojs找图两种方法 ps:找图之前,最主要的必需的请求截图代码: //请求截图,用找图方法,第一个就要先写的请求截图代码,不然找图没法用if (!requestScreen ...

  9. AUTOJS利用百度OCR识别找字点击 详细代码

    //此段代码要先在百度智能云上注册并开通百度OCR文字识别,开通方法请自行百度 //https://login.bce.baidu.com/?account=&redirect=http%3A ...

  10. autojs找字_AutoJS介绍

    主流的脚本工具,有按键精灵,TC,易语言等,但是都有一定的局限. 易语言的功能很强大,但是在移动端却没有对应的工具,虽然可以借助安卓模拟器,或者TotalControl工具,在PC机上运行安卓系统,但 ...

最新文章

  1. python系统-Python(第八课,简单开发系统)
  2. Jupyter notebook 编写scala与spark
  3. 一、从零创建VUE项目
  4. Springboot配置不当
  5. Vue 项目上线优化
  6. MySQL中的substr()函数
  7. Linux DMA Engine framework(3)_dma controller驱动
  8. ftp挂载分区上去后无法识别的问题
  9. JVM中也有并发GC,CMS机制
  10. 乐高mindstormsev3_乐高MINDSTORMSEV3软件程序模块开发
  11. 十、软考·系统架构师——软件测试及维护
  12. 太突然!著名音乐人陈道明去世,死因曝光,刺痛全网……
  13. C++批量修改文件后缀名(提供多种方法)
  14. 商业地产数字化转型分析
  15. 看个小程序,测测你细心不细心
  16. Python opencv:人眼/人脸识别并实时打码处理
  17. [研究方向]什么是深度学习?它到底有多火?
  18. 爬取去哪儿网旅游数据并且保存为csv文件
  19. 华为机试题练习-保险箱
  20. 服务器系统安装提示插入软盘,云服务器提示没有软盘

热门文章

  1. Unity3D 笔试题
  2. java随机抽取数字_java 获取随机数字的三种方法
  3. OpenGL超级宝典(第7版)之第八章基元处理
  4. STM32F091 can通信配置,can波特率计算方法
  5. C语言快速找答案,C语言单选题找答案
  6. java 常用汉字_中国常用汉字有多少
  7. java虚拟机执行过程
  8. 老罗Android开发视频教程 15集
  9. 高质量图片缩略图生成(编程笔记)
  10. 论文翻译 SLAM综述