一、开发该系统软件环境及使用的技术说明
- 开发环境:JetBrains PyCharm Community Edition 2019.2.5 x64
- 远端仓库:GitHub
- 语言版本:python3.7.0(Anaconda3)
- 技术说明:
- OpenCV 4.2.0.32
- NumPy 1.16.5
- PyQt5 5.15.0
- PyWinMouse 1.0 (pyqt5的官方小demo)
- win32api、win32con、win32gui、win32ui
- 腾讯云文字识别接口
- Python标准库
二、开发缘由
这个是数字图像处理的课程设计,用了三个星期,总算是把我的斗地主记牌器做出来了,灵感是来自于CSDN上的一篇文章:但他就写了个想法,我觉得挺有意思的,又恰好要做课程设计而且也涉及到了学习的内容,就着手做了起来。
在网上找了一圈,并没有发现完整的这种类型的斗地主记牌器,只好自己来。左手看别人博客,右手看看库函数,一点一点实现。虽然过程中也遇到了不少问题,但还是一一解决了。这次的课程设计让我学到了不少东西,从框架(虽然还是很乱,但毕竟第一次搞这种比较大的py代码,甚至可以说没有框架)、界面到各个小问题的认识和实现都有了一定的提高。我决定啦,专业方向选择人工智能一块,决心考研,读书深造,好好努力!
三、一些仍然存在的问题
测试发现:
- 对于单牌、对子、顺子、连对、炸弹、3带1、3带2、4带2、飞机都有着较高的准确度
- 对于飞机带两个对子的那种换行的牌型是无法进行识别的。会漏掉第二行的纸牌。
- 若腾讯Ai无法识别出内容,会导致闪退
- 网络问题导致解码失败,闪退
- 在连对、顺子等特效播放的时间进行截图会导致识别结果错误甚至闪退
- 大王小王无法区分
- 对家出牌的王无法识别
- 一些不为所知的错误导致的闪退
四、软件主体
软件主体为4个py文件
- imageCapture图像截取(截取斗地主界面)
- ImagePartition图像分割(截取纸牌部分)
- Tencent(文字识别)
- Mian2(pyqt5制作的用户交互界面)
五、原理(以手牌识别为例)
原始图像,从系统的截图api获取
切片操作获取大致区域
通过参数获取图片
转码,将RGB格式转为HSV格式用于掩码处理
通过白色掩码提取白色区域
转回RGB模式后转为灰度图
使用闭运算消除内容物,寻找轮廓
使用开运算消除外容物,降噪
使用cv2.findContours函数提出轮廓
根据上面得到的轮廓的上下左右的最大值构建矩形,在灰度图中使用切片操作直接获取结果
根据纸牌的比例进行切割
将结果返回到获取具体手牌函数(下面这个图不是上面的结果)
六、源码
https://github.com/xiaooo-jian/Digital-image-processing-Final-Work
劳烦点个星星啦
参考博客
-
安卓基于图像识别和CNN做出一个通用的斗地主记牌器(一)
-
C++ 纯 OpenCV 实现扑克牌实时识别
springboot + maven实现的车牌识别及训练系统
使用OpenCV的findContours获取轮廓并切割(python)
Python实现屏幕截图的两种方式
【python】【文字识别】利用腾讯云调用通用图片文字识别接口,识别图片中的文字
Python中opencv所使用的图片格式与 base64转换