opencv+python图像识别,麻将牌识别,实现自动打牌方案
互聯網改變了我們的生活,現在連打麻將都在網上打了。進幾年發現身邊的很多朋友都在網上玩一款四川麻將APP。平時沒事的時候我也玩玩,我是一個寫了幾年程序的碼龍,突然有一天我有個想法我能不能用我的專業來解放我的雙手,用深度學習圖像識別來做一個,麻將類軟件的識別器,來幫助自己自動打麻將,從此我就可以一邊看電視一邊嗑瓜子一邊和別人玩麻將了。想想都舒服。
首先我們來分析一下這個里面的技術難點。
難點我們已經梳理出來了,接下來我們就一個一個來解決吧。首先告知大家一下我寫這個項目的時候不是使用什么高大上的c++,java。我使用的是當下比較熱門的python語言,簡單快捷高效。我們項目的整個流程是這樣,首先在電腦上面安裝一個雷電模擬器,然后在模擬器里面安裝APP,程序通過獲取模擬器的圖像數據,從而來獲取游戲APP的數據,最后進行圖像識別,自動出牌。
如何實時獲取屏幕的視頻流。
如果你原來寫win32程序,就知道我們只要能獲取一個窗口的HWND,我們就能獲取窗口里面的所有數據,那么接下來這個就簡單了。廢話不多說我們直接上鏈接。
現在我們游戲圖像數據已經獲取到,如果你想連續實時不斷的獲取的話,你就需要開一個線程 然后沒隔一段時間來獲取一次就可以,接下你需要做的就是把你的圖像數據轉換成你需要處理的數據,我們這里是使用的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 LDPlayerMainFrameleft, top, right, bot = win32gui.GetWindowRect(hWnd)width = right - leftheight = bot - tophWndDC = 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 都可以做圖像識別,然后實現自動出牌,現有完整的項目,可以遠程掩飾,需要的朋友可以聯系。。。
掃描添加好友 獲取更多技能
總結
以上是生活随笔為你收集整理的opencv+python图像识别,麻将牌识别,实现自动打牌方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: epson连接计算机后无法打印,epso
- 下一篇: 单片机定时器总结