前言
之前有针对图片的模板匹配有做了一个优化的版本: 使用 gocv 进行图片的模板匹配优化之 - 批量多模板匹配, 但是还不够,还需要再优化两个点:
- 直接从 origin 文件夹里面读取原图,从 template 文件夹里面读取模板图,随后如果有匹配的话,将匹配圈出来的原图输出到 output 文件夹
- 配置是否启用同步缩放匹配 (好处就是匹配速度很快, 坏处就是如果模板图信息太少的话,会出现匹配度太低的情况)
第一点优化很好理解,如果 原图很多, 模板图也很多的话, 肯定要变成直接读取,然后遍历文件夹的方式, 匹配结束之后,如果有匹配上,然后统一输出到另一个文件夹中
第二点是考虑到如果原图 size 很大,匹配的过程就会很耗费 cpu,而且时间会比较长。 所以可以设置缩放因子,将原图和模板图按照固定的比例进行缩放, 然后再匹配。 这样子做的好处就是因为双方的像素点变少了,所以匹配的速度就会很快, 坏处就是如果模板图的可识别区域比较少,再加上压缩之后,就会出现匹配度太低,导致我们认为无法 match 的情况。
所以最好模板图的尺寸不能低于 30px。 而且缩放的比例也不能高于 0.5, 这样子速度才会快。
实操
采取一批原图放到 images/origin
文件夹
然后放一批模板图放到 images/template
文件夹
接下来就是代码
1 | package main |
注意我们是通过 UseScale
来判断是否要采用缩放因子的方式来测试。
而且需要注意一点的是,这一批原图 和 模板图都是只有 GRB 三个通道的,而不是正常的那种 RGBA 四个通道的, 所以读取图片的时候,要指定读取的是 RGB 三个通道的, 也就是第二个参数要指定好, 不然会有问题1
imgTemplate := gocv.IMRead(templateUri, gocv.IMReadColor)
测试1 -> 不缩放
也就是 UseScale = false
因为日志比较长,我就只取一个看看:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19----start match: images/origin/SSS-1041_ScreenShot_20210521_2.png
Template: images/template/1.jpg -> max confidence 0.225314, 241, 211
Template: images/template/1.jpg -> Max confidence of 0.225314 is too low. Not match
Template: images/template/2.jpg -> max confidence 0.343062, 213, 683
Template: images/template/2.jpg -> Max confidence of 0.343062 is too low. Not match
Template: images/template/3.jpg -> max confidence 0.351453, 220, 167
Template: images/template/3.jpg -> Max confidence of 0.351453 is too low. Not match
Template: images/template/4.end.jpg -> max confidence 0.336641, 428, 77
Template: images/template/4.end.jpg -> Max confidence of 0.336641 is too low. Not match
Template: images/template/5.end.jpg -> max confidence 0.452431, 326, 342
Template: images/template/5.end.jpg -> Max confidence of 0.452431 is too low. Not match
Template: images/template/6.end.jpg -> max confidence 0.941337, 416, 84
Template: images/template/6.end.jpg -> Max confidence of 0.941337 is high. Match !!!
is match, scale: 1
Template: images/template/7.end.jpg -> max confidence 0.410051, 217, 666
Template: images/template/7.end.jpg -> Max confidence of 0.410051 is too low. Not match
Template: images/template/8.end.jpg -> max confidence 0.329708, 195, 162
Template: images/template/8.end.jpg -> Max confidence of 0.329708 is too low. Not match
----end match images/origin/SSS-1041_ScreenShot_20210521_2.png, use 2006 ms, match count: 1
平均下来,在不缩放的情况下, 一张原图要匹配 8 张模板图的情况, 要花 2s 左右。 最后能匹配到的图有 15 张
测试2 -> 有缩放
也就是 UseScale = true
有缩放之后,明显执行就快多了,截取同一个1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27----start match: images/origin/SSS-1041_ScreenShot_20210521_2.png
scale: 0.07142857142857142, 0.06818181818181818, 0.07142857142857142, 440, 420
Template: images/template/1.jpg -> max confidence 0.236107, 17, 15
Template: images/template/1.jpg -> Max confidence of 0.236107 is too low. Not match
scale: 0.5, 0.13513513513513514, 0.6818181818181818, 222, 44
Template: images/template/2.jpg -> max confidence 0.363811, 107, 342
Template: images/template/2.jpg -> Max confidence of 0.363811 is too low. Not match
scale: 0.5, 0.17045454545454544, 0.5882352941176471, 176, 51
Template: images/template/3.jpg -> max confidence 0.366116, 110, 84
Template: images/template/3.jpg -> Max confidence of 0.366116 is too low. Not match
scale: 0.5, 0.1271186440677966, 0.5555555555555556, 236, 54
Template: images/template/4.end.jpg -> max confidence 0.362354, 214, 38
Template: images/template/4.end.jpg -> Max confidence of 0.362354 is too low. Not match
scale: 0.12552301255230125, 0.12552301255230125, 0.10238907849829351, 239, 293
Template: images/template/5.end.jpg -> max confidence 0.457758, 40, 43
Template: images/template/5.end.jpg -> Max confidence of 0.457758 is too low. Not match
scale: 0.5, 0.17857142857142858, 0.8108108108108109, 168, 37
Template: images/template/6.end.jpg -> max confidence 0.914187, 208, 42
Template: images/template/6.end.jpg -> Max confidence of 0.914187 is high. Match !!!
is match, scale: 0.5
scale: 0.2542372881355932, 0.15873015873015872, 0.2542372881355932, 189, 118
Template: images/template/7.end.jpg -> max confidence 0.425736, 55, 169
Template: images/template/7.end.jpg -> Max confidence of 0.425736 is too low. Not match
scale: 0.5, 0.0949367088607595, 0.5, 316, 60
Template: images/template/8.end.jpg -> max confidence 0.353062, 98, 81
Template: images/template/8.end.jpg -> Max confidence of 0.353062 is too low. Not match
----end match images/origin/SSS-1041_ScreenShot_20210521_2.png, use 361 ms, match count: 1
可以看到缩放之后,速度就很快了, 360 ms, 快了 6 倍。 不过可以看到原本不缩放的 match 点的匹配度是 94, 缩放后虽然也匹配上了,但是匹配度只有 91。 所以是有可能是会出现原图可以匹配上,但是缩放之后,就匹配不上了。上图的缩放比例是 0.5, 如果缩放比例更小的话, 这种概率更大。
事实上也是如此, 有缩放之后的匹配图, 其实只有 11 张
有四张本来原图可以匹配上的, 但是缩放之后,匹配度达不到 80 了,所以就算没有匹配了。 我们可以找一张看下数据:1
2
3
4
5
6
7----start match: images/origin/1622309716082.jpg.jpg
...
Template: images/template/2.jpg -> max confidence 0.975171, 503, 67
Template: images/template/2.jpg -> Max confidence of 0.975171 is high. Match !!!
is match, scale: 1
...
----end match images/origin/1622309716082.jpg.jpg, use 2082 ms, match count: 1
1 | ----start match: images/origin/1622309716082.jpg.jpg |
可以看到原图是 97 的匹配度,缩放之后,只剩下 78 的匹配度了。 也就不算匹配上了。 (程序要大于等于 80 才算匹配上)
结论
缩放因子虽然运行速度会比较快,但是如果模板可识别因子太少的话,就会出现匹配度太低的情况,所以尽可能让模板图片有更多明显的标志物, 而且也不能尺寸太小。