opencv+python图像识别,麻将牌识别,实现自动打牌方案

互联网改变了我们的生活,现在连打麻将都在网上打了。进几年发现身边的很多朋友都在网上玩一款四川麻将APP。平时没事的时候我也玩玩,我是一个写了几年程序的码龙,突然有一天我有个想法我能不能用我的专业来解放我的双手,用深度学习图像识别来做一个,麻将类软件的识别器,来帮助自己自动打麻将,从此我就可以一边看电视一边嗑瓜子一边和别人玩麻将了。想想都舒服。
首先我们来分析一下这个里面的技术难点。

  1. 如何实时获取屏幕的视频流。
  2. 如何识别出屏幕中的某一张牌是什么。(难点中的难点)
  3. 如何控制整个游戏的流程不错乱。
    难点我们已经梳理出来了,接下来我们就一个一个来解决吧。首先告知大家一下我写这个项目的时候不是使用什么高大上的c++,java。我使用的是当下比较热门的python语言,简单快捷高效。我们项目的整个流程是这样,首先在电脑上面安装一个雷电模拟器,然后在模拟器里面安装APP,程序通过获取模拟器的图像数据,从而来获取游戏APP的数据,最后进行图像识别,自动出牌。
    如何实时获取屏幕的视频流。
    如果你原来写win32程序,就知道我们只要能获取一个窗口的HWND,我们就能获取窗口里面的所有数据,那么接下来这个就简单了。废话不多说我们直接上链接。
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筒。首先我们就需要标定一些数据,通过反复的训练,当我们图片里面出现了一个牌,电脑才知道是什么牌。
在这里插入图片描述
opencv+python图像识别,麻将牌识别,实现自动打牌方案_第1张图片

这样的图片我们大致标定了有几百张,最后生成了一个模型。
在这里插入图片描述
这个是我们程序跑起来运行起的一个效果图。
opencv+python图像识别,麻将牌识别,实现自动打牌方案_第2张图片

最后一点:如何控制整个游戏的流程不错乱。
需要注意的事项就是需要剔除玩家重复的操作,没一个操作只记录一次,不是你会发现后面遇到一堆奇葩的问题。

最终的运行效果:

麻将APP图像识别

有兴趣的朋友可以一起研究 vx:scmjAI666
理论上随便什么APP 都可以做图像识别,然后实现自动出牌,现有完整的项目,可以远程掩饰,需要的朋友可以联系。。。
扫描添加好友 获取更多技能
opencv+python图像识别,麻将牌识别,实现自动打牌方案_第3张图片

你可能感兴趣的:(棋牌游戏开发,深度学习)