作者:龙林 EMAIL:dragon_hn@sohu.com WEB:www.dragon-2008.com
玩了一阵子QQ斗地主游戏,无赖资质太差了,老是记不住牌,上网搜索了一下有关QQ斗地主记牌器,下载了几个,没想到这小东东居然还要注册,还要给注册费,气愤之余,自己在VC环境下做了一个,感觉不错,现将原理公布如下:
该记牌器采用图像识别原理,而不是通过网络截包的方式。
(1)获取当前QQ窗口图片,首先通过下列代码查找QQ斗地主主程序窗口:
CWnd *hwnd=FindWindow(NULL,"新斗地主");
然后通过BitBlt将窗口图片复制到内存CBitmap对象中,再通过代码:
m_BkBmp1.GetBitmapBits(length,pBuff);
获取图像的RGB数据。
(2)获取扑克牌位置
扑克牌的位置很好查看,因为扑克牌有边框,颜色为黑色,与背景色明显不同,另外牌的大小固定
(3)识别扑克牌
与“人脸识别”,“OCR”等不同,在获取扑克牌位置之后,识别扑克牌特别简单,因为扑克牌图像具有不变性,对2,3,4,5,6,7,8,9,10,J,Q,K,A等这些字符,通过统计可以发现,只要识别几个像素(特征点),就可以很快确定,下面是我识别的像素的特征点相对扑克牌左上角的坐标:
(4,4) (6,4) (10,4) (5,9) (8,9) (10,9) (4,15) (7,15) (10,15)
本来斗地主是不用识别花色的,不过为了对记牌结果进行校验,还是采用了花色识别,注意对同一个花色不同牌号可能存在不同的特征点
(4)识别牌局的开始与结束
实际上识别牌局开始就行了,牌局开始的时候主窗口会出现一个金色的“开始”按钮,程序中实际就是识别该按钮。
(5)结果显示
采用一个附于主窗口右上角的小窗口实现
|