ms-vite-plugin 1.4.47 → 1.4.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build.js +1 -292
- package/dist/cli.js +6 -1234
- package/dist/mcp/device-config.d.ts +0 -47
- package/dist/mcp/device-config.js +1 -183
- package/dist/mcp/device-log.d.ts +0 -8
- package/dist/mcp/device-log.js +3 -27
- package/dist/mcp/doc-tools.d.ts +0 -7
- package/dist/mcp/doc-tools.js +2 -39
- package/dist/mcp/docs-service.d.ts +0 -13
- package/dist/mcp/docs-service.js +1 -63
- package/dist/mcp/httpapi-docs-service.d.ts +0 -31
- package/dist/mcp/httpapi-docs-service.js +1 -122
- package/dist/mcp/httpapi-tools.d.ts +0 -7
- package/dist/mcp/httpapi-tools.js +4 -222
- package/dist/mcp/image-tools.d.ts +0 -62
- package/dist/mcp/image-tools.js +8 -607
- package/dist/mcp/ocr-tools.d.ts +0 -25
- package/dist/mcp/ocr-tools.js +5 -413
- package/dist/mcp/project.d.ts +0 -14
- package/dist/mcp/project.js +1 -74
- package/dist/mcp/runtime-tools.d.ts +0 -7
- package/dist/mcp/runtime-tools.js +11 -308
- package/dist/mcp/tool-utils.d.ts +0 -40
- package/dist/mcp/tool-utils.js +1 -81
- package/dist/mcp/tools.d.ts +0 -12
- package/dist/mcp/tools.js +1 -31
- package/dist/mcp/types.d.ts +0 -12
- package/dist/mcp/types.js +1 -11
- package/dist/mcp-server.js +1 -85
- package/dist/packager.d.ts +0 -7
- package/dist/packager.js +1 -125
- package/dist/project.d.ts +0 -61
- package/dist/project.js +1 -619
- package/dist/stopGuardPlugin.d.ts +0 -6
- package/dist/stopGuardPlugin.js +1 -165
- package/dist/version.d.ts +0 -10
- package/dist/version.js +1 -63
- package/dist/ws-manager.d.ts +0 -95
- package/dist/ws-manager.js +1 -392
- package/docs/api/image.md +249 -25
- package/docs/apicn/image.md +245 -19
- package/docs/apipython/image.md +238 -18
- package/package.json +3 -2
package/docs/api/image.md
CHANGED
|
@@ -488,6 +488,8 @@ if (imageId) {
|
|
|
488
488
|
|
|
489
489
|
### findImage - 找图
|
|
490
490
|
|
|
491
|
+
在大图(通常是屏幕截图)中查找小图(模板)。支持多种匹配算法,可按 `|` 同时传入多个模板。
|
|
492
|
+
|
|
491
493
|
```typescript
|
|
492
494
|
function findImage(
|
|
493
495
|
imageId: string,
|
|
@@ -504,7 +506,7 @@ function findImage(
|
|
|
504
506
|
scaleFactors?: number[];
|
|
505
507
|
},
|
|
506
508
|
): {
|
|
507
|
-
index: number; //
|
|
509
|
+
index: number; // 模板图片索引,从 0 开始
|
|
508
510
|
x: number;
|
|
509
511
|
y: number;
|
|
510
512
|
width: number;
|
|
@@ -514,55 +516,277 @@ function findImage(
|
|
|
514
516
|
ey: number;
|
|
515
517
|
centerX: number;
|
|
516
518
|
centerY: number;
|
|
519
|
+
scaleX?: number; // 仅 method=99 返回:命中时模板的横向缩放比例
|
|
520
|
+
scaleY?: number; // 仅 method=99 返回:命中时模板的纵向缩放比例
|
|
517
521
|
}[];
|
|
518
522
|
```
|
|
519
523
|
|
|
520
524
|
**参数:**
|
|
521
525
|
|
|
522
|
-
| 参数名 | 类型 | 是否必填 | 默认值 | 描述
|
|
523
|
-
| ---------------------- | --------- | -------- | --------------------------- |
|
|
524
|
-
| `imageId` | string | 是 | - | `"screen"`-当前屏幕截图, `string`-图片文件路径或 URL ,`imageId`-图片 ID(通过 image 模块获取)
|
|
525
|
-
| `templateImageId` | string | 是 | - | `"screen"`-当前屏幕截图, `string`-图片文件路径或 URL ,`imageId`-图片 ID(通过 image 模块获取)支持按\|分割,多个图片按顺序查找
|
|
526
|
-
| `x, y` | number | 是 | - | 搜索区域左上角坐标
|
|
527
|
-
| `ex, ey` | number | 是 | - |
|
|
528
|
-
| `threshold` | number | 是 | - | 匹配阈值 (0.0-1.0)
|
|
529
|
-
| `limit` | number | 是 | - | 最大查找数量,每个模板图片最多找 limit 个匹配结果
|
|
530
|
-
| `method` | number | 是 | - |
|
|
531
|
-
| `rgb` | boolean | 否 | `false` | 是否使用 RGB 找图,默认 `false` 会自动转灰度找图
|
|
532
|
-
| `options` | object | 否 | - |
|
|
533
|
-
| `options.scaleFactors` | number\[] | 否 | `[1.0, 0.9, 1.1, 0.8, 1.2]` |
|
|
526
|
+
| 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
|
|
527
|
+
| ---------------------- | --------- | -------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
|
|
528
|
+
| `imageId` | string | 是 | - | `"screen"`-当前屏幕截图, `string`-图片文件路径或 URL ,`imageId`-图片 ID(通过 image 模块获取) |
|
|
529
|
+
| `templateImageId` | string | 是 | - | `"screen"`-当前屏幕截图, `string`-图片文件路径或 URL ,`imageId`-图片 ID(通过 image 模块获取)支持按\|分割,多个图片按顺序查找 |
|
|
530
|
+
| `x, y` | number | 是 | - | 搜索区域左上角坐标 |
|
|
531
|
+
| `ex, ey` | number | 是 | - | 搜索区域右下角坐标;传 `0` 表示延伸到图片右侧或底部边界 |
|
|
532
|
+
| `threshold` | number | 是 | - | 匹配阈值 (0.0-1.0)。method `0`/`99` 建议 `0.5`–`0.6`;普通模板匹配(`1`/`3`/`5`)建议 `0.9`–`0.995` |
|
|
533
|
+
| `limit` | number | 是 | - | 最大查找数量,每个模板图片最多找 limit 个匹配结果 |
|
|
534
|
+
| `method` | number | 是 | - | 匹配方法,见下方说明 |
|
|
535
|
+
| `rgb` | boolean | 否 | `false` | 是否使用 RGB 找图,默认 `false` 会自动转灰度找图 |
|
|
536
|
+
| `options` | object | 否 | - | 额外选项,目前仅 method=`99` 时生效 |
|
|
537
|
+
| `options.scaleFactors` | number\[] | 否 | `[1.0, 0.9, 1.1, 0.8, 1.2]` | 仅 method=`99` 生效。模板相对当前图的缩放比列表(**不是** `device.getScreenScale()`)。应按 baseScale 动态计算,见下方详解;默认值只适合尺寸接近时的盲扫 |
|
|
538
|
+
|
|
539
|
+
#### method 匹配方法说明
|
|
540
|
+
|
|
541
|
+
| method | 名称 | 原理简述 | 适用场景 | 速度 |
|
|
542
|
+
| ------ | ---------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------ | -------- |
|
|
543
|
+
| `5` | TM_CCOEFF_NORMED | 标准模板匹配(归一化相关系数),模板必须与目标**像素尺寸一致** | 同分辨率、同尺寸截图模板,最常用 | 快 |
|
|
544
|
+
| `3` | TM_CCORR_NORMED | 标准模板匹配(归一化相关) | 同尺寸模板;PNG 透明模板带 mask 时内部会优先用它 | 快 |
|
|
545
|
+
| `1` | TM_SQDIFF_NORMED | 标准模板匹配(归一化平方差),分数越小越像,引擎已换算为越大越像 | 同尺寸模板 | 快 |
|
|
546
|
+
| `0` | SIFT 全分辨率 | 提取 SIFT 特征点做匹配,对旋转、轻微形变更鲁棒,不要求模板与目标同尺寸 | 目标可能旋转/形变,或跨分辨率找图 | 较慢 |
|
|
547
|
+
| `99` | 全分辨率缩放匹配法 | 把**模板**按多个比例缩放后,再做 `TM_CCOEFF_NORMED` 模板匹配(有透明通道时用 `TM_CCORR_NORMED`) | 目标与模板尺寸不完全一致,但形状相同 | 中等偏慢 |
|
|
548
|
+
|
|
549
|
+
#### 什么是「缩放」全分辨率找图(method = 99)
|
|
550
|
+
|
|
551
|
+
这里的「缩放」**不是**把屏幕截图缩小,也**不是**设备显示缩放(`device.getScreenScale()`),而是:
|
|
552
|
+
|
|
553
|
+
> 在匹配前,把**模板小图**按 `scaleFactors` 里的比例逐个放大/缩小,再与**原尺寸**搜索区域做模板匹配。
|
|
554
|
+
|
|
555
|
+
- `factor = 1.0`:模板保持原像素尺寸去匹配
|
|
556
|
+
- `factor < 1.0`:先把模板缩小再匹配(当前屏幕上的目标比模板更小)
|
|
557
|
+
- `factor > 1.0`:先把模板放大再匹配(当前屏幕上的目标比模板更大)
|
|
558
|
+
|
|
559
|
+
引擎内部是 `Imgproc.resize(template, fx=factor, fy=factor)`,**横向、纵向使用同一个比例**(等比缩放)。
|
|
560
|
+
返回结果里的 `width` / `height` 是缩放后的模板尺寸,`scaleX` / `scaleY` 是本次命中用到的比例。
|
|
561
|
+
|
|
562
|
+
工作流程:
|
|
563
|
+
|
|
564
|
+
1. 读取搜索区域(大图)和模板(小图),默认转灰度(`rgb=true` 时保留彩色)。
|
|
565
|
+
2. 按 `scaleFactors` **数组顺序**,对模板执行等比缩放。
|
|
566
|
+
3. 若缩放后的模板比搜索区域还大,跳过该比例。
|
|
567
|
+
4. 用缩放后的模板做 `TM_CCOEFF_NORMED` 匹配(透明 PNG 用 `TM_CCORR_NORMED` + alpha mask)。
|
|
568
|
+
5. 收集 `confidence >= threshold` 的命中;重叠区域去重,保留置信度更高者。
|
|
569
|
+
6. 找满 `limit` 个后提前结束——所以**更可能命中的比例要放前面**。
|
|
570
|
+
|
|
571
|
+
#### 如何选择 `scaleFactors`(重点)
|
|
572
|
+
|
|
573
|
+
`scaleFactors` 不是随便填几个小数,而是回答这个问题:
|
|
574
|
+
|
|
575
|
+
> 「模板图里的目标,到当前屏幕上会变成原来的几倍宽/高?」
|
|
576
|
+
|
|
577
|
+
##### 1. 先算「目标比例」baseScale
|
|
578
|
+
|
|
579
|
+
UI 随分辨率等比变化时(大多数 App / 游戏界面):
|
|
580
|
+
|
|
581
|
+
```text
|
|
582
|
+
baseScale = 当前设备逻辑宽 / 截取模板时设备的逻辑宽
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
也可用高:
|
|
586
|
+
|
|
587
|
+
```text
|
|
588
|
+
baseScale = 当前设备逻辑高 / 截取模板时设备的逻辑高
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
宽高比一致时两者相同;不一致时优先用**与布局更相关的那条边**(竖屏 App 常用高,横屏游戏常用宽),或取两者平均。
|
|
592
|
+
|
|
593
|
+
这里的「逻辑宽高」请用找图坐标系对应的尺寸,一般是 `device.getScreenRealSize()`(实际像素分辨率)。
|
|
594
|
+
**不要**把 `device.getScreenScale()`(屏幕 scale 因子)直接当成 `scaleFactors` 里的值——两者不是一回事。
|
|
595
|
+
|
|
596
|
+
若你确切知道模板像素尺寸和屏幕上目标像素尺寸,也可以直接:
|
|
597
|
+
|
|
598
|
+
```text
|
|
599
|
+
baseScale = 屏幕上目标宽度(px) / 模板宽度(px)
|
|
600
|
+
// 或
|
|
601
|
+
baseScale = 屏幕上目标高度(px) / 模板高度(px)
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
**数值例子:**
|
|
605
|
+
|
|
606
|
+
| 截模板设备 | 当前运行设备 | 计算 | baseScale |
|
|
607
|
+
| -------------- | -------------- | ---------------------------- | --------- |
|
|
608
|
+
| iPhone 8 750px | 同机 | 750 / 750 | `1.0` |
|
|
609
|
+
| 750 宽 | 1170 宽 | 1170 / 750 | `1.56` |
|
|
610
|
+
| 1170 宽 | 750 宽 | 750 / 1170 | `0.641` |
|
|
611
|
+
| 1080 宽安卓 | 1440 宽安卓 | 1440 / 1080 | `1.333` |
|
|
612
|
+
| 模板按钮 120px | 屏上按钮 96px | 96 / 120 | `0.8` |
|
|
613
|
+
|
|
614
|
+
含义对照:
|
|
615
|
+
|
|
616
|
+
| baseScale | 含义 | 引擎会对模板做什么 |
|
|
617
|
+
| --------- | ------------------------------------------ | ----------------------- |
|
|
618
|
+
| `1.0` | 当前目标与模板同尺寸 | 不缩放 |
|
|
619
|
+
| `0.64` | 当前目标大约是模板的 64%(高分屏模板跑低分) | 缩到 64% 再匹配 |
|
|
620
|
+
| `1.56` | 当前目标大约是模板的 156%(低分屏模板跑高分) | 放大到 156% 再匹配 |
|
|
621
|
+
|
|
622
|
+
##### 2. 再围绕 baseScale 生成搜索列表
|
|
623
|
+
|
|
624
|
+
真实设备上还会有状态栏、安全区、App 缩放、截图工具裁切误差等,baseScale 很少绝对精确,所以要在 baseScale **附近扫一小段**:
|
|
625
|
+
|
|
626
|
+
```text
|
|
627
|
+
scaleFactors ≈ [ baseScale,
|
|
628
|
+
baseScale ± step,
|
|
629
|
+
baseScale ± 2*step,
|
|
630
|
+
... ]
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
推荐参数:
|
|
634
|
+
|
|
635
|
+
| 项目 | 建议 | 原因 |
|
|
636
|
+
| -------------- | ----------------------------------------- | ---- |
|
|
637
|
+
| 中心值 | 算出来的 `baseScale` | 最可能命中,必须放第一位 |
|
|
638
|
+
| 步进 `step` | `0.05`~`0.1` | 太疏容易跳过真实尺寸;太密浪费时间 |
|
|
639
|
+
| 半宽度 | `±0.1`~`±0.2`(约 ±10%~20%) | 覆盖状态栏/安全区/轻微布局差 |
|
|
640
|
+
| 总档数 | 3~7 个 | 每多一档就多跑一轮全图模板匹配 |
|
|
641
|
+
| 阈值 threshold | `0.5`~`0.6` 起调 | 缩放插值会降低相关分数,别用 0.9+ |
|
|
642
|
+
| 顺序 | **baseScale 最先**,再左右交替扩开 | 找满 limit 会提前结束 |
|
|
643
|
+
|
|
644
|
+
生成示例(伪代码思路):
|
|
645
|
+
|
|
646
|
+
```javascript
|
|
647
|
+
// 截模板时的设备宽(写进脚本配置,或写在模板文件名里)
|
|
648
|
+
const templateDeviceWidth = 750;
|
|
649
|
+
// 当前设备实际宽
|
|
650
|
+
const currentWidth = device.getScreenRealSize().width;
|
|
651
|
+
const baseScale = currentWidth / templateDeviceWidth;
|
|
652
|
+
|
|
653
|
+
// 围绕 baseScale,步进 0.05,左右各扩 2 档 → 共 5 个
|
|
654
|
+
function buildScaleFactors(base, step = 0.05, halfRange = 2) {
|
|
655
|
+
const list = [Number(base.toFixed(4))];
|
|
656
|
+
for (let i = 1; i <= halfRange; i++) {
|
|
657
|
+
list.push(Number((base - step * i).toFixed(4)));
|
|
658
|
+
list.push(Number((base + step * i).toFixed(4)));
|
|
659
|
+
}
|
|
660
|
+
// 过滤掉无意义的比例
|
|
661
|
+
return list.filter((s) => s > 0.05 && s < 8);
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
const scaleFactors = buildScaleFactors(baseScale);
|
|
665
|
+
// 例如 baseScale=1.56, step=0.05, halfRange=2
|
|
666
|
+
// → [1.56, 1.51, 1.61, 1.46, 1.66]
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
##### 3. 按场景怎么选
|
|
670
|
+
|
|
671
|
+
| 场景 | 怎么设 `scaleFactors` | threshold |
|
|
672
|
+
| ---- | --------------------- | --------- |
|
|
673
|
+
| 模板就是本机截的,尺寸确定一致 | 不必用 99,直接 method `5`;若坚持用 99 则 `[1.0]` | `0.9+` / `0.55` |
|
|
674
|
+
| 已知截图机型与当前机型分辨率 | 算 `baseScale`,再 `±0.05`~`±0.1` 扩 3~5 档 | `0.5`~`0.6` |
|
|
675
|
+
| 多机型跑同一套模板,分辨率跨度大 | 按每台设备运行时动态算 baseScale,不要写死默认那组 | `0.5`~`0.6` |
|
|
676
|
+
| 完全不知道模板来源分辨率 | 先用 method `0`(SIFT);或宽范围粗扫(慢,如 0.5~2.0 步进 0.1) | `0.5` 左右 |
|
|
677
|
+
| 只要微调(系统字体/显示缩放导致差几像素) | `[1.0, 0.95, 1.05, 0.9, 1.1]` | `0.55`~`0.65` |
|
|
678
|
+
| 横竖屏切换 / 目标会旋转 | method `99` **不够**,改用 method `0` SIFT | `0.5`~`0.6` |
|
|
679
|
+
|
|
680
|
+
默认值 `[1.0, 0.9, 1.1, 0.8, 1.2]` 的定位:
|
|
681
|
+
|
|
682
|
+
- 假设「模板大致接近当前尺寸」,在 80%~120% 之间盲扫
|
|
683
|
+
- **只适合尺寸差不大的兜底**,不适合 750 ↔ 1170 这种跨度(baseScale≈1.56,默认列表根本扫不到)
|
|
684
|
+
- 生产脚本应**按设备算 baseScale**,不要依赖这组默认值硬扛跨分辨率
|
|
685
|
+
|
|
686
|
+
##### 4. 常见误区
|
|
687
|
+
|
|
688
|
+
1. **把 `device.getScreenScale()` 填进 scaleFactors**
|
|
689
|
+
`getScreenScale()` 是屏幕 scale(如 2x/3x 显示倍率),不是「模板相对当前图」的缩放比。
|
|
690
|
+
|
|
691
|
+
2. **跨大分辨率仍用默认 `[1.0, 0.9, 1.1, 0.8, 1.2]`**
|
|
692
|
+
真实 baseScale 在 1.5 时,默认列表全军覆没。
|
|
693
|
+
|
|
694
|
+
3. **threshold 仍用 0.9**
|
|
695
|
+
resize 插值会损失细节,method `99` 相关分通常明显低于同尺寸 method `5`,建议从 `0.55` 左右调。
|
|
696
|
+
|
|
697
|
+
4. **档位又多又密**
|
|
698
|
+
全屏 × 10 个 factor ≈ 10 次模板匹配,卡顿明显。先算准 baseScale,再小范围扩。
|
|
699
|
+
|
|
700
|
+
5. **模板含大量透明/JPEG 压缩噪点**
|
|
701
|
+
缩放后更易误匹配;优先 PNG 透明模板,并尽量裁紧目标外轮廓。
|
|
702
|
+
|
|
703
|
+
6. **搜索区域小于放大后的模板**
|
|
704
|
+
该 factor 会被跳过。放大场景请保证 ROI 足够大,或全屏搜。
|
|
705
|
+
|
|
706
|
+
##### 5. 与 method `0`(SIFT)怎么选
|
|
707
|
+
|
|
708
|
+
| | method `99` 缩放匹配 | method `0` SIFT |
|
|
709
|
+
| -------------- | ---------------------------------- | ---------------------------------- |
|
|
710
|
+
| 尺寸变化 | 支持(靠你提供的比例穷举) | 支持(特征点,不靠固定比例) |
|
|
711
|
+
| 你需要知道比例 | 最好先算 baseScale | 不需要 |
|
|
712
|
+
| 旋转 / 形变 | 基本不支持 | 较鲁棒 |
|
|
713
|
+
| 阈值建议 | `0.5`–`0.6` | `0.5`–`0.6` |
|
|
714
|
+
| 透明 PNG 模板 | 支持(alpha 作权重 mask) | 支持(alpha 作特征掩码) |
|
|
715
|
+
| 性能 | 与 factor 数量近似成正比,通常更快 | 特征提取重,通常更慢 |
|
|
716
|
+
| 推荐 | 比例可估算的跨分辨率找图 | 比例未知、或有旋转/透视时 |
|
|
534
717
|
|
|
535
718
|
**返回值:**
|
|
536
719
|
|
|
537
|
-
| 类型 | 描述
|
|
538
|
-
| ------- |
|
|
539
|
-
| `array` |
|
|
720
|
+
| 类型 | 描述 |
|
|
721
|
+
| ------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
|
722
|
+
| `array` | 匹配结果数组。`index` 为模板在 `templateImageId` 中的索引(从 0 开始)。method=`99` 时额外包含 `scaleX`、`scaleY`(本次命中使用的缩放比) |
|
|
540
723
|
|
|
541
724
|
**示例:**
|
|
542
725
|
|
|
543
726
|
```javascript
|
|
727
|
+
// 1) 同分辨率标准找图(最常用,模板就是本机截的)
|
|
544
728
|
const matches = image.findImage(
|
|
545
729
|
"screen",
|
|
546
730
|
"template.jpg|template2.jpg",
|
|
547
731
|
0,
|
|
548
732
|
0,
|
|
549
733
|
400,
|
|
550
|
-
800,
|
|
551
|
-
0.
|
|
552
|
-
3,
|
|
553
|
-
5, //
|
|
554
|
-
false,
|
|
734
|
+
800,
|
|
735
|
+
0.9,
|
|
736
|
+
3,
|
|
737
|
+
5, // TM_CCOEFF_NORMED
|
|
738
|
+
false,
|
|
555
739
|
);
|
|
556
740
|
|
|
557
741
|
if (matches.length > 0) {
|
|
558
742
|
const best = matches[0];
|
|
559
743
|
logi(`找到匹配,置信度: ${best.confidence}`);
|
|
744
|
+
action.click(best.centerX, best.centerY, 100, false);
|
|
745
|
+
}
|
|
560
746
|
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
747
|
+
// 2) 缩放全分辨率找图:按「截模板设备宽 / 当前设备宽」计算比例
|
|
748
|
+
// 假设模板是在宽度 750 的设备上截的
|
|
749
|
+
const templateDeviceWidth = 750;
|
|
750
|
+
const currentWidth = device.getScreenRealSize().width;
|
|
751
|
+
const baseScale = currentWidth / templateDeviceWidth;
|
|
752
|
+
|
|
753
|
+
function buildScaleFactors(base, step = 0.05, halfRange = 2) {
|
|
754
|
+
const list = [Number(base.toFixed(4))];
|
|
755
|
+
for (let i = 1; i <= halfRange; i++) {
|
|
756
|
+
list.push(Number((base - step * i).toFixed(4)));
|
|
757
|
+
list.push(Number((base + step * i).toFixed(4)));
|
|
758
|
+
}
|
|
759
|
+
return list.filter((s) => s > 0.05 && s < 8);
|
|
565
760
|
}
|
|
761
|
+
|
|
762
|
+
const scaleFactors = buildScaleFactors(baseScale);
|
|
763
|
+
// 750 → 1170 时约等于 [1.56, 1.51, 1.61, 1.46, 1.66]
|
|
764
|
+
logi(`baseScale=${baseScale.toFixed(3)} scaleFactors=${JSON.stringify(scaleFactors)}`);
|
|
765
|
+
|
|
766
|
+
const scaled = image.findImage(
|
|
767
|
+
"screen",
|
|
768
|
+
"btn_start.png",
|
|
769
|
+
0,
|
|
770
|
+
0,
|
|
771
|
+
0,
|
|
772
|
+
0, // 全屏;放大模板时 ROI 太小会被跳过
|
|
773
|
+
0.55, // 多尺度建议 0.5-0.6,不要用 0.9
|
|
774
|
+
1,
|
|
775
|
+
99,
|
|
776
|
+
false,
|
|
777
|
+
{ scaleFactors },
|
|
778
|
+
);
|
|
779
|
+
|
|
780
|
+
if (scaled.length > 0) {
|
|
781
|
+
const hit = scaled[0];
|
|
782
|
+
logi(
|
|
783
|
+
`命中 scale=${hit.scaleX} 尺寸=${hit.width}x${hit.height} 置信度=${hit.confidence}`,
|
|
784
|
+
);
|
|
785
|
+
action.click(hit.centerX, hit.centerY, 100, false);
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
// 3) 已知模板宽和屏幕目标大概宽时,直接用像素比
|
|
789
|
+
// const baseScale = expectedTargetWidthPx / templateWidthPx;
|
|
566
790
|
```
|
|
567
791
|
|
|
568
792
|
## 图像处理
|
package/docs/apicn/image.md
CHANGED
|
@@ -495,6 +495,8 @@ if (图片ID) {
|
|
|
495
495
|
|
|
496
496
|
### 找图 - 在图片中查找模板图片。
|
|
497
497
|
|
|
498
|
+
在大图(通常是屏幕截图)中查找小图(模板)。支持多种匹配算法,可按 `|` 同时传入多个模板。
|
|
499
|
+
|
|
498
500
|
```typescript
|
|
499
501
|
function 找图(
|
|
500
502
|
图片ID: 字符串,
|
|
@@ -511,7 +513,7 @@ function 找图(
|
|
|
511
513
|
scaleFactors?: 数字[];
|
|
512
514
|
},
|
|
513
515
|
): {
|
|
514
|
-
index: 数字; //
|
|
516
|
+
index: 数字; // 模板图片索引,从 0 开始
|
|
515
517
|
x: 数字;
|
|
516
518
|
y: 数字;
|
|
517
519
|
width: 数字;
|
|
@@ -521,6 +523,8 @@ function 找图(
|
|
|
521
523
|
centerY: 数字;
|
|
522
524
|
ex: 数字;
|
|
523
525
|
ey: 数字;
|
|
526
|
+
scaleX?: 数字; // 仅 方法=99 返回:命中时模板的横向缩放比例
|
|
527
|
+
scaleY?: 数字; // 仅 方法=99 返回:命中时模板的纵向缩放比例
|
|
524
528
|
}[];
|
|
525
529
|
```
|
|
526
530
|
|
|
@@ -532,46 +536,268 @@ function 找图(
|
|
|
532
536
|
| `模板图片ID` | 字符串 | 是 | - | `"screen"`-当前屏幕截图, `string`-图片文件路径或 URL ,`imageId`-图片 ID(通过 image 模块获取)支持按\|分割,多个图片按顺序查找 |
|
|
533
537
|
| `区域左上角x` | 数字 | 是 | - | 搜索区域左上角坐标 |
|
|
534
538
|
| `区域左上角y` | 数字 | 是 | - | 搜索区域左上角坐标 |
|
|
535
|
-
| `区域右下角x` | 数字 | 是 | - |
|
|
536
|
-
| `区域右下角y` | 数字 | 是 | - |
|
|
537
|
-
| `阈值` | 数字 | 是 | - | 匹配阈值 (0.0-1.0)
|
|
539
|
+
| `区域右下角x` | 数字 | 是 | - | 搜索区域右下角坐标;传 `0` 表示延伸到图片右侧边界 |
|
|
540
|
+
| `区域右下角y` | 数字 | 是 | - | 搜索区域右下角坐标;传 `0` 表示延伸到图片底部边界 |
|
|
541
|
+
| `阈值` | 数字 | 是 | - | 匹配阈值 (0.0-1.0)。方法 `0`/`99` 建议 `0.5`–`0.6`;普通模板匹配(`1`/`3`/`5`)建议 `0.9`–`0.995` |
|
|
538
542
|
| `限制数量` | 数字 | 是 | - | 最大查找数量,每个模板图片最多找 限制数量 个匹配结果 |
|
|
539
|
-
| `方法` | 数字 | 是 | - |
|
|
543
|
+
| `方法` | 数字 | 是 | - | 匹配方法,见下方说明 |
|
|
540
544
|
| `是否使用RGB找图` | 布尔值 | 否 | `false` | 是否使用 RGB 找图,默认 `false` 会自动转灰度找图 |
|
|
541
|
-
| `选项` | 对象 | 否 | - |
|
|
542
|
-
| `选项.scaleFactors` | 数字\[] | 否 | `[1.0, 0.9, 1.1, 0.8, 1.2]` |
|
|
545
|
+
| `选项` | 对象 | 否 | - | 额外选项,目前仅 方法=`99` 时生效 |
|
|
546
|
+
| `选项.scaleFactors` | 数字\[] | 否 | `[1.0, 0.9, 1.1, 0.8, 1.2]` | 仅 方法=`99` 生效。模板相对当前图的缩放比列表(**不是** `$设备.获取屏幕缩放比例()`)。应按 baseScale 动态计算,见下方详解;默认值只适合尺寸接近时的盲扫 |
|
|
547
|
+
|
|
548
|
+
#### 方法(method)匹配说明
|
|
549
|
+
|
|
550
|
+
| 方法 | 名称 | 原理简述 | 适用场景 | 速度 |
|
|
551
|
+
| ---- | ------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------ | -------- |
|
|
552
|
+
| `5` | TM_CCOEFF_NORMED | 标准模板匹配(归一化相关系数),模板必须与目标**像素尺寸一致** | 同分辨率、同尺寸截图模板,最常用 | 快 |
|
|
553
|
+
| `3` | TM_CCORR_NORMED | 标准模板匹配(归一化相关) | 同尺寸模板;PNG 透明模板带 mask 时内部会优先用它 | 快 |
|
|
554
|
+
| `1` | TM_SQDIFF_NORMED | 标准模板匹配(归一化平方差),分数越小越像,引擎已换算为越大越像 | 同尺寸模板 | 快 |
|
|
555
|
+
| `0` | SIFT 全分辨率 | 提取 SIFT 特征点做匹配,对旋转、轻微形变更鲁棒,不要求模板与目标同尺寸 | 目标可能旋转/形变,或跨分辨率找图 | 较慢 |
|
|
556
|
+
| `99` | 全分辨率缩放匹配法 | 把**模板**按多个比例缩放后,再做 `TM_CCOEFF_NORMED` 模板匹配(有透明通道时用 `TM_CCORR_NORMED`) | 目标与模板尺寸不完全一致,但形状相同 | 中等偏慢 |
|
|
557
|
+
|
|
558
|
+
#### 什么是「缩放」全分辨率找图(方法 = 99)
|
|
559
|
+
|
|
560
|
+
这里的「缩放」**不是**把屏幕截图缩小,也**不是**设备显示缩放(`$设备.获取屏幕缩放比例()`),而是:
|
|
561
|
+
|
|
562
|
+
> 在匹配前,把**模板小图**按 `scaleFactors` 里的比例逐个放大/缩小,再与**原尺寸**搜索区域做模板匹配。
|
|
563
|
+
|
|
564
|
+
- `factor = 1.0`:模板保持原像素尺寸去匹配
|
|
565
|
+
- `factor < 1.0`:先把模板缩小再匹配(当前屏幕上的目标比模板更小)
|
|
566
|
+
- `factor > 1.0`:先把模板放大再匹配(当前屏幕上的目标比模板更大)
|
|
567
|
+
|
|
568
|
+
引擎内部是对模板做等比缩放(横向、纵向同一个比例)。
|
|
569
|
+
返回结果里的 `width` / `height` 是缩放后的模板尺寸,`scaleX` / `scaleY` 是本次命中用到的比例。
|
|
570
|
+
|
|
571
|
+
工作流程:
|
|
572
|
+
|
|
573
|
+
1. 读取搜索区域(大图)和模板(小图),默认转灰度(`是否使用RGB找图=true` 时保留彩色)。
|
|
574
|
+
2. 按 `scaleFactors` **数组顺序**,对模板执行等比缩放。
|
|
575
|
+
3. 若缩放后的模板比搜索区域还大,跳过该比例。
|
|
576
|
+
4. 用缩放后的模板做 `TM_CCOEFF_NORMED` 匹配(透明 PNG 用 `TM_CCORR_NORMED` + alpha mask)。
|
|
577
|
+
5. 收集 `confidence >= 阈值` 的命中;重叠区域去重,保留置信度更高者。
|
|
578
|
+
6. 找满 `限制数量` 个后提前结束——所以**更可能命中的比例要放前面**。
|
|
579
|
+
|
|
580
|
+
#### 如何选择 `scaleFactors`(重点)
|
|
581
|
+
|
|
582
|
+
`scaleFactors` 不是随便填几个小数,而是回答这个问题:
|
|
583
|
+
|
|
584
|
+
> 「模板图里的目标,到当前屏幕上会变成原来的几倍宽/高?」
|
|
585
|
+
|
|
586
|
+
##### 1. 先算「目标比例」baseScale
|
|
587
|
+
|
|
588
|
+
UI 随分辨率等比变化时(大多数 App / 游戏界面):
|
|
589
|
+
|
|
590
|
+
```text
|
|
591
|
+
baseScale = 当前设备逻辑宽 / 截取模板时设备的逻辑宽
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
也可用高:
|
|
595
|
+
|
|
596
|
+
```text
|
|
597
|
+
baseScale = 当前设备逻辑高 / 截取模板时设备的逻辑高
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
宽高比一致时两者相同;不一致时优先用**与布局更相关的那条边**(竖屏 App 常用高,横屏游戏常用宽),或取两者平均。
|
|
601
|
+
|
|
602
|
+
这里的「逻辑宽高」请用找图坐标系对应的尺寸,一般是 `$设备.获取屏幕实际宽高()`(实际像素分辨率)。
|
|
603
|
+
**不要**把 `$设备.获取屏幕缩放比例()`(屏幕 scale 因子)直接当成 `scaleFactors` 里的值——两者不是一回事。
|
|
604
|
+
|
|
605
|
+
若你确切知道模板像素尺寸和屏幕上目标像素尺寸,也可以直接:
|
|
606
|
+
|
|
607
|
+
```text
|
|
608
|
+
baseScale = 屏幕上目标宽度(px) / 模板宽度(px)
|
|
609
|
+
// 或
|
|
610
|
+
baseScale = 屏幕上目标高度(px) / 模板高度(px)
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
**数值例子:**
|
|
614
|
+
|
|
615
|
+
| 截模板设备 | 当前运行设备 | 计算 | baseScale |
|
|
616
|
+
| -------------- | -------------- | ----------- | --------- |
|
|
617
|
+
| iPhone 8 750px | 同机 | 750 / 750 | `1.0` |
|
|
618
|
+
| 750 宽 | 1170 宽 | 1170 / 750 | `1.56` |
|
|
619
|
+
| 1170 宽 | 750 宽 | 750 / 1170 | `0.641` |
|
|
620
|
+
| 1080 宽安卓 | 1440 宽安卓 | 1440 / 1080 | `1.333` |
|
|
621
|
+
| 模板按钮 120px | 屏上按钮 96px | 96 / 120 | `0.8` |
|
|
622
|
+
|
|
623
|
+
含义对照:
|
|
624
|
+
|
|
625
|
+
| baseScale | 含义 | 引擎会对模板做什么 |
|
|
626
|
+
| --------- | -------------------------------------------- | ------------------ |
|
|
627
|
+
| `1.0` | 当前目标与模板同尺寸 | 不缩放 |
|
|
628
|
+
| `0.64` | 当前目标大约是模板的 64%(高分屏模板跑低分) | 缩到 64% 再匹配 |
|
|
629
|
+
| `1.56` | 当前目标大约是模板的 156%(低分屏模板跑高分) | 放大到 156% 再匹配 |
|
|
630
|
+
|
|
631
|
+
##### 2. 再围绕 baseScale 生成搜索列表
|
|
632
|
+
|
|
633
|
+
真实设备上还会有状态栏、安全区、App 缩放、截图工具裁切误差等,baseScale 很少绝对精确,所以要在 baseScale **附近扫一小段**:
|
|
634
|
+
|
|
635
|
+
```text
|
|
636
|
+
scaleFactors ≈ [ baseScale,
|
|
637
|
+
baseScale ± step,
|
|
638
|
+
baseScale ± 2*step,
|
|
639
|
+
... ]
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
推荐参数:
|
|
643
|
+
|
|
644
|
+
| 项目 | 建议 | 原因 |
|
|
645
|
+
| -------------- | ---------------------------------- | ------------------------------------------ |
|
|
646
|
+
| 中心值 | 算出来的 `baseScale` | 最可能命中,必须放第一位 |
|
|
647
|
+
| 步进 `step` | `0.05`~`0.1` | 太疏容易跳过真实尺寸;太密浪费时间 |
|
|
648
|
+
| 半宽度 | `±0.1`~`±0.2`(约 ±10%~20%) | 覆盖状态栏/安全区/轻微布局差 |
|
|
649
|
+
| 总档数 | 3~7 个 | 每多一档就多跑一轮全图模板匹配 |
|
|
650
|
+
| 阈值 | `0.5`~`0.6` 起调 | 缩放插值会降低相关分数,别用 0.9+ |
|
|
651
|
+
| 顺序 | **baseScale 最先**,再左右交替扩开 | 找满限制数量会提前结束 |
|
|
652
|
+
|
|
653
|
+
生成示例:
|
|
654
|
+
|
|
655
|
+
```javascript
|
|
656
|
+
// 截模板时的设备宽(写进脚本配置,或写在模板文件名里)
|
|
657
|
+
const 模板设备宽 = 750;
|
|
658
|
+
// 当前设备实际宽
|
|
659
|
+
const 当前宽 = $设备.获取屏幕实际宽高().width;
|
|
660
|
+
const baseScale = 当前宽 / 模板设备宽;
|
|
661
|
+
|
|
662
|
+
// 围绕 baseScale,步进 0.05,左右各扩 2 档 → 共 5 个
|
|
663
|
+
function 生成缩放比例(base, step = 0.05, halfRange = 2) {
|
|
664
|
+
const list = [Number(base.toFixed(4))];
|
|
665
|
+
for (let i = 1; i <= halfRange; i++) {
|
|
666
|
+
list.push(Number((base - step * i).toFixed(4)));
|
|
667
|
+
list.push(Number((base + step * i).toFixed(4)));
|
|
668
|
+
}
|
|
669
|
+
// 过滤掉无意义的比例
|
|
670
|
+
return list.filter((s) => s > 0.05 && s < 8);
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
const scaleFactors = 生成缩放比例(baseScale);
|
|
674
|
+
// 例如 baseScale=1.56, step=0.05, halfRange=2
|
|
675
|
+
// → [1.56, 1.51, 1.61, 1.46, 1.66]
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
##### 3. 按场景怎么选
|
|
679
|
+
|
|
680
|
+
| 场景 | 怎么设 `scaleFactors` | 阈值 |
|
|
681
|
+
| -------------------------------------- | -------------------------------------------------------------- | ------------- |
|
|
682
|
+
| 模板就是本机截的,尺寸确定一致 | 不必用 99,直接方法 `5`;若坚持用 99 则 `[1.0]` | `0.9+` / `0.55` |
|
|
683
|
+
| 已知截图机型与当前机型分辨率 | 算 `baseScale`,再 `±0.05`~`±0.1` 扩 3~5 档 | `0.5`~`0.6` |
|
|
684
|
+
| 多机型跑同一套模板,分辨率跨度大 | 按每台设备运行时动态算 baseScale,不要写死默认那组 | `0.5`~`0.6` |
|
|
685
|
+
| 完全不知道模板来源分辨率 | 先用方法 `0`(SIFT);或宽范围粗扫(慢,如 0.5~2.0 步进 0.1) | `0.5` 左右 |
|
|
686
|
+
| 只要微调(系统字体/显示缩放导致差几像素) | `[1.0, 0.95, 1.05, 0.9, 1.1]` | `0.55`~`0.65` |
|
|
687
|
+
| 横竖屏切换 / 目标会旋转 | 方法 `99` **不够**,改用方法 `0` SIFT | `0.5`~`0.6` |
|
|
688
|
+
|
|
689
|
+
默认值 `[1.0, 0.9, 1.1, 0.8, 1.2]` 的定位:
|
|
690
|
+
|
|
691
|
+
- 假设「模板大致接近当前尺寸」,在 80%~120% 之间盲扫
|
|
692
|
+
- **只适合尺寸差不大的兜底**,不适合 750 ↔ 1170 这种跨度(baseScale≈1.56,默认列表根本扫不到)
|
|
693
|
+
- 生产脚本应**按设备算 baseScale**,不要依赖这组默认值硬扛跨分辨率
|
|
694
|
+
|
|
695
|
+
##### 4. 常见误区
|
|
696
|
+
|
|
697
|
+
1. **把 `$设备.获取屏幕缩放比例()` 填进 scaleFactors**
|
|
698
|
+
获取屏幕缩放比例是屏幕 scale(如 2x/3x 显示倍率),不是「模板相对当前图」的缩放比。
|
|
699
|
+
|
|
700
|
+
2. **跨大分辨率仍用默认 `[1.0, 0.9, 1.1, 0.8, 1.2]`**
|
|
701
|
+
真实 baseScale 在 1.5 时,默认列表全军覆没。
|
|
702
|
+
|
|
703
|
+
3. **阈值仍用 0.9**
|
|
704
|
+
resize 插值会损失细节,方法 `99` 相关分通常明显低于同尺寸方法 `5`,建议从 `0.55` 左右调。
|
|
705
|
+
|
|
706
|
+
4. **档位又多又密**
|
|
707
|
+
全屏 × 10 个 factor ≈ 10 次模板匹配,卡顿明显。先算准 baseScale,再小范围扩。
|
|
708
|
+
|
|
709
|
+
5. **模板含大量透明/JPEG 压缩噪点**
|
|
710
|
+
缩放后更易误匹配;优先 PNG 透明模板,并尽量裁紧目标外轮廓。
|
|
711
|
+
|
|
712
|
+
6. **搜索区域小于放大后的模板**
|
|
713
|
+
该 factor 会被跳过。放大场景请保证 ROI 足够大,或全屏搜。
|
|
714
|
+
|
|
715
|
+
##### 5. 与方法 `0`(SIFT)怎么选
|
|
716
|
+
|
|
717
|
+
| | 方法 `99` 缩放匹配 | 方法 `0` SIFT |
|
|
718
|
+
| -------------- | ---------------------------------- | ---------------------------------- |
|
|
719
|
+
| 尺寸变化 | 支持(靠你提供的比例穷举) | 支持(特征点,不靠固定比例) |
|
|
720
|
+
| 你需要知道比例 | 最好先算 baseScale | 不需要 |
|
|
721
|
+
| 旋转 / 形变 | 基本不支持 | 较鲁棒 |
|
|
722
|
+
| 阈值建议 | `0.5`–`0.6` | `0.5`–`0.6` |
|
|
723
|
+
| 透明 PNG 模板 | 支持(alpha 作权重 mask) | 支持(alpha 作特征掩码) |
|
|
724
|
+
| 性能 | 与 factor 数量近似成正比,通常更快 | 特征提取重,通常更慢 |
|
|
725
|
+
| 推荐 | 比例可估算的跨分辨率找图 | 比例未知、或有旋转/透视时 |
|
|
543
726
|
|
|
544
727
|
**返回值:**
|
|
545
728
|
|
|
546
|
-
| 类型 | 描述
|
|
547
|
-
| ------ |
|
|
548
|
-
| `数组` |
|
|
729
|
+
| 类型 | 描述 |
|
|
730
|
+
| ------ | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
731
|
+
| `数组` | 匹配结果数组。`index` 为模板在 `模板图片ID` 中的索引(从 0 开始)。方法=`99` 时额外包含 `scaleX`、`scaleY`(本次命中使用的缩放比) |
|
|
549
732
|
|
|
550
733
|
**示例:**
|
|
551
734
|
|
|
552
735
|
```javascript
|
|
736
|
+
// 1) 同分辨率标准找图(最常用,模板就是本机截的)
|
|
553
737
|
const 匹配区域数组 = $图片.找图(
|
|
554
738
|
"screen",
|
|
555
739
|
"template.jpg|template2.jpg",
|
|
556
740
|
0,
|
|
557
741
|
0,
|
|
558
742
|
400,
|
|
559
|
-
800,
|
|
560
|
-
0.
|
|
561
|
-
3,
|
|
562
|
-
5, //
|
|
563
|
-
false,
|
|
743
|
+
800,
|
|
744
|
+
0.9,
|
|
745
|
+
3,
|
|
746
|
+
5, // TM_CCOEFF_NORMED
|
|
747
|
+
false,
|
|
564
748
|
);
|
|
565
749
|
|
|
566
750
|
if (匹配区域数组.length > 0) {
|
|
567
751
|
const best = 匹配区域数组[0];
|
|
568
752
|
$打印信息日志(`找到匹配,置信度: ${best.confidence}`);
|
|
753
|
+
$动作.点击(best.centerX, best.centerY, 100, false);
|
|
754
|
+
}
|
|
569
755
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
756
|
+
// 2) 缩放全分辨率找图:按「截模板设备宽 / 当前设备宽」计算比例
|
|
757
|
+
// 假设模板是在宽度 750 的设备上截的
|
|
758
|
+
const 模板设备宽 = 750;
|
|
759
|
+
const 当前宽 = $设备.获取屏幕实际宽高().width;
|
|
760
|
+
const baseScale = 当前宽 / 模板设备宽;
|
|
761
|
+
|
|
762
|
+
function 生成缩放比例(base, step = 0.05, halfRange = 2) {
|
|
763
|
+
const list = [Number(base.toFixed(4))];
|
|
764
|
+
for (let i = 1; i <= halfRange; i++) {
|
|
765
|
+
list.push(Number((base - step * i).toFixed(4)));
|
|
766
|
+
list.push(Number((base + step * i).toFixed(4)));
|
|
767
|
+
}
|
|
768
|
+
return list.filter((s) => s > 0.05 && s < 8);
|
|
574
769
|
}
|
|
770
|
+
|
|
771
|
+
const scaleFactors = 生成缩放比例(baseScale);
|
|
772
|
+
// 750 → 1170 时约等于 [1.56, 1.51, 1.61, 1.46, 1.66]
|
|
773
|
+
$打印信息日志(
|
|
774
|
+
`baseScale=${baseScale.toFixed(3)} scaleFactors=${JSON.stringify(scaleFactors)}`,
|
|
775
|
+
);
|
|
776
|
+
|
|
777
|
+
const 缩放匹配 = $图片.找图(
|
|
778
|
+
"screen",
|
|
779
|
+
"btn_start.png",
|
|
780
|
+
0,
|
|
781
|
+
0,
|
|
782
|
+
0,
|
|
783
|
+
0, // 全屏;放大模板时 ROI 太小会被跳过
|
|
784
|
+
0.55, // 多尺度建议 0.5-0.6,不要用 0.9
|
|
785
|
+
1,
|
|
786
|
+
99,
|
|
787
|
+
false,
|
|
788
|
+
{ scaleFactors },
|
|
789
|
+
);
|
|
790
|
+
|
|
791
|
+
if (缩放匹配.length > 0) {
|
|
792
|
+
const hit = 缩放匹配[0];
|
|
793
|
+
$打印信息日志(
|
|
794
|
+
`命中 scale=${hit.scaleX} 尺寸=${hit.width}x${hit.height} 置信度=${hit.confidence}`,
|
|
795
|
+
);
|
|
796
|
+
$动作.点击(hit.centerX, hit.centerY, 100, false);
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
// 3) 已知模板宽和屏幕目标大概宽时,直接用像素比
|
|
800
|
+
// const baseScale = 预期目标宽度px / 模板宽度px;
|
|
575
801
|
```
|
|
576
802
|
|
|
577
803
|
## 图像处理
|