记牌器的实现原理与方法—基于图像识别技术

屈伟军(武汉大学遥感信息工程学院)

返回到首页


一、基本原理介绍
    在QQ斗地主游戏中,每张扑克牌的字符特征各不相同,游戏中出牌的区域是固定的。根据出牌区域的位置,利用截屏技术可以截取每位玩家出过的牌的图像。根据扑克牌的字符特征为每张牌制定一个模板,在游戏中对每张出过的牌进行模板匹配,就可以识别出该牌,以达到游戏中实时记牌的目的。

二、实现方法与过程
1、程序实现过程
    在程序一开始运行时设置一个定时器,检查游戏窗口是否存在,若游戏窗口存在,则记牌器开始工作。当处于准备阶段时,记牌器中的所有参数进行初始化并准备进行记牌工作。若新的一局开始,记牌器首先记下玩家自己手里的牌,如果玩家是地主,再记下三张底牌。判断游戏是否开始的关键就是检查游戏窗口内是否存在读秒时钟,该功能可以通过判断游戏窗口内某几个特定像素的颜色值来实现。当游戏窗口的上方出现三张底牌时,表明此时地主已经确定。由于地主是第一个出牌的人,此时可以通过时钟的位置来确定地主是谁,方法与上面相同。
    当时钟的位置发生变化时,则表示当前时钟位置的上家进行了出牌的操作(要么出了牌,要么不出),同样可以通过某几个特定像素的颜色值来判断时钟位置的上家是否出了牌。若时钟位置的上家出了牌,则截取时钟位置上家的牌并进行识别,若其不出,则不进行操作。每进行一次识别操作后,将识别后的结果在程序界面中实时显示出来。
    需要注意的是若时钟位置的上家是自己则不需要截取图像,因为自己的牌在游戏一开始时就已经全部识别了。另外,当自己选择托管时,轮到自己出牌的时候相应位置并不会出现时钟,但是其他玩家选择托管时并不会出现这种情况。所以当自己选择托管并且时钟出现在下家的位置时就要判断上家是否出牌。
    当一局结束后,将记牌的所有参数进行初始化,重复上面的步骤。
2、关键算法介绍
    实现本程序的关键算法就是如何截取图像并进行模板匹配。在程序实现的过程中,我写了一个截取特定窗口内特定矩形区域图像的函数,用来截取每位玩家出过的牌,并保存为位图。为了提高模板匹配的速度和精度,将截取到的位图进行二值化,并根据扑克牌的字符特征,对图像特定几个字节的数据进行匹配就行了。
    QQ游戏中扑克牌字符的模板大小都为10×12像素。由于方片5与黑桃A在牌上的位置与其他5和A不同,大小王在牌上的位置也不相同,因此分别为其制定了两个模板。
    以字符3为例,其二值图像像素数据的十六进制表示为: E0 C0 00 00 C0 40 00 00 CE 40 00 00 FE 40 00 00 FE 40 00 00 E0 40 00 00 E0 C0 00 00 F3 C0 00 00 F9 C0 00 00 CC C0 00 00 C0 40 00 00 C0 40 00 00
    经比较发现,只要判断其第45、46两个字节(即图像最上面一行像素值)为C0 40和第13个字节(图像从下往上数第4行前8个像素的值)为FE就行了。而对于大多数字符,只需要判断其45、46两个字节的值就能唯一确定该字符。

三、实验与分析
    由于不同的分辨率设置对游戏窗口内时钟和牌的位置有所影响,因此本程序针对不同的分辨率对相关参数进行了调整。在1280×1024的分辨率下进行实验时,基本上没有发现什么问题。只是当所有玩家都没有叫牌,系统重新发牌时,程序运行会出现异常,这是由于程序设计时是通过判断读秒时钟是否存在来判断游戏是否开始所导致的,正在考虑改进之中。在游戏时若有其他窗口遮挡了自己的牌、出牌区域、底牌位置或者时钟位置,都会造成当前局记牌不正确的情况,这是由于本程序的设计思想所导致的,无法避免。

四、结束语
    图像识别技术在很多领域都有广泛的应用,是目前研究的热点。虽然在一些应用上其效果并不明显,但它利用计算机自动化、智能化的这一优点是我们所不容忽视的。本次将其应用到游戏辅助工具的开发之中,便达到了很好的效果,我相信图像识别技术还有很大的发展前景。