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

micropython图像识别(基于深度学习的图像识别)

micropython图像识别

互联网改变了我们的生活,现在连打麻将都在网上打了。进几年发现身边的很多朋友都在网上玩一款四川麻将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筒。首先我们就需要标定一些数据,通过反复的训练,当我们图片里面出现了一个牌,电脑才知道是什么牌。

这样的图片我们大致标定了有几百张,最后生成了一个模型。

这个是我们程序跑起来运行起的一个效果图。