python 图像识别实现四川麻将回放牌面数据
? ? ? ?python?圖像識別?自動獲取麻將APP實時牌面數據?
? ? ? ? ? ? 前面寫了一篇文章,深度學習圖像識別麻將APP數據,然后結合自己的算法實現自動打麻將demo!很多朋友感興趣。最開始做這個也只是為了研究學習圖像識別這一塊,很多朋友來問算法是怎么實現的,算法就是一個最簡單的快速最大幾率胡牌算法,能實現簡單的定缺,下叫胡牌算法。要達到真正的打贏真實玩家是幾乎不可能的。我們做這個也是為了研究學習,如果你有想靠這個算法來打贏真實玩家的朋友就別來咨詢了。我們可以一起來研究技術,算法。
? ? ? ? ? ?最近網上看到一篇文章,微軟已經研究出來一套日本麻將,基本上能完全打贏真實的人類玩家,據說已經達到95%以上的勝率,如果你對這個感興趣可以百度一下。大概看了一下文章的介紹,明白了基本的原理。簡單來說就是? 先通過大量的高質量數據來訓練一個深度學習的模型。然后在通過強化學習來優化出牌的算法。這個確實,因為AI在一直不斷的自我學習,不斷的自我提高。最后才能達到打贏玩家的情況。微軟這個是基于日本天鳳平臺的日本麻將來研究得。因為天鳳平臺的麻將牌局數據一直都是開源的,需要研究得朋友可以免費下載來使用。國內就沒有這個環境,你如果要研究一種麻將算法,沒有任何地方可以下載到完整的麻將牌面數據。我們知道深度學習?前期需要大量的高質量麻將數據?來訓練模型,才能達到一個基本和玩家水平持平的模型,然后在加以強化學習,就能達到最終的目的。當然所有的東西都是?說起來簡單,做起來很困難。如果真正通過自己的研究,達到微軟的水平?可能還有很多很多的路要走,大家一起研究,一起學習!所有技術人共勉,大家有什么好的想法?思路可以留言學習!
? ? ? ? ?說了這么多廢話,下面我們開始進入今天的重點,如果通過圖像識別來抓取?完整的牌面信息。前面有一篇文章,通過那面文章你可以了解?如果圖像識別來識別APP里面的牌。
? ? ? ? 現在我們已經能夠識別出來所有的牌,接下來我們只要通過方位來獲取每個玩家出的牌,然后串聯起來就是完整的牌局信息。
? ? ? ?我們探討的麻將是基于西南片區這面比較流行的:四川麻將??
? ? ? 四川麻將規則:所有玩家缺一門?才能胡牌? 一家胡牌游戲繼續? 直到有3個玩家胡牌游戲結束? 或者牌面上的牌摸完游戲結束
? ? ? 游戲平臺:基于某貓麻將APP,為了方便識別,動態修改了某些圖片,只供研究學習使用!
? ? ? 游戲玩法:支持換三張或者不換三張游戲。
? ? ? ? 這點我們定義幾個數據:
? ? ? ?條----0? ?萬-----1? 筒-------2? ?1條到9條:1---9? ? 1萬到9萬:11-------19? 1筒到9筒:21-------29
? ? ? ? 玩家的座位索引:最下方為0?順時針旋轉?依次為 1 2 3?
? ? ? ?來來來來? 我們開始一步一步來? 首先游戲一開始? 我們肯定是先獲取所有玩家的初始手牌和所有玩家的定缺:
? ? ? ? 初始手牌比較的簡單? 莊家14張?所有不是莊家的玩家13張
? ? ? ?游戲開始的標志,4個玩家都已經定缺完成,牌面上沒有任何一個玩家出過牌。這個我們定位游戲開始標志,我們可以通過識別來很好的識別出來!請看下圖。
首先游戲開始?我們獲取所有玩家的手牌,并獲取當前的定缺信息
0 [1, 1, 2, 2, 6, 8, 9, 21, 21, 21, 22, 24, 29] 1
1 [11, 11, 12, 13, 14, 15, 15, 18, 23, 24, 24, 28, 28] 3
2 [4, 5, 6, 11, 11, 14, 14, 14, 15, 15, 16, 17, 23] 2
3 [1, 3, 3, 5, 7, 7, 13, 22, 22, 23, 25, 26, 26, 29] 1
所有玩家的手牌?我們獲取到了?現在游戲真正的開始了!首先由莊家先出牌。
首先我們分別劃分區域來管理所有玩家的牌面信息!手牌區域為我們最重要的一個區域,所有的變化都是通過手牌區域來區分的
如何識別摸牌:上一次牌面信息為別人打牌,并且打出來之后再出牌區域沒有減少。某一個手牌區域多了一張牌,則視為某個玩家摸牌。3 摸牌 [13]
如何識別打牌:前一次某個手牌區域多了一張牌,下一次掃描發現少了一張牌,這個視為某一個玩家摸牌。0 打牌 [5]
玩家的操作:胡?碰?杠?牌面上都有不同的標志來區分。0 碰 [21,21,21] 21 1
所有的過操作:當某一個玩家摸牌之后,掃描一下上一次打的牌,別人是否能碰,能杠,能胡,有?我們則視為玩家過了這一個操作。我們用pass來表示。2 pass [13,13] [peng] 3
我們每次掃描牌面發生的變化,再結合以上的情況判斷?我們就能識別出來整個牌局的流程信息!
最后還有一個難點就是,108張的問題,當初做這個也廢了很大的功夫!
講講最后的實現方法。
牌局結束的標志,掃描固定區域是否有胡標志,固定區域是否有分數的標志。如果都滿足我們視為游戲結束。
因為最后一張牌打出來之后,畫面快速跳轉到結算界面,所有通過正常的流程我們不能抓到最后一張的信息。我們只能通過記錄上一次的操作?來區分。
通過記錄最后一次摸牌玩家的手牌,和最后結算畫面對比,我們就知道最后摸牌玩家出的是什么牌。
如果最后摸牌玩家后面有胡的標志,則摸牌玩家自摸。
如果摸牌玩家后面沒有胡的標志,最后打的牌就是?少的那張牌
?
區分別人是否胡了最后一張:
前面我們通過胡牌的標志,我們能很好的計算出來那些玩家前面是胡了。
如果前面沒有胡牌的標志,最后結算畫面玩家有胡的標志,則視為玩家胡了最后一張,反之則沒有胡。
?
通過我這個不太清楚的描述?不知道你現在是否清楚了?整個項目的實現流程。下面給出最后的視頻呈現!!!!
?
日志文件的部分截圖,完整日志和視頻放在最下方鏈接里面下載!!!!!
戰績回放demo視頻
下載地址
?如果對于項目你有什么好的建議,我們一起交流,一起促進社會的進步,早日實現?世界和平!
總結
以上是生活随笔為你收集整理的python 图像识别实现四川麻将回放牌面数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Lync Online与MSN联系人
- 下一篇: 基于python3.7的4环电阻读数工具