autojs之识别象棋位置

简介: 声明本文仅供学习

声明


本文仅供学习


使用情景


识别象棋位置


效果展示

微信图片_20220624130601.jpg

微信图片_20220624130601.jpg


原理


  1. openev霍夫找圆
  2. canvas画圆
  3. 悬浮窗显示图片


知识点


  1. 隐藏虚拟按钮
  2. 全屏显示图片
  3. HoughCircles的各个参数的意思
  4. 图片的回收


代码讲解


  1. ui 显示象棋图片
ui.layout(
  <vertical w="{{device.width}}px" h="{{device.height}}px">
    <img src="file://./中国象棋.jpg"></img>
  </vertical>
);


  1. 请求截图
if (!requestScreenCapture()) {
  toast("请求截图失败");
  exit();
}


  1. 截图并保存
let screen = images.read(imgFilepath);
images.save(screen, imgFilepath);


  1. 霍夫找圆
let data = 霍夫找圆(screen);


  1. canvas画圆
let newImgFilepath = showData(data, imgFilepath);


  1. 悬浮窗全屏显示图片
悬浮窗全屏显示图片(newImgFilepath);


完整源码


  1. main.js
"ui";
importClass(android.view.WindowManager);
importClass(android.view.View);
let showData = require("./showData");
hideBottomUI();
ui.layout(
  <vertical w="{{device.width}}px" h="{{device.height}}px">
    <img src="file://./中国象棋.jpg"></img>
  </vertical>
);
threads.start(function () {
  //请求截图
  if (!requestScreenCapture()) {
    toast("请求截图失败");
    exit();
  }
  let imgFilepath = files.path("./中国象棋.jpg");
  log(imgFilepath);
  log(files.exists(imgFilepath));
  let screen = images.read(imgFilepath);
  images.save(screen, imgFilepath);
  let data = 霍夫找圆(screen);
  let newImgFilepath = showData(data, imgFilepath);
  悬浮窗全屏显示图片(newImgFilepath);
});
setInterval(function () {}, 1000);
// ==================自定义函数===================================
function 霍夫找圆(screen) {
  // 对图像进行中值滤波,返回处理后的图像。
  let grayImgInfo = images.grayscale(images.medianBlur(screen, 3));
  // void HoughCircles( InputArray image, OutputArray circles,
  //          int method, double dp, double minDist,
  //          double param1=100, double param2=100,
  //          int minRadius=0, int maxRadius=0 );
  //dp,用来检测圆心的累加器图像的分辨率与输入图像之比的倒数,例如如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便只有输入图像一半的分辨率
  //minDist 检测到的圆的圆心之间的最小距离,即让我们的算法能明显区分的两个不同圆之间的最小距离。如果这个参数设置过大,某些圆就不能被检测出来。
  // param1:此参数是对应Canny边缘检测的最大阈值,最小阈值是此参数的一半 也就是说像素的值大于param1是会检测为边缘
  // param2:它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了
  // minRadius:表示能够检测的最小圆的半径 这里我们设置为0是因为他也要检测圆心 而圆心可以看作是半径为0的圆
  // maxRadius:表示能够检测的最大圆的半径,这里我设置为100,那么表示圆半径大于100的圆不会被检测出来(这个是依据你要检测的图片而考虑)
  let findBalls = images.findCircles(grayImgInfo, {
    dp: 1,
    minDst: 80,
    param1: 100,
    param2: 45,
    minRadius: 50,
    maxRadius: 80,
  });
  // log("找到的圆:" + JSON.stringify(findBalls));
  let haveBalls = findBalls && findBalls.length > 0;
  grayImgInfo.recycle();
  screen.recycle();
  if (haveBalls) {
    log("有圆" + findBalls.length + "个");
    return findBalls;
  } else {
    return false;
  }
}
function 悬浮窗全屏显示图片(imgFilepath) {
  log("全屏显示图片");
  let screen = images.read(imgFilepath);
  var w = floaty.rawWindow(
    <frame gravity="center" bg="#44ffcc00">
      <img id="img"></img>
    </frame>
  );
  ui.run(function () {
    w.img.attr("src", "file://" + imgFilepath);
  });
  w.setSize(-1, -1);
  w.setTouchable(false);
  setTimeout(function () {
    screen.recycle();
  }, 1000);
}
function hideBottomUI() {
  // 隐藏虚拟键
  let uiFlags =
    View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
    View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
    View.SYSTEM_UI_FLAG_FULLSCREEN;
  uiFlags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
  activity.getWindow().getDecorView().setSystemUiVisibility(uiFlags);
  //解决虚拟按键弹出,无法再次隐藏的问题
  activity
    .getWindow()
    .getDecorView()
    .setOnSystemUiVisibilityChangeListener(function (i) {
      hideBottomUI();
    });
}


  1. showData.js
function showData(dataList, imgPath) {
  ocrType = "牙叔圆形识别测试";
  log("显示数据 imgPath = " + imgPath);
  var img = images.read(imgPath);
  var canvas = new Canvas(img);
  let circlePaint = new Paint();
  circlePaint.setStrokeWidth(3);
  circlePaint.setColor(colors.parseColor("#00ff00"));
  circlePaint.setStyle(Paint.Style.STROKE); //空心矩形框
  let textPaint = new Paint();
  textPaint.setTextAlign(Paint.Align.CENTER);
  textPaint.setTextSize(30);
  textPaint.setStyle(Paint.Style.FILL);
  textPaint.setColor(colors.parseColor("#f000ff"));
  var len = dataList.length;
  for (var i = 0; i < len; i++) {
    let data = dataList[i];
    // { x: 464.5, y: 566.5, radius: 15.399999618530273 },
    canvas.drawCircle(data.x, data.y, data.radius, circlePaint);
    canvas.drawText(i + "", data.x, data.y, textPaint);
  }
  var image = canvas.toImage();
  let newFilename = files.getNameWithoutExtension(imgPath) + "_" + ocrType + ".png";
  let newFilepath = "/sdcard/脚本/" + ocrType + "/" + newFilename;
  files.createWithDirs(newFilepath);
  images.save(image, newFilepath);
  log("识别后的图片保存路径: " + newFilepath);
  img.recycle();
  image.recycle();
  return newFilepath;
}
events.on("exit", function () {
  log("结束运行 模块脚本");
});
module.exports = showData;


3.素材 中国象棋.jpg








相关文章
|
移动开发 小程序 JavaScript
uni-app 跨端开发注意事项
uni-app 跨端开发注意事项
671 0
|
9月前
|
机器学习/深度学习 运维 数据可视化
《生成对抗网络:网络安全态势感知可视化的新引擎》
在数字化时代,网络安全至关重要。网络安全态势感知可视化通过直观展示网络状况,帮助快速发现威胁。生成对抗网络(GANs)作为前沿AI技术,正为这一领域带来变革。GANs由生成器和判别器组成,通过对抗训练生成逼真数据,用于数据增强、异常检测、威胁情报合成及动态场景模拟。尽管面临数据隐私、模型稳定性和可解释性等挑战,GANs的应用前景广阔,有望大幅提升网络安全水平。
423 22
|
Ubuntu Linux
Ubuntu重启后进入initramfs导致无法开机解决方案
今天,我的电脑意外关机,重新开机后打开了虚拟机。该虚拟机使用的是 Ubuntu 22.04 系统。但重启后,系统一直显示(initramfs):,导致无法正常启动。最后,在网上查找了一些解决方案,成功解决了这个开机问题。在这篇文章中,我将与大家分享解决方案的过程和经验。
1280 0
Ubuntu重启后进入initramfs导致无法开机解决方案
|
存储 XML 人工智能
深度解读AI在数字档案馆中的创新应用:高效识别与智能档案管理
基于OCR技术的纸质档案电子化方案,通过先进的AI能力平台,实现手写、打印、复古文档等多格式高效识别与智能归档。该方案大幅提升了档案管理效率,确保数据安全与隐私,为档案馆提供全面、智能化的电子化管理解决方案。
994 48
|
Windows
github图床链接打开提示raw.githubusercontent.com无法访问解决
picgo上传图片不显示,到GitHub打开也不显示图片,粘贴链接访问提示“raw.githubusercontent.com无法访问”,百度搜索后修改了下hosts解决了。
1197 2
github图床链接打开提示raw.githubusercontent.com无法访问解决
|
网络安全 开发工具 git
【git】解决git报错:ssh:connect to host github.com port 22: Connection timed out 亲测有效
【git】解决git报错:ssh:connect to host github.com port 22: Connection timed out 亲测有效
5397 1
|
存储 缓存 关系型数据库
Mysql/etc/my.cnf参数详解
以上只是 `/etc/my.cnf`中的部分参数,实际上,`/etc/my.cnf`中的参数非常多,可以根据具体的应用需求进行调整。
353 0
|
NoSQL 前端开发 Java
Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
379 0
Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
|
机器学习/深度学习 算法 Serverless
神经网络(NPL)-简介
本分记录了自己学习参考多篇博客后总结的关于神经网络的理解,以供参考学习
5857 0