互联网改变了我们的生活,现在连打麻将都在网上打了。进几年发现身边的很多朋友都在网上玩一款四川麻将APP。平时没事的时候我也玩玩,我是一个写了几年程序的码龙,突然有一天我有个想法我能不能用我的专业来解放我的双手,用深度学习图像识别来做一个,麻将类软件的识别器,来帮助自己自动打麻将,从此我就可以一边看电视一边嗑瓜子一边和别人玩麻将了。想想都舒服。
首先我们来分析一下这个里面的技术难点。
hWnd = win32gui.FindWindow("LDPlayerMainFrame",None)
left, top, right, bot = win32gui.GetWindowRect(hWnd)
width = right - left
height = bot - top
hWndDC = win32gui.GetWindowDC(hWnd)
mfcDC = win32ui.CreateDCFromHandle(hWndDC)
saveDC = mfcDC.CreateCompatibleDC()
saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC,width,height)
saveDC.SelectObject(saveBitMap)
saveDC.BitBlt((0,0), (width,height), mfcDC, (0, 0), win32con.SRCCOPY)
现在我们游戏图像数据已经获取到,如果你想连续实时不断的获取的话,你就需要开一个线程 然后没隔一段时间来获取一次就可以,接下你需要做的就是把你的图像数据转换成你需要处理的数据,我们这里是使用的opencv 我们这里就把图像数据转换成opencv。
bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)
im_PIL = Image.frombuffer('RGB',(bmpinfo['bmWidth'],bmpinfo['bmHeight']),bmpstr,'raw','BGRX',0,1)
signedIntsArray = saveBitMap.GetBitmapBits(True)
win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hWnd,hWndDC)
im_opencv = numpy.frombuffer(signedIntsArray, dtype = 'uint8')
im_opencv.shape = (height, width, 4)
现在上这个函数的全部链接,需要的同学赶紧下单,搬它,搬它,搬它,搬它!!!
def getwindowImageData():
hWnd = win32gui.FindWindow("LDPlayerMainFrame",None) #窗口的类名可以用Visual Studio的SPY++工具获取LDPlayerMainFrame RCImageViewerFrame KK_Frame LDPlayerMainFrame
left, top, right, bot = win32gui.GetWindowRect(hWnd)
width = right - left
height = bot - top
hWndDC = win32gui.GetWindowDC(hWnd)
mfcDC = win32ui.CreateDCFromHandle(hWndDC)
saveDC = mfcDC.CreateCompatibleDC()
saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC,width,height)
saveDC.SelectObject(saveBitMap)
saveDC.BitBlt((0,0), (width,height), mfcDC, (0, 0), win32con.SRCCOPY)
bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)
im_PIL = Image.frombuffer('RGB',(bmpinfo['bmWidth'],bmpinfo['bmHeight']),bmpstr,'raw','BGRX',0,1)
signedIntsArray = saveBitMap.GetBitmapBits(True)
win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hWnd,hWndDC)
im_opencv = numpy.frombuffer(signedIntsArray, dtype = 'uint8')
im_opencv.shape = (height, width, 4)
return cv2.cvtColor(numpy.asarray(im_PIL),cv2.COLOR_RGBA2BGR)
第一个难点我们通过上面的办法已经解决掉了。接下来我们就开始来处理本文中难点中的难点。如果识别屏幕中的牌。我们举一个现实中比较常见的例子,你是如何辨别出一样的东西的,我们从呱呱落地的时候,对世界一无所知,我们之所以知道这个是苹果,那个是香蕉。是不是也是第一次我们父母给我们吃了一个水果,说这个叫苹果,然后通过反复的训练我们就知道这个是苹果了。那么电脑也是一样的,我们要让程序辨别出一张牌,我们首先必须要告诉它 什么样的牌才是1筒。首先我们就需要标定一些数据,通过反复的训练,当我们图片里面出现了一个牌,电脑才知道是什么牌。
在这里插入图片描述
这样的图片我们大致标定了有几百张,最后生成了一个模型。
在这里插入图片描述
这个是我们程序跑起来运行起的一个效果图。
最后一点:如何控制整个游戏的流程不错乱。
需要注意的事项就是需要剔除玩家重复的操作,没一个操作只记录一次,不是你会发现后面遇到一堆奇葩的问题。
最终的运行效果:
麻将APP图像识别
有兴趣的朋友可以一起研究 vx:scmjAI666
理论上随便什么APP 都可以做图像识别,然后实现自动出牌,现有完整的项目,可以远程掩饰,需要的朋友可以联系。。。
扫描添加好友 获取更多技能