觉得小游戏查表好麻烦,做了一个查表器
附上人权
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 %)