Android无障碍自动化结合opencv实现支付宝能量自动收集

news/2024/9/24 1:23:21

Android无障碍服务可以操作元素,手势模拟,实现基本的控制。opencv可以进行图像识别。两者结合在一起即可实现支付宝能量自动收集。opencv用于识别能量,无障碍服务用于模拟手势,即点击能量。

当然这两者结合不单单只能实现这些,还能做很多自动化的程序,如芭芭农场自动施肥、蚂蚁庄园等等的自动化,甚至游戏的自动化也没问题。

下面简单介绍下核心的实现逻辑
核心步骤

  1. 准确识别多个能量球位置
  2. 准确点击能量球位置

opencv识别能量球

OpenCV是一个可用于开发实时的图像处理、计算机视觉以及模式识别可商用的开源库-opencv介绍

思路

使用opencv怎么识别能量球呢?
使用opencv的模板匹配。即,将能量球单独裁剪出来作为模板,再将其与屏幕图像进行匹配,筛选匹配分值最高的结果即获取能量球在屏幕中的位置。

实现

1. 项目集成opencv-android版
dependencies {implementation 'org.opencv:opencv:4.9.0'
}

最新版本可查看官方集成教程

2. 截取能量球图像作为模板
3. 截取屏幕图像
4. 使用opencv模板匹配获取所有能量球位置

opencv模板匹配api

Imgproc.matchTemplate(image, templ, result, method, mask)

参数解释:
image屏幕图像,即步骤3中截取的屏幕图像
templ模板图像,即步骤2中截图的能量球图像
result匹配结果容器,用于存储匹配的结果
mask掩膜,用于指定模板中哪些位置需要匹配,哪些不需要匹配

其中参数mask掩膜是匹配准确度的关键点

掩膜图像是根据模板生成的一张黑白图像,其中黑色为不需要匹配的区域

模板图像与生成的掩膜图像对比

模板图像 掩模图像

其中文字也是我们不需要匹配的,因为里面的文字会变化,所以中间加了一块黑色矩形用于指定匹配忽略区域

对于掩膜的创建方法这里不介绍了,所有代码都已经开放在我的自动化开源库Assists里,想直接看代码这里:https://github.com/ven-coder/Assists

参数准备好就可以进行匹配了,下面是完整代码(kotlin代码)

    /*** 模板匹配能量球*/fun match() {try {val path = System.getProperty("user.dir") + "\\lib\\x64\\opencv_java490.dll"System.load(path)val temp = System.getProperty("user.dir") + "\\images\\temp.jpg"val image = System.getProperty("user.dir") + "\\images\\image.png"//模板图像val img = Imgcodecs.imread(image)//屏幕图像val templ = Imgcodecs.imread(temp)//掩膜图像val mask = createMask(templ)// 创建结果矩阵val resultCols: Int = img.cols() - templ.cols() + 1val resultRows: Int = img.rows() - templ.rows() + 1val result = Mat(resultRows, resultCols, CvType.CV_32FC1)// 进行模板匹配Imgproc.matchTemplate(img, templ, result, Imgproc.TM_CCORR_NORMED, mask)// 遍历结果矩阵,找到所有匹配超过阈值的位置val threshold = 0.98 // 阈值,根据实际情况调整var count = 0var countValue = 0for (y in 0 until result.rows()) {for (x in 0 until result.cols()) {countValue++val matchValue = result[y, x]if (matchValue[0] >= threshold) {count++// 找到一个匹配位置val matchLoc = Point(x.toDouble(), y.toDouble())// 绘制矩形框Imgproc.rectangle(img, matchLoc, Point(matchLoc.x + templ.cols(), matchLoc.y + templ.rows()), Scalar( 85.0, 85.0,205.0,), 2, Imgproc.LINE_AA, 0)}}}// 显示结果Imgproc.resize(img, img, Size(img.cols() / 2.0, img.rows() / 2.0)) // 可选:调整显示大小HighGui.imshow("Matched Result: $count", img)HighGui.waitKey(0)} catch (e: Throwable) {e.printStackTrace()}}/*** 创建掩膜*/fun createMask(source: Mat): Mat {// 转换为 HSV 颜色空间val hsvImage = Mat()Imgproc.cvtColor(source, hsvImage, Imgproc.COLOR_BGR2HSV)// 定义绿色的颜色范围val lowerGreen = Scalar(35.0, 100.0, 100.0)val upperGreen = Scalar(85.0, 255.0, 255.0)// 创建掩膜val mask = Mat()Core.inRange(hsvImage, lowerGreen, upperGreen, mask)// 忽略“27g”文字// 你可以使用形态学操作去掉文字部分,或者手动确定文字的位置并将其设置为黑色(0)。// 假设文字位于圆形中心,可以手动遮盖这个区域// Rect(中心位置x, 中心位置y, 宽度, 高度)val width = 80val height = 60val textRect = Rect(source.width() / 2 - width / 2, source.height() / 2 - height / 2, width, height) // 假设的“27g”文字位置和大小Imgproc.rectangle(mask, textRect, Scalar(0.0), -1)Imgproc.rectangle(mask, Rect((source.width() / 2 - width / 2) + 10, (source.height() / 2 - height / 2) + height, 40, 25), Scalar(255.0), -1)return mask}

匹配结果

点击能量球

准确得到能量球位置之后就好办了,使用我的开源库Assists开启无障碍服务后调用gestureClick(x: Float, y: Float)点击能量球位置即可

//it.x + temp3.width() / 2,坐标加上模板大小的一半即点击中间位置
Assists.gestureClick((it.x + temp3.width() / 2).toFloat(), (it.y + temp3.height() / 2).toFloat())

最终效果

以上所有代码都在我的开源库Assists示例里了,需要的自取即可。
觉得有帮助顺便可以start一下,满足以下一下老夫虚荣心憋

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/46663.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

域渗透之ATTCK实战系列——红队实战(一)

这个靶场是红日安全团队推出的红队实战系列第一个靶场,其中包括了漏洞利用、内网搜集、横向移动、构建通道、持久控制等多个环节。目录前言环境搭建外围打点信息收集phpmyadmin全局日志getshell内网信息收集msf上线mimikatz抓取明文密码&hash域信息收集横向移动msf+proxyc…

1. hello rvos

用qemu模拟器模拟一块仿真的板子,然后通过模拟的串口线,在主机上打印hello在qemu中,关于uart寄存器的内存映射如图(物理地址)1. 源代码剖析 1. platform.h 用来定义开发板上的一些东西 #ifndef __PLATFORM_H__ #define __PLATFORM_H__ //这些宏用于防止重复包含头文件。#i…

基于鲸鱼优化的knn分类特征选择算法matlab仿真

1.程序功能描述基于鲸鱼优化的KNN分类特征选择算法。使用鲸鱼优化算法,选择最佳的特征,进行KNN分类,从而提高KNN分类的精度。2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序%---开始迭代--------------------------------------------------- while t &…

UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359) 题解

点我看题 A - Count Takahashi 没啥好说的点击查看代码 #include <bits/stdc++.h>#define rep(i,n) for(int i=0;i<n;++i) #define repn(i,n) for(int i=1;i<=n;++i) #define LL long long #define fi first #define se second #define pb push_back #define mpr m…

20240622-PowerShell5和PowerShell7在windows terminal中无法切换

今天安装powertoys小工具commandNotFound的时候,提示要求powershell版本是7,而当前powershell版本是5,如下。但是powertoys中显示powershell7已经安装,如下图。主要问题在于powershell5的程序名是 powershell.exe, 而powershell7的程序名是pwsh.exe. windows terminal每个选…

go - Monitoring

保证高可用的方法1. 日志2. 链路追踪3. 监控   1. 业务监控(领导层) OPS/DAU/访问状态 http code/业务接口(登陆注册聊天上传留言搜索)   2. system monitoring   (运维) operating system: cpu/memory/disk usage/disk space/TCP(上w的连接),流量 组件:mysql,redi…

萌熊6月j讲题

A 解法一(官方解法): 要求每段的二进制或都相同,那么如果整个序列中存在某个数的第 \(i\) 位为 \(1\),那么整个序列的每一段长 度为 \(k\) 的连续子序列中都至少有一个数的第 \(i\) 位为 \(1\)。 我们可以对每一位单独求一个满足条件的最小的 \(k\),然后所有位的 \(k\) 的…

黑马:AI+若依

AI+若依 https://www.bilibili.com/video/BV1pf421B71v/?spm_id_from=333.337.search-card.all.click&vd_source=b1acc63fa6d7d73e53111f9e1153f990若依扫盲通义灵码(AI)CRM客户关系管理系统(后台管理系统) 选型与搭建:技术选型,环境搭建,框架整合(AI凉凉) 设计:…