基于opencv2的斗地主记牌器(python)

一、开发该系统软件环境及使用的技术说明

  • 开发环境: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标准库

二、开发缘由

这个是数字图像处理的课程设计,用了三个星期,总算是把我的斗地主记牌器做出来了,灵感是来自于****上的一篇文章:但他就写了个想法,我觉得挺有意思的,又恰好要做课程设计而且也涉及到了学习的内容,就着手做了起来。

在网上找了一圈,并没有发现完整的这种类型的斗地主记牌器,只好自己来。左手看别人博客,右手看看库函数,一点一点实现。虽然过程中也遇到了不少问题,但还是一一解决了。这次的课程设计让我学到了不少东西,从框架(虽然还是很乱,但毕竟第一次搞这种比较大的py代码,甚至可以说没有框架)、界面到各个小问题的认识和实现都有了一定的提高。我决定啦,专业方向选择人工智能一块,决心考研,读书深造,好好努力!

三、一些仍然存在的问题

测试发现:

  • 对于单牌、对子、顺子、连对、炸弹、3带1、3带2、4带2、飞机都有着较高的准确度
  • 对于飞机带两个对子的那种换行的牌型是无法进行识别的。会漏掉第二行的纸牌。
  • 若腾讯Ai无法识别出内容,会导致闪退
  • 网络问题导致解码失败,闪退
  • 在连对、顺子等特效播放的时间进行截图会导致识别结果错误甚至闪退
  • 大王小王无法区分
  • 对家出牌的王无法识别
  • 一些不为所知的错误导致的闪退

四、软件主体

软件主体为4个py文件

  • imageCapture图像截取(截取斗地主界面)
  • ImagePartition图像分割(截取纸牌部分)
  • Tencent(文字识别)
  • Mian2(pyqt5制作的用户交互界面)

五、原理(以手牌识别为例)

原始图像,从系统的截图api获取
基于opencv2的斗地主记牌器(python)
切片操作获取大致区域
基于opencv2的斗地主记牌器(python)
通过参数获取图片基于opencv2的斗地主记牌器(python)

转码,将RGB格式转为HSV格式用于掩码处理基于opencv2的斗地主记牌器(python)

通过白色掩码提取白色区域
基于opencv2的斗地主记牌器(python)
转回RGB模式后转为灰度图

使用闭运算消除内容物,寻找轮廓基于opencv2的斗地主记牌器(python)

使用开运算消除外容物,降噪
基于opencv2的斗地主记牌器(python)
使用cv2.findContours函数提出轮廓

根据上面得到的轮廓的上下左右的最大值构建矩形,在灰度图中使用切片操作直接获取结果
基于opencv2的斗地主记牌器(python)
根据纸牌的比例进行切割
基于opencv2的斗地主记牌器(python)
将结果返回到获取具体手牌函数(下面这个图不是上面的结果)
基于opencv2的斗地主记牌器(python)

六、源码

https://github.com/xiaooo-jian/Digital-image-processing-Final-Work

劳烦点个星星啦

参考博客