autojs象棋识别棋子

简介: 牙叔教程 简单易懂

牙叔教程 简单易懂

解决问题第一原则

把问题写下来

原图

饱和度

明度

灰度


各个维度的图片没什么区别,

干脆用原图

霍夫找圆

可以看到, 圆的位置基本上正确, 但是又有些许偏差,

让圆更准确的思路

上图已经找到了圆, 在这个圆的基础上, 通过轮廓或者文字的颜色去纠正圆的偏差,

理论上可以纠正圆的位置, 非本文重点, 仅供思路参考

棋子截图

上面是所有的棋子截图, 当选中棋子后, 四个角会有红色标志

可能会对找图产生干扰, 所以我们把棋子的截图半径再搞小点


发现还有个东西没搞, 那就是图片到底是哪个棋子

这个应该用圆的位置来推算

只要圆形的纵坐标相差不大, 就认为他们在同一排


所有圆分6组, 底层+ 中炮 + 五卒

  • 红方3组
  • 黑方3组

遍历圆形, 以第一个圆为起点类, 其他圆形与之按照纵坐标比较,

相差不大就归为一类, 否则归为其他类,

最后再按照纵坐标排序, 就把6组圆分开了


分组完成, 下面给分组按纵坐标排序


pieceGroups.sort(function (pieceGroup1, pieceGroup2) {
  let piece1 = pieceGroup1[0];
  let piece2 = pieceGroup2[0];
  if (piece1.circle.y < piece2.circle.y) {
    return -1;
  } else if (piece1.circle.y > piece2.circle.y) {
    return 1;
  } else {
    return 0;
  }
});


接下每个棋子组, 要按照横坐标排序

for (var i = 0; i < pieceGroups.length; i++) {
  let pieceGroup = pieceGroups[i];
  pieceGroup.sort(function (piece1, piece2) {
    if (piece1.circle.x < piece2.circle.x) {
      return -1;
    } else if (piece1.circle.x > piece2.circle.x) {
      return 1;
    } else {
      return 0;
    }
  });
}


重新裁剪棋子图片, 并且记录棋子的名字;

颜色暂时按照图片, 黑色在上方, 红色在下方,


后期优化的时候, 颜色可以在图片上取多个点, 民主投票,

那种颜色票数多, 就是那种颜色

非本教程重点, 思路仅供参考

for (var i = 0; i < pieceGroups.length; i++) {
  let pieceGroup = pieceGroups[i];
  for (var j = 0; j < pieceGroup.length; j++) {
    let piece = pieceGroup[j];
    let circle = piece.circle;
    let checkPieceArea = calculateCheckPieceArea(img, circle);
    let chessPieceImg = clipChessPieceImg(img, checkPieceArea);
    let color;
    if (count < 15) {
      color = "黑";
    } else {
      color = "红";
    }
    let filePath = dir + "/" + piece.num + "-" + color + "-" + pieceNames[count] + ".png";
    log(filePath);
    files.createWithDirs(filePath);
    images.save(chessPieceImg, filePath);
    chessPieceImg.recycle();
    count++;
  }
}



万事俱备, 验证一下,

验证步骤

  1. 走几步象棋
  2. 截图
  3. 查看识别结果


又发现一个问题, 有重复的棋子,

重新来过, 把重复的棋子删掉不要


for (var i = 0; i < pieceGroups.length; i++) {
  let pieceGroup = pieceGroups[i];
  for (var j = 0; j < pieceGroup.length; j++) {
    let piece = pieceGroup[j];
    let circle = piece.circle;
    let checkPieceArea = calculateCheckPieceArea(img, circle);
    let chessPieceImg = clipChessPieceImg(img, checkPieceArea);
    let color;
    if (count <= 15) {
      color = "黑";
    } else {
      color = "红";
    }
    let archivedPiece = archivedPieces[color + pieceNames[count]];
    if (archivedPiece) {
      // 重复的棋子, 只留下一个
      count++;
      continue;
    } else {
      archivedPieces[color + pieceNames[count]] = 1;
    }
    let filePath = dir + "/" + piece.num + "-" + color + "-" + pieceNames[count] + ".png";
    files.createWithDirs(filePath);
    images.save(chessPieceImg, filePath);
    chessPieceImg.recycle();
    count++;
  }
}


此时, 棋子的图片应该有14张


再次识别象棋, 识别出来后, 写上绿色的文字


for (var i = 0; i < pieces.length; i++) {
  let piece = pieces[i];
  var points = images.matchTemplate(img, piece.img, {
    threshold: 0.9,
  }).points;
  if (points) {
    points.forEach((point) => {
      canvas.drawText(piece.name, point.x, point.y, textPaint);
    });
  }
}



全部识别正确

测试环境

手机: Mi 11 Pro
Android版本: 12
Autojs版本: 9.1.13


名人名言

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

声明

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


相关文章
|
前端开发 测试技术 Go
autojs滑块验证码-查找位置(二)
牙叔教程 简单易懂
3486 0
|
3月前
|
SQL 存储 关系型数据库
MySQL恢复之Binlog格式详解
本文详解MySQL binlog日志的格式与闪回恢复机制,涵盖误操作数据恢复的核心原理、注意事项及实操步骤。重点解析ROW格式下的各类binlog事件(如Format_desc_event、Query_event、Table_map_event、Write/Update/Delete_rows_event等)的结构与作用,并结合实际场景演示如何通过mysqlbinlog工具解析日志、生成反向SQL实现精准恢复。内容深入浅出,适用于DBA及开发人员提升数据安全保障能力。
261 0
MySQL恢复之Binlog格式详解
|
Linux 开发工具 Windows
中国时间服务器,国内阿里云时间服务器
中国时间服务器,国内阿里云时间服务器很多用户使用的是国外VPS使用过程中常常遇到时间与国内不同步的情况好在阿里提供了7台NTP服务器,地址如下:阿里云提供了7个NTP时间服务器也就是Internet时间同步服务器地址 ntp1.
41794 0
|
算法 决策智能
基于GA-PSO遗传粒子群混合优化算法的TSP问题求解matlab仿真
本文介绍了基于GA-PSO遗传粒子群混合优化算法解决旅行商问题(TSP)的方法。TSP旨在寻找访问一系列城市并返回起点的最短路径,属于NP难问题。文中详细阐述了遗传算法(GA)和粒子群优化算法(PSO)的基本原理及其在TSP中的应用,展示了如何通过编码、选择、交叉、变异及速度和位置更新等操作优化路径。算法在MATLAB2022a上实现,实验结果表明该方法能有效提高求解效率和解的质量。
|
移动开发 小程序
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
663 0
|
Web App开发 缓存 安全
解决Edge浏览器提示“此网站已被人举报不安全”
【9月更文挑战第1天】当 Edge 浏览器提示“此网站被举报为不安全”时,可尝试:关闭 Microsoft Defender SmartScreen;检查网站安全性;清除缓存和 Cookie;更新 Edge 至最新版;或使用其他浏览器。若问题依旧,联系网站管理员和技术支持。同时,避免在不可信网站输入敏感信息,保护网络安全与隐私。
4278 7
|
开发框架 安全 PHP
ThinkPHP和Laravel
【8月更文挑战第23天】ThinkPHP和Laravel
426 4
|
小程序 Java Go
用golang实现一个小程序商城后台系统(moshopserver)
用golang实现一个小程序商城后台系统(moshopserver) golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一些资料,有些人说很容易上手,确实是这样,和C/C++比起来,少了很多乱七八糟的语法。
3664 0
用golang实现一个小程序商城后台系统(moshopserver)
|
Go Windows
|
算法 安全 网络协议
关于国密SSL常用的技术原理介绍
随着越来越多的国际通用密码算法屡屡被传出被破解、被攻击的传闻,存在较高的安全风险。此外,当前我国金融系统大多采用国外制定的加密算法,存在着大量的不可控因素,一旦被不法分子利用攻击,所产生的损失将不可估量。所以国密改造提上日程。国密SSL通信依据的协议是中国人民共和国密码行业标准《SSL VPN技术规范GM/T 0024--2014》协议(链接)。其协议流程和传统的使用RSA证书的TLS协议流程基本一致,但是过程中使用的核心算法已经全部切换到国密相关的算法实现上,为了保证通信的安全监管机构开始推动国内金融行业进行国密改造。我们和客户一起进行了多个国密项目的改造之后,这里整理了国密HTTPS 和国
2463 0
关于国密SSL常用的技术原理介绍

热门文章

最新文章