[聊天] 接龍小遊戲 自動查表器
覺得小遊戲查表好麻煩,做了一個查表器
附上人權
http://i.imgur.com/vzuo7ru.jpg
# 實驗成果
v1
https://youtu.be/IcirpEYB2lY
v2,感謝小精靈改scrcpy
https://youtu.be/Nb9cCh4DmgY
# source code
aHR0cHM6Ly9wYXN0ZWJpbi5jb20vajhNY3F4RGE=
# 實驗環境
- Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
- 12G RAM
- MX500 SSD
- Ubuntu 19.10
# 辨識九宮格圖示
OpenCV提供大量函式,為此我們使用了 `matchTemplate` 辨識圖示,整體流程如下
1. 切割原始圖片成單張圖示(icon),大小為106x106px
2. 調整大小至78x78px
3. 用 `matchTemplate` 比對148張既有圖示,排序 `min_val`,找出最大值所對應的圖示和ID
![](https://i.imgur.com/tATMR9t.png)
得益於Profiling工具的日新月異,我用cProfile分析單執行緒的 python script,發現最耗時的地方位於`templateMatching`,足足佔了整體執行時間97%‧
```bash
~$ python3 -m cProfile -s tottime ./tmp.py
0.7606322765350342
325680 function calls (318751 primitive calls) in 1.289 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
1287 0.741 0.001 0.741 0.001 {matchTemplate}
28/17 0.162 0.006 0.240 0.014 {built-in method
_imp.create_dynamic}
280 0.045 0.000 0.045 0.000 {built-in method marshal.loads} 2 0.041 0.020 0.041 0.020 {imread}
```
### 全彩轉灰階
試著將全彩圖示轉換成灰階再進行比對
```bash
~$ python3 -m cProfile -s tottime ./tmp.py
0.2725179195404053
326034 function calls (319105 primitive calls) in 0.811 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
1287 0.256 0.000 0.256 0.000 {matchTemplate}
```
看的出 maximum overhead 還是在`templateMatch`,但總執行時間足足少了65%‧
### 縮小圖示再比對
將兩邊要比對的78x78px縮小至26x26px,於是`matchTemplate`讓出寶座,整體執行時間更是來到 0.05s(-80%),圖示辨識率也還是維持100%。
```
0.05796694755554199
326071 function calls (319142 primitive calls) in 0.613 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
28/17 0.153 0.005 0.234 0.014 {built-in method
_imp.create_dynamic}
280 0.046 0.000 0.046 0.000 {built-in method marshal.loads} 2 0.043 0.022 0.043 0.022 {imread}
1287 0.042 0.000 0.042 0.000 {matchTemplate}
1175/1120 0.021 0.000 0.073 0.000 {built-in method
builtins.__build_class__}
```
為了減少執行時間,我們也測試圖片大小和辨識準確率關係,程式有做一些改動(印出正確率、存測試資料),下方數據只是作為 Image size 的選取依據並非實際執行時間。測試腳本如下
```bash
for i in `seq 78 -2 1`;do icon_size=$i python3 tmp.py; done;
```
只用一張遊戲畫面圖片做測試
icon size | elapsed time (sec)| accurate rate %)
---|---|---
78x78|0.2452|100.0
26x26|0.0758|100.0
24x24|0.0447|100.0
22x22|0.0434|100.0
20x20|0.0390|100.0
18x18|0.0389|88.9
16x16|0.0339|77.8
14x14|0.0473|77.8
12x12|0.0277|66.7
10x10|0.0295|77.8
8x8|0.0248|55.6
6x6|0.0234|55.6
4x4|0.0221|11.1
2x2|0.0210|11.1
看來極限能到20x20px,取20x20的耗時較26x26減少30%
26x26
```
0.0584
326155 function calls (319226 primitive calls) in 0.573 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
28/17 0.144 0.005 0.221 0.013 {built-in method
_imp.create_dynamic}
280 0.045 0.000 0.045 0.000 {built-in method marshal.loads} 1287 0.043 0.000 0.043 0.000 {matchTemplate}
```
20x20
```
0.0406
326057 function calls (319128 primitive calls) in 0.628 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
28/17 0.158 0.006 0.242 0.014 {built-in method
_imp.create_dynamic}
280 0.050 0.000 0.050 0.000 {built-in method marshal.loads} 2 0.043 0.021 0.043 0.021 {imread}
1287 0.025 0.000 0.025 0.000 {matchTemplate}
```
不知道為什麼行的通...但是算了
![](https://i.imgur.com/KCjfbQS.png)
### 使用python的sorted
Python的`sorted`使用名為Timsort的混合式排序演算法,使用`sorted`減少了0.0006秒的執行時間
```
0.0385->0.0379
```
```python=
# Before
def findIconId(img):
id = None
result = -1
for icon in icons.values():
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
if (result < min_val):
result = min_val
id = icon.id
return id
# After
def findIconId(img):
arr=[]
for icon in icons.values():
res = cv.matchTemplate(resized,icon.img,cv.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
arr.append((min_val, icon.id))
arr = sorted(arr, key= lambda x: x[0],reverse=True)
return arr[0][1]
```
### Multithreading
最後手段,但用了反而增加時間,不予採用。
`0.0373->0.0494 secs`
你知道 python 的 multithreading 跟你想像的不一樣嗎?
:::success
"_Each thread that wants to run must wait for the GIL to be released by the
other thread, which means your multi-threaded Python application is actually
single threaded._"
https://medium.com/practo-engineering/threading-vs-multiprocessing-in-python-7b57f224eadb
:::
![](https://i.imgur.com/ePnGiZC.png)
### 保險機制
遊戲中的過場畫面可不能拿來辨識,因此次要設計用一套方法來判斷何時該開始辨識
1. 用像素點顏色判斷白邊存在
2. 偵測白色反光,取圖示中心的點做判斷
兩項測試都通過後才會進行template matching
**valid**
> ![](https://i.imgur.com/xiSrrvv.jpg)
>
>**invalid**
> ![](https://i.imgur.com/73aqDUW.jpg)
> ![](https://i.imgur.com/u4Te7oH.jpg)
> ![](https://i.imgur.com/5e6IJ6V.jpg)
> ![](https://i.imgur.com/7PNnNHy.jpg)
> ![](https://i.imgur.com/Iwmn5de.jpg)
> ![](https://i.imgur.com/GgCjvoC.jpg)
### 辨識韻母
韻母只有一張圖要和38張圖比對,尺寸小,耗時短,不在此多著墨。
# 選取演算法
這部份沒什麼特別,目標就是最高分的圖示。以滿圖鑑為目標?不會多點幾次?
--
看不懂你在幹嘛 但好像很厲害 推一下
我做研究都沒那麼認真 跪了
你的指導教授知道你在作這種東西嗎?
跑實驗閒暇時做的
這技術用在遊戲上,我只能跪了謝謝大大造福群眾
三小= =
不好意思請教一下,你在辨識九宮格圖示部分,是使用螢
講完R
?
我今天流量夠了 該睡覺了
看起來很厲害的樣子
很好 明天來上班
三小。。
先推,免得其他人以為我看不懂
嗯嗯我也是這麼想的
偶先推
所以是螢幕辨識+按鍵精靈嗎
沒有按鍵精靈
先推,裝懂
看不懂你在幹嘛 不過你之後要去so-net?
比較想去.net折衣服
這不就外掛...
我自己手動點,不算外掛喔
科技的力量
看不懂
先推
請問可以把py檔放github嗎 想clone下來好好研究一下
糞扣公開傷眼
sonet:你要來我這裡報到了嗎
不懂,先推再說
太神啦
有沒有打算放在 github 開源
好
哇靠 文組看不懂啊
用 numba 會比較快嗎 <-出張嘴
科技始終來自人性
推 如果能找想要的押韻就更猛了
請開spec
我覺得你在做壞事 但我看不懂
姆咪
現在打電動都要這麼硬派寫實喔
.......看不懂但先跪再說
你的指導教授知道這件事嗎
這是在家搞的
這算外掛嗎XD
先推免得
上次是連點這次是小遊戲腳本 某人要高潮了嗎
泳犬小遊戲?
這跟去so-net沒一點關係,原po應該會去做影像辨識的公司吧
影像公司泊車小弟
這就是外掛啊
推
第1行不就是寫查表器了
我只是想打手槍,你給我看這個= =
我也是這麼想的
跟我想得差不多
窩不知道 你再說蛇某
現在玩公連這麼硬的嗎
太強啦
我需要git網址 為了研究
怎麼這麼多人知道git
玩公連先學影像辨識
不用學,這沒用到理論
嗯嗯 跟我當初想的一樣 謝謝付諸行動
嗯嗯跟我想的差不多
IOTA凸了木有
發錢辣
凸了墓
這山小...
嗯嗯 跟我當初想的一樣
你的got hub勒
講中文可以嗎
都蕊咪發搜
python。ai辨識
source code 呢? (敲碗
站內信
說人話
請問有哪些教授有在做upscale的嗎?滿有興趣的
大佬跑錯板了
請問paper哪裡可以找到
我需要網址,為了研究用途。
...我竟然看的懂 推有心去寫 又有心分享成果
scale前可以把邊界剪掉 外面那一圈白框對辨識沒幫助
感謝建議,但已達到可用標準,懶得再改
瑟瑟發抖
有看有推
感覺會被當外掛 還好我打玩了
求github XD
私!
你贏了...
果然等著就有神人,太猛了,求站內codeXD
太神拉 要是我會還是懶得做
電腦白痴的我 連怎樣弄和用都不知道
傻眼
爆
[心得] Leetcode 刷題解答與 Python 3 小技巧分享嗨,大家週末愉快! 不知道還記不記得之前小弟有分享面試 Google TW SWE 的心得, 最後有提到小弟當初有發願,如果順利進去要把過去寫過題目留存的解答整理分享出來, 最近終於施工完了,提供給有需要的人可以自由取用。 這份解答內涵蓋了 781 題的 Python 3 解法(太早期刷的題目就沒留解法了 QQ),62
[情報] 微軟新工作列把小圖示拖曳改順序砍掉喇最新的預覽版中 微軟更新了工作列的設計 在下方工作列 APP圖示Overflow後 現在會以三個點點的方式 呼叫出另一個選單來放置 Overflow的圖示 感謝微軟再度做出反人類操作 把這個改成往左右滑的不好嗎52
[MHR] 完全不推薦掌機模式有人試過用掌機模式遊玩MHR嗎? 掌機模式畫面ui真的很糞 左下的地圖,在掌機模式的時後 連人物的箭頭指向幾乎都看不清楚 按下L看素材分佈,圖示又小又疊在一起18
Fw: [新聞] iOS 15圖示要改回擬真設計了?這兩個icon設計透露出玄機作者: MagicMoney (魔法洗錢靈) 看板: MobileComm 標題: [新聞] iOS 15圖示要改回擬真設計了?這兩個icon設計透露出玄機 時間: Fri Apr 9 20:40:08 2021 1.原文連結:連結過長者請使用短網址。13
[問題] 三星指紋辨識&臉部辨識板眾大大午安, 請教一個困擾小弟許久的問題~ 小弟從三星S8跳到目前的S21U, 每每在螢幕解鎖的時候, 都直接出現要我「滑動解鎖」然後直接輸入數字密碼,12
Re: [心得] Switch硬體外掛完成自己的文章自己回,版主覺得不妥刪文 雖然說可能跟本版無關,比較偏向軟韌體那邊,不過還是希望找到自同道合的人 像是大陸那邊早就搞定出自動刷閃光寶可夢的腳本 自動愈怪,自動按HOME、自動辨識怪物等等等 ---已刪除連結--4
Re: [心得] 盲人購買小米12X非常後悔其實我覺得voice assistant很好用,我從S6用到S9+。 「現在的talk back雖然問題不太大 但總覺得 有點過細的功能被放到太表層了 例如在開啟後可以透過三指上下滑動來快速設定部分細節 其中包含朗讀的語言」1
Re: [問卦] 哪裡有在接案整合EXCEL生產動態報表先說我沒有想接案 按你的描述,我覺得你們的問題並不在於Excel,而是電子化+分析 電子化的部份,就是去買一台掃瞄器、一套光學辨識軟體,裝在一台規格還可以的電腦上 先把一張張的紙本都掃成電子檔, 再用光學辨識直接轉成一個個的Excel檔或其他試算表