Skip to content

Commit

Permalink
特征匹配改进
Browse files Browse the repository at this point in the history
  • Loading branch information
ZhaoZuohong committed Jul 15, 2024
1 parent 8738a9d commit 4ac35b0
Show file tree
Hide file tree
Showing 5 changed files with 447 additions and 58 deletions.
31 changes: 18 additions & 13 deletions _includes/feature-matching.html

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions _includes/feature-point.html

Large diffs are not rendered by default.

189 changes: 162 additions & 27 deletions _includes/matcher.html

Large diffs are not rendered by default.

236 changes: 236 additions & 0 deletions _includes/multi-matching.html

Large diffs are not rendered by default.

31 changes: 22 additions & 9 deletions dev/feature-matching.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ sort: 5

## 特征与特征点

`arknights_mower.utils.matcher` 中的 `ORB` 可用于提取特征点。
`arknights_mower.utils.matcher` 中提供 `keypoints()``keypoints_scale_invariant()` 函数,可用于提取特征点。接受的参数为需要提取特征点的灰度图像。返回值为特征点元组与描述子矩阵构成的元组

一般而言,在图像中,拐角、复杂的图案与纹理(包括文字)处可以提取到较多的特征点;在空白处,很难或无法提取到特征点。从复杂的图像中可以提取到更多的特征点。
`keypoints_scale_invariant()` 提取的特征点与描述子具有尺度不变性,可用于匹配尺度不确定或发生变化的图像,但速度相较 `keypoints()` 更慢。

拐角、复杂的图案与纹理(包括文字)处可以提取到较多的特征点;在空白处很难提取到特征点。

<details>
<summary>使用示例</summary>
Expand All @@ -21,9 +23,9 @@ sort: 5

`arknights_mower.utils.matcher` 中的 `flann` 可用于匹配特征点。

对于目标图像中的每个特征点 $A$,使用 `flann.knnMatch(k=2)`找出截图中与之距离最近的和第二近的两个特征点 $B_1$、$B_2$. 如果 $A$ 与 $B_1$ 的距离 $\text{d}(A, B_1)$ 和 $A$ 与 $B_2$ 的距离 $\text{d}(A, B_2)$ 的比值小于 `GOOD_DISTANCE_LIMIT`,就认为 $A$ 与 $B_1$ 是一对“好”的匹配。
对于目标图像中的每个特征点 $A$,使用 `flann.knnMatch(k=2)` 找出截图中与之距离最近的和第二近的两个特征点 $B_1$、$B_2$. 如果 $A$ 与 $B_1$ 的距离 $\text{d}(A, B_1)$ 和 $A$ 与 $B_2$ 的距离 $\text{d}(A, B_2)$ 的比值 $\frac{\text{d}(A, B_1)}{\text{d}(A, B_2)} <$ `GOOD_DISTANCE_LIMIT`,就认为 $A$ 与 $B_1$ 是一对“好”的匹配。

下面的例子展示了如何利用特征匹配在终端页面定位活动入口。
下面的例子展示了如何利用特征匹配在终端页面定位活动入口。其中 `res` 图像来自明日方舟网站,尺寸与游戏内截图未必一致,因此对于 `res` 使用 `keypoints_scale_invariant()` 提取特征点。对于截图,使用 `keypoints()` 提取特征点,仍然可以得到很好的匹配结果。

<details>
<summary>使用示例</summary>
Expand All @@ -40,10 +42,10 @@ sort: 5

- `query`:灰度目标图像;
- `draw`:控制是否绘制并显示匹配过程;
- `scope``origin` 的特征点中,在此区域内的特征点参与匹配;
- `dpi_aware`大部分元素的尺寸不变,`dpi_aware` 默认为 `False`,若匹配结果与目标图像的尺寸相差较大时拒绝结果。对于尺寸有变化的元素,将此选项设置为 `True`
- `prescore`:SSIM 分数阈值。如果此参数为正,则根据 SSIM 分数决定是否接受匹配结果
- `judge`:在 `prescore` 为 0 时生效。如果为 `True`则使用支持向量机判断是否接受匹配结果,否则直接接受匹配结果。
- `scope``origin` 在此区域内的特征点参与匹配;
- `dpi_aware`匹配尺寸不确定,或尺寸有变化的目标图像时,将此选项设置为 `True`默认为 `False`
- `prescore`:SSIM 分数阈值。如果此参数为正值,则根据 SSIM 分数直接决定是否接受匹配结果
- `judge`:在 `prescore` 为 0 时生效。如果为 `True`使用支持向量机判断是否接受匹配结果,否则直接接受匹配结果。

如果匹配成功,`match()` 返回目标图片在截图中匹配到的区域;否则返回 `None`

Expand All @@ -56,7 +58,7 @@ sort: 5

### 性能

从截图提取特征点一般会花费数十毫秒,一次 FLANN 匹配也会花费十几毫秒到几十毫秒。大量使用特征匹配会导致脚本很慢。
从截图提取特征点一般会花费数十毫秒,一次 FLANN 匹配也可能花费几毫秒到几十毫秒。大量使用特征匹配会导致脚本很慢。

### 目标图像截取

Expand All @@ -65,3 +67,14 @@ sort: 5
### 随机性

FLANN 和 RANSAC 算法具有一定的随机性。若结果变化较大,可考虑重新截取目标图像,或换用其它匹配方式。

### 多目标

当目标图像在截图中多次出现时,目标图像的特征点与截图对应特征点的若干对匹配距离相近。在应用比例测试筛选特征点时,这些匹配都会被过滤掉,导致目标图像多次出现时无法匹配到结果。

如果要处理目标多次出现的情况,如果能够预知出现的范围,可以指定 `scope` 参数进行限制。

<details>
<summary>查看例子</summary>
{% include multi-matching.html %}
</details>

0 comments on commit 4ac35b0

Please sign in to comment.