牙叔教程 简单易懂
斗地主
斗地主是一种扑克游戏。游戏最少由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;
画出轮廓的外接矩形
到这里扑克的数字就找到了, 我们在原始图片中 , 画出扑克和花色的位置
总结
检测扑克位置的步骤
-
知道扑克的大概位置
-
找扑克左上角数字的轮廓
-
过滤掉不符合条件的轮廓
-
轮廓的高度 *2, 就是数字和花色的区域
-
特殊处理 大小王和10, 先膨胀后腐蚀, 这个叫 闭运算, 目标是白色
环境
设备: 小米11pro
Android版本: 12
Autojs版本: 9.2.13
名人名言
思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问 --- 牙叔教程
声明
部分内容来自网络 本教程仅用于学习, 禁止用于其他用途