autojs检测扑克位置

497 阅读3分钟

牙叔教程 简单易懂

斗地主

斗地主是一种扑克游戏。游戏最少由3个玩家进行,用一副54张牌(连鬼牌),其中一方为地主,其余两家为另一方,双方对战,先出完牌的一方获胜。

底牌有3张, 拿到底牌的就是地主, 54-3=51, 51/3=17, 农民手里17张牌, 地主手里21张牌

检测的定义

这里的检测指的是,

在已知扑克的大概区域后, 检测扑克左上角的位置, 然后裁剪出扑克的数字和花色

你可以把这些扑克分割开吗?

在打扑克的时候, 扑克的间距可能是有变化的, 比如对比一下这两张

上面是17张牌, 下面是21张牌, 他们的间距是不一样的, 因此不能用固定的间距来找扑克的位置;

我们使用轮廓来查找他们的位置

轮廓

扑克的左上角是数字和花色, 我们只找数字的轮廓;

数字和花色的高度基本是一比一的关系, 后期裁剪图片的时候, 高度 * 2, 即可;

这里面有个扑克比较特殊, 就是10, 10是两个数字1和0, 我们要把他变成一个轮廓,

因此, 需要横向膨胀, 使1和0连接起来

我们先裁剪图片

再二值化

图片处理的目标是白色, 因此我们反转一下颜色

观察这两个图片

大小王,上下是分离的; 10左右是分离的, 我们要把它连接起来

先膨胀后腐蚀, 这个叫 闭运算

闭运算以后, 所有的扑克数字就都只有一个轮廓了

我们把轮廓画出来

轮廓数量

contours.size() = 18 

我们之后17张扑克, 多了一个轮廓, 把轮廓的序号画上去看看

第一张是大王, 大王有2个轮廓, 我们依次画轮廓

第一个轮廓, 是预期的轮廓

第二个轮廓, 在J右上角一点点绿色

我们用轮廓的高度来过滤一下轮廓, 高度小于20像素, 就不要了, 这样扑克的数量就是17;

画出轮廓的外接矩形

到这里扑克的数字就找到了, 我们在原始图片中 , 画出扑克和花色的位置

总结

检测扑克位置的步骤

  1. 知道扑克的大概位置

  2. 找扑克左上角数字的轮廓

  3. 过滤掉不符合条件的轮廓

  4. 轮廓的高度 *2, 就是数字和花色的区域

  5. 特殊处理 大小王和10, 先膨胀后腐蚀, 这个叫 闭运算, 目标是白色

环境

设备: 小米11pro
Android版本: 12
Autojs版本: 9.2.13

名人名言

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

声明

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

微信公众号 牙叔教程