From c13454802039d407b3cc30a9067b1e79b188a499 Mon Sep 17 00:00:00 2001 From: DarkFlameMaster <1004452714@qq.com> Date: Fri, 8 May 2026 00:09:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3OpenCV=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E5=BC=95=E7=94=A8=E9=94=99=E8=AF=AF=EF=BC=8C?= =?UTF-8?q?Bv=E7=B1=BB=E7=A7=BB=E9=99=A4=E5=86=97=E4=BD=99=E5=86=85?= =?UTF-8?q?=E5=AE=B9=EF=BC=8C=E4=BC=98=E5=8C=96=E7=A4=BA=E4=BE=8B=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dev/js/BvLocator.md | 314 ++++++++++++++++++++++-------------- src/dev/js/BvPage.md | 348 +++++++++------------------------------- src/dev/js/rec.md | 8 +- 3 files changed, 278 insertions(+), 392 deletions(-) diff --git a/src/dev/js/BvLocator.md b/src/dev/js/BvLocator.md index 89016af..f2ce73d 100644 --- a/src/dev/js/BvLocator.md +++ b/src/dev/js/BvLocator.md @@ -7,7 +7,7 @@ date: 2026-02-24 # BvLocator 类 API 文档 -# 类概述 +## 类概述 `BvLocator` 主要用于元素定位,基于 Region 体系进行包装,提供了的元素定位、等待和交互方法。该类支持模板匹配和 OCR 两种识别方式,可用于游戏界面元素的自动识别和操作。 @@ -15,44 +15,51 @@ date: 2026-02-24 ### 构造函数 -
-查看C#实现 +**参数说明** -```csharp -public BvLocator(RecognitionObject recognitionObject, CancellationToken cancellationToken) -{ - RecognitionObject = recognitionObject.Clone(); - _cancellationToken = cancellationToken; -} -``` +| 参数 | 类型 | 必填 | 描述 | +|------|------|------|------| +| recognitionObject | RecognitionObject | 是 | 识别对象,包含识别类型、模板图像或文本等信息 | +| cancellationToken | CancellationToken | 是 | 取消令牌,用于取消长时间运行的操作 | -
+**返回值** +- 返回 `BvLocator` 实例 **JavaScript 调用示例** -- 也可以使用BvPage创建实例 + ```javascript +// 1.初始化方法 const token = new CancellationTokenSource().Token; const ro = RecognitionObject.TemplateMatch( file.ReadImageMatSync("assets/paimon_menu.png") ); - -// 创建 BvLocator 实例 const locator = new BvLocator(ro, token); + +// 2.推荐通过 BvPage 初始化 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/paimon_menu.png") + ) +); + // 现在可以使用 locator 进行元素定位和操作 -const exists = await locator.IsExist(); +const exists = await locator.isExist(); ``` -**参数说明** - -| 参数 | 类型 | 必填 | 描述 | -|------|------|------|------| -| recognitionObject | RecognitionObject | 是 | 识别对象,包含识别类型、模板图像或文本等信息 | -| cancellationToken | CancellationToken | 是 | 取消令牌,用于取消长时间运行的操作 | +
+查看C#实现 -**返回值** -- 返回 `BvLocator` 实例 +```csharp +public BvLocator(RecognitionObject recognitionObject, CancellationToken cancellationToken) +{ + RecognitionObject = recognitionObject.Clone(); + _cancellationToken = cancellationToken; +} +``` +
## 属性 @@ -63,7 +70,6 @@ const exists = await locator.IsExist(); | DefaultTimeout | int | 默认超时时间,单位为毫秒,默认值为 10000 | | DefaultRetryInterval | int | 默认重试间隔,单位为毫秒,默认值为 250 | - ## 基础方法 ### FindAll @@ -75,19 +81,30 @@ const exists = await locator.IsExist(); - 类型:`List` - 可能取值: - 空列表:未找到元素 - - 包含一个或多个 `Region` 对象的列表:找到的元素 + - 包含一个 `Region` 对象的列表:找到的元素(模板匹配) + - 包含多个 `Region` 对象的列表:找到的所有元素(OCR) **使用场景** - 直接查找屏幕上的元素,不进行等待 - 作为其他方法的基础,被内部调用 -- 不建议外部直接调用,应使用更高层次的方法 +- 建议使用更高层次的方法(如 `waitFor`、`click` 等) **JavaScript 调用示例** ```javascript -const regions = await bvLocator.FindAll(); -if (regions.count > 0) { - log.info('找到元素:{0}个', regions.count); +// 通过 BvPage 创建定位器 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/paimon_menu.png") + ) +); + +const regions = locator.findAll(); +if (regions.Count > 0) { + log.info('找到元素:{0}个', regions.Count); + // 可以点击找到的元素 + regions.first().click(); } else { log.info('未找到元素'); } @@ -143,12 +160,21 @@ public List FindAll() **使用场景** - 快速检查元素是否存在,不需要获取具体位置信息 +- 用于条件判断,根据元素是否存在决定后续操作 **JavaScript 调用示例** ```javascript +// 通过 BvPage 创建定位器 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/paimon_menu.png") + ) +); + // 检查元素是否存在 -const exists = await bvLocator.IsExist(); +const exists = locator.isExist(); if (exists) { log.info('元素存在'); } else { @@ -168,9 +194,9 @@ public bool IsExist() -## 等待方法 +## 等待元素出现或消失 -### WaitFor +### WaitFor - 等待元素出现 **参数说明** | 参数 | 类型 | 必填 | 描述 | @@ -184,18 +210,22 @@ public bool IsExist() - 抛出 `TimeoutException`:超时未找到元素 **使用场景** -- 需要等待界面元素加载完成后再进行操作 +- 需要等待元素加载完成 **JavaScript 调用示例** ```javascript -// 等待元素出现,最多等待5秒 -try { - const regions = await bvLocator.WaitFor(5000); - log.info('元素已出现:{0}个', regions.count); -} catch (error) { - log.error('等待超时:{0}', error.message); -} +// 通过 BvPage 创建定位器 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/paimon_menu.png") + ) +); + +const regions = await locator.waitFor(5000); +log.info('元素已出现:{0}个', regions.Count); + ```
@@ -229,7 +259,7 @@ public async Task> WaitFor(int? timeout = null)
-### TryWaitFor +### TryWaitFor - 等待元素出现,不抛出异常 **参数说明** | 参数 | 类型 | 必填 | 描述 | @@ -249,10 +279,19 @@ public async Task> WaitFor(int? timeout = null) **JavaScript 调用示例** ```javascript -// 尝试等待元素出现,最多等待3秒 -const regions = await bvLocator.TryWaitFor(3000); -if (regions.count > 0) { - log.info('元素已出现:{0}个', regions.count); +// 通过 BvPage 创建定位器 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/paimon_menu.png") + ) +); + +// 尝试等待元素出现,最多等待 3 秒 +const regions = await locator.tryWaitFor(3000); +if (regions.Count > 0) { + log.info('元素已出现:{0}个', regions.Count); + regions.first().click(); } else { log.info('元素未出现,但没有抛出异常'); } @@ -277,7 +316,7 @@ public async Task> TryWaitFor(int? timeout = null) -### WaitForDisappear +### WaitForDisappear - 等待元素消失 **参数说明** | 参数 | 类型 | 必填 | 描述 | @@ -292,17 +331,28 @@ public async Task> TryWaitFor(int? timeout = null) **使用场景** - 需要等待界面元素消失后再进行操作 -- 适用于异步操作场景 +- 适用于关闭弹窗、等待加载界面消失等场景 **JavaScript 调用示例** ```javascript -// 等待元素消失,最多等待5秒 +// 通过 BvPage 创建定位器 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/loading_screen.png") + ) +); + +// 注意:此方法在超时会抛出 TimeoutException 异常,请使用 try-catch 捕获 +// 等待加载界面消失,最多等待 10 秒 try { - await bvLocator.WaitForDisappear(5000); - log.info('元素已消失'); + await locator.waitForDisappear(10000); + log.info('加载界面已消失,可以继续操作'); + // 继续执行后续操作 } catch (error) { - log.error('等待超时:{0}', error.message); + log.error('等待超时:{0}', error.Message); + // 超时后的处理 } ``` @@ -336,7 +386,7 @@ public async Task WaitForDisappear(int? timeout = null) -### TryWaitForDisappear +### TryWaitForDisappear - 等待元素消失,不抛出异常 **参数说明** | 参数 | 类型 | 必填 | 描述 | @@ -354,9 +404,19 @@ public async Task WaitForDisappear(int? timeout = null) **JavaScript 调用示例** ```javascript -// 尝试等待元素消失,最多等待3秒 -await bvLocator.TryWaitForDisappear(3000); -log.info('尝试等待元素消失完成'); +// 通过 BvPage 创建定位器 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/popup.png") + ) +); + +// 尝试等待弹窗消失,最多等待 3 秒 +await locator.tryWaitForDisappear(3000); +log.info('尝试等待弹窗消失完成'); +// 无论弹窗是否消失,都继续执行后续操作 +await page.getByText("确认").click(); ```
@@ -378,9 +438,9 @@ public async Task TryWaitForDisappear(int? timeout = null)
-## 交互方法 +## 以元素出现或消失为条件的点击 -### Click +### Click - 等待元素出现并点击 **参数说明** | 参数 | 类型 | 必填 | 描述 | @@ -400,12 +460,23 @@ public async Task TryWaitForDisappear(int? timeout = null) **JavaScript 调用示例** ```javascript -// 等待元素出现并点击,最多等待5秒 +// 通过 BvPage 创建定位器 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/confirm_button.png") + ) +); + +// 等待元素出现并点击,最多等待 5 秒 try { - const region = await bvLocator.Click(5000); + const region = await locator.click(5000); log.info('点击成功:{0}', region); + // 等待点击后的响应,如等待新界面出现 + await page.wait(500); } catch (error) { - log.error('操作失败:{0}', error.message); + log.error('操作失败:{0}', error.Message); + // 错误处理 } ``` @@ -421,7 +492,7 @@ public async Task Click(int? timeout = null) -### ClickUntilDisappears +### ClickUntilDisappears - 元素存在时持续点击,直到元素消失 **参数说明** | 参数 | 类型 | 必填 | 描述 | @@ -436,17 +507,28 @@ public async Task Click(int? timeout = null) **使用场景** - 需要点击元素并确认操作生效(元素消失)的场景 -- 适用于需要确认操作结果的场景 +- 适用于关闭弹窗、提交操作等需要确认结果的操作 **JavaScript 调用示例** ```javascript +// 通过 BvPage 创建定位器 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/close_button.png") + ) +); + // 等待元素出现并点击,直到元素消失 try { - const region = await bvLocator.ClickUntilDisappears(10000); + const region = await locator.clickUntilDisappears(10000); log.info('点击成功并确认元素消失:{0}', region); + // 继续执行后续操作 + await page.wait(500); } catch (error) { - log.error('操作失败:{0}', error.message); + log.error('操作失败:{0}', error.Message); + // 错误处理,可能需要重试 } ``` @@ -465,7 +547,7 @@ public async Task ClickUntilDisappears(int? timeout = null) -### DoubleClick +### DoubleClick - 等待元素出现并双击 **参数说明** | 参数 | 类型 | 必填 | 描述 | @@ -485,12 +567,23 @@ public async Task ClickUntilDisappears(int? timeout = null) **JavaScript 调用示例** ```javascript -// 等待元素出现并双击,最多等待5秒 +// 通过 BvPage 创建定位器 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/item_icon.png") + ) +); + +// 等待元素出现并双击,最多等待 5 秒 try { - const region = await bvLocator.DoubleClick(5000); + const region = await locator.doubleClick(5000); log.info('双击成功:{0}', region); + // 等待双击后的响应 + await page.wait(1000); } catch (error) { - log.error('操作失败:{0}', error.message); + log.error('操作失败:{0}', error.Message); + // 错误处理 } ``` @@ -509,7 +602,7 @@ public async Task DoubleClick(int? timeout = null) ## 配置方法 -### WithRoi +### WithRoi - 重设感兴趣区域 (ROI) **参数说明** | 参数 | 类型 | 必填 | 描述 | @@ -523,65 +616,34 @@ public async Task DoubleClick(int? timeout = null) **使用场景** - 已知元素大致位置,需要缩小搜索范围 - 提高识别速度和准确性 +- 避免误识别其他区域的相似元素 **JavaScript 调用示例** ```javascript -// 设置感兴趣区域 (ROI) -const rect = new OpenCvSharp.OpenCvSharp.Rect(0,0,1920,1080); -const updatedLocator = bvLocator.WithRoi(rect); -// 现在可以使用 updatedLocator 进行定位 -const regions = await updatedLocator.FindAll(); -``` - -
-查看C#实现 +// 通过 BvPage 创建定位器 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/menu_button.png") + ) +); -```csharp -public BvLocator WithRoi(Rect rect) -{ - RecognitionObject.RegionOfInterest = rect; - return this; +// 设置感兴趣区域 (ROI),在屏幕右下角搜索 +const rect = new OpenCvSharp.OpenCvSharp.Rect(1400, 800, 500, 280); +const regions = locator.withRoi(rect).waitFor(5000); +if (regions.Count > 0) { + log.info('在指定区域找到元素'); + regions.first().click(); } ``` -
- -### WithRoi (函数版本) - -**参数说明** -| 参数 | 类型 | 必填 | 描述 | -|------|------|------|------| -| deltaFunc | Func | 是 | 基于基础矩形计算 ROI 的函数 | - -**返回值** -- 类型:`BvLocator` -- 返回当前 `BvLocator` 实例,支持链式调用 - -**使用场景** -- 需要动态计算 ROI - -**JavaScript 调用示例** - -```javascript -// 使用函数设置感兴趣区域 -const updatedLocator = bvLocator.WithRoi(baseRect => { - // 仅作为演示,四边向内缩10像素 - baseRect.Inflate(-10, -10); - return baseRect -}); -// 现在可以使用 updatedLocator 进行定位 -const regions = await updatedLocator.FindAll(); -``` -
查看C#实现 ```csharp -public BvLocator WithRoi(Func deltaFunc) +public BvLocator WithRoi(Rect rect) { - var captureAreaRect = TaskContext.Instance().SystemInfo.ScaleMax1080PCaptureRect; - var rect = deltaFunc(captureAreaRect); RecognitionObject.RegionOfInterest = rect; return this; } @@ -589,7 +651,7 @@ public BvLocator WithRoi(Func deltaFunc)
-### WithRetryAction +### WithRetryAction - 重试时的操作 **参数说明** | 参数 | 类型 | 必填 | 描述 | @@ -603,17 +665,29 @@ public BvLocator WithRoi(Func deltaFunc) **使用场景** - 需要在重试过程中执行额外操作,如滚动屏幕、刷新界面等 - 提高元素定位的成功率 +- 记录重试过程中的日志信息 **JavaScript 调用示例** ```javascript -// 设置重试操作 -const updatedLocator = bvLocator.WithRetryAction(regions => { - log.info('重试中,当前找到元素数:{0}', regions.count); +// 通过 BvPage 创建定位器 +const page = new BvPage(); +const locator = page.Locator( + RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/list_item.png") + ) +); + +// 设置重试操作,在每次重试时记录日志 +const updatedLocator = locator.withRetryAction(regions => { + log.info('重试中,当前找到元素数:{0}', regions.Count); // 可以在这里执行额外的操作,如滚动屏幕等 }); // 现在使用 updatedLocator 进行等待 -const regions = await updatedLocator.WaitFor(5000); +const regions = await updatedLocator.waitFor(5000); +if (regions.Count > 0) { + log.info('找到元素'); +} ```
diff --git a/src/dev/js/BvPage.md b/src/dev/js/BvPage.md index 548d7c8..591967b 100644 --- a/src/dev/js/BvPage.md +++ b/src/dev/js/BvPage.md @@ -7,36 +7,10 @@ date: 2026-02-24 # BvPage 类 API 文档 -# 类概述 - -`BvPage` 基于 BvLocator 进行了更高层次的封装,提供了截图、等待、元素定位、OCR识别和鼠标点击等功能。 ## 初始化方法 -### 构造函数 -
-查看C#实现 - -```csharp -public BvPage(CancellationToken cancellationToken = default) -{ - _cancellationToken = cancellationToken; -} -``` - -
- -**JavaScript 调用示例** -- 直接通过构造函数创建实例 -```javascript -// 直接创建 BvPage 实例 -const page = new BvPage(); - -// 现在可以使用 page 进行页面操作 -const regions = await page.GetByText("确认").FindAll(); - -``` **参数说明** @@ -47,20 +21,31 @@ const regions = await page.GetByText("确认").FindAll(); **返回值** - 返回 `BvPage` 实例 +**JavaScript 调用示例** -## 属性 +```javascript +// 直接创建 BvPage 实例(使用默认取消令牌) +const page = new BvPage(); + +// 后续操作 +const regions = await page.getByText("确认").findAll(); +``` + +
+查看C#实现 -| 属性 | 类型 | 描述 | -|------|------|------| -| Keyboard | IKeyboardSimulator | 键盘模拟器,用于键盘操作 | -| Mouse | IMouseSimulator | 鼠标模拟器,用于鼠标操作 | -| DefaultTimeout | int | 默认超时时间,单位为毫秒,默认值为 10000 | -| DefaultRetryInterval | int | 默认重试间隔,单位为毫秒,默认值为 1000 | +```csharp +public BvPage(CancellationToken cancellationToken = default) +{ + _cancellationToken = cancellationToken; +} +``` +
## 基础方法 -### Screenshot +### Screenshot - 截屏 **参数说明** - 无参数 @@ -76,10 +61,21 @@ const regions = await page.GetByText("确认").FindAll(); **JavaScript 调用示例** ```javascript -// 截图 -const screen = page.Screenshot(); -// screen 是一个 ImageRegion 对象,可以进行进一步处理 -log.info('截图成功'); +// 获取截图 +const screen = page.screenshot(); + +// 可以在截图上进行识别操作,一般不这么用 +const ro = RecognitionObject.TemplateMatch( + file.ReadImageMatSync("assets/button.png") +); +const region = screen.Find(ro); + +if (region.IsExist()) { + log.info('在截图中找到元素'); + region.click(); +} + +log.info('截图完成'); ```
@@ -94,7 +90,7 @@ public ImageRegion Screenshot()
-### Wait +### Wait - 等待 **参数说明** | 参数 | 类型 | 必填 | 描述 | @@ -107,7 +103,7 @@ public ImageRegion Screenshot() **使用场景** - 等待一段时间后继续执行 -- 用于需要延迟的场景 +- 用于需要延迟的场景,如等待界面加载 **JavaScript 调用示例** @@ -131,9 +127,9 @@ public async Task Wait(int milliseconds)
-## 定位方法 +## 初始化 BvLocator 方法 -### Locator (RecognitionObject) +### Locator - 识别对象版 **参数说明** | 参数 | 类型 | 必填 | 描述 | @@ -158,6 +154,13 @@ const ro = RecognitionObject.TemplateMatch( // 通过 RecognitionObject 创建定位器 const locator = page.Locator(ro); + +// 使用定位器进行操作 +const regions = await locator.waitFor(5000); +if (regions.Count > 0) { + log.info('找到元素'); + regions.first().click(); +} ```
@@ -172,6 +175,9 @@ public BvLocator Locator(RecognitionObject ro)
+### Locator - OCR 版 + - 与 `GetByText(string text, Rect rect)` 等价 + ### GetByText **参数说明** @@ -191,9 +197,23 @@ public BvLocator Locator(RecognitionObject ro) **JavaScript 调用示例** ```javascript -// 通过文本创建定位器(简写方式) -const locator = page.GetByText("确认"); -const regions = await locator.FindAll(); +// 通过文本创建定位器 +const locator = page.getByText("确认"); + +// 查找并点击 +const regions = await locator.waitFor(5000); +if (regions.Count > 0) { + log.info('找到文字:确认'); + regions.first().click(); +} + +// 链式调用:一行代码完成查找和点击 +await page.getByText("确认").click(5000); + +// 指定区域查找 +const rect = new OpenCvSharp.OpenCvSharp.Rect(0, 800, 1920, 280); +const bottomTexts = page.getByText("开始", rect); +const bottomRegions = await bottomTexts.tryWaitFor(3000); ```
@@ -220,54 +240,10 @@ public BvLocator Locator(string text, Rect rect = default) -
- -### GetByImage -**BvImage 类目前不太适合JS使用, 建议使用 `Locator(RecognitionObject ro)` 方法** - -**参数说明** -| 参数 | 类型 | 必填 | 描述 | -|------|------|------|------| -| image | BvImage | 是 | 要定位的图像对象 | - -**返回值** -- 类型:`BvLocator` -- 返回定位器实例,用于后续操作 - -**使用场景** -- 通过图像进行元素定位的简写方式 -- 与 `Locator(BvImage image)` 等价 - - -**JavaScript 调用示例** - -```javascript -// 通过图像创建定位器(简写方式) -const locator = page.GetByImage(BvImage.FromName("confirm_button")); -const exists = await locator.IsExist(); -``` - -
-查看C#实现 - -```csharp -public BvLocator GetByImage(BvImage image) -{ - return Locator(image); -} -``` - - `GetByImage`是`Locator(BvImage image)`方法的语义化包装 - -```csharp -public BvLocator Locator(BvImage image) -{ - return new BvLocator(image.ToRecognitionObject(), _cancellationToken); -} -```
-## OCR 方法 +## 其他 ### Ocr @@ -288,11 +264,19 @@ public BvLocator Locator(BvImage image) ```javascript // 对整个屏幕进行 OCR 识别 -const regions = page.Ocr(); -log.info('识别到文本数:', regions.count); +const regions = page.ocr(); +log.info('识别到文本数:{0}', regions.Count); + +// 遍历识别结果 +for (let i = 0; i < regions.Count; i++) { + const region = regions[i]; + log.info('文本:{0}, 位置:({1}, {2})', region.Text, region.X, region.Y); +} // 对指定区域进行 OCR 识别 -const regions2 = page.Ocr(new OpenCvSharp.OpenCvSharp.Rect(0, 0, 500, 500)); +const rect = new OpenCvSharp.OpenCvSharp.Rect(0, 0, 500, 500); +const topLeftRegions = page.ocr(rect); +log.info('左上角识别到文本数:{0}', topLeftRegions.Count); ```
@@ -307,126 +291,14 @@ public List Ocr(Rect rect = default)
-### OcrMatch - -**参数说明** -| 参数 | 类型 | 必填 | 描述 | -|------|------|------|------| -| target | string | 是 | 目标字符串 | -| rect | Rect | 否 | 感兴趣区域,默认为全屏 | -| threshold | double? | 否 | 匹配阈值 (0~1),null 使用配置中的默认阈值 | - -**返回值** -- 类型:`bool` -- 可能取值: - - `true`:匹配成功 - - `false`:匹配失败 - -**使用场景** -- 判断截图中是否包含目标文字 -- 使用模糊匹配进行文本识别 - -**JavaScript 调用示例** - -```javascript -// 判断屏幕上是否包含"确认"文字 -const matched = page.OcrMatch("确认"); -log.info('匹配结果:', matched); - -// 指定区域和阈值 -const matched2 = page.OcrMatch("确认", new OpenCvSharp.OpenCvSharp.Rect(0, 0, 500, 500), 0.8); -``` - -
-查看C#实现 - -```csharp -public bool OcrMatch(string target, Rect rect = default, double? threshold = null) -{ - var matchService = OcrFactory.PaddleMatch; - var actualThreshold = threshold - ?? TaskContext.Instance().Config.OtherConfig.OcrConfig.OcrMatchDefaultThreshold; - - var screen = TaskControl.CaptureToRectArea(); - try - { - var roi = rect == default ? null : screen.DeriveCrop(rect); - try - { - var score = matchService.OcrMatch((roi ?? screen).SrcMat, target); - return score >= actualThreshold; - } - finally - { - roi?.Dispose(); - } - } - finally - { - screen.Dispose(); - } -} -``` - -
- -### WaitForOcrMatch - -**参数说明** -| 参数 | 类型 | 必填 | 描述 | -|------|------|------|------| -| target | string | 是 | 目标字符串 | -| rect | Rect | 否 | 感兴趣区域,默认为全屏 | -| threshold | double? | 否 | 匹配阈值 (0~1),null 使用配置中的默认阈值 | -| timeout | int? | 否 | 超时时间(毫秒),null 使用 DefaultTimeout | - -**返回值** -- 类型:`Task` -- 可能取值: - - `true`:在超时前匹配成功 - - `false`:超时未匹配 - -**使用场景** -- 等待目标文字出现 -- 重复截图并使用模糊匹配 - -**JavaScript 调用示例** - -```javascript -// 等待"确认"文字出现,最多等待10秒 -const matched = await page.WaitForOcrMatch("确认", default, default, 10000); -log.info('等待结果:', matched); - -// 简化调用 -const matched2 = await page.WaitForOcrMatch("确认"); -``` - -
-查看C#实现 - -```csharp -public async Task WaitForOcrMatch(string target, Rect rect = default, double? threshold = null, int? timeout = null) -{ - var actualTimeout = timeout ?? DefaultTimeout; - var retryCount = DefaultRetryInterval > 0 ? actualTimeout / DefaultRetryInterval : 1; - - return await NewRetry.WaitForAction(() => OcrMatch(target, rect, threshold), - _cancellationToken, retryCount, DefaultRetryInterval); -} -``` - -
- - -## 交互方法 ### Click **参数说明** | 参数 | 类型 | 必填 | 描述 | |------|------|------|------| -| x | double | 是 | 1080P分辨率下的X坐标 | -| y | double | 是 | 1080P分辨率下的Y坐标 | +| x | double | 是 | 1080P 分辨率下的 X 坐标 | +| y | double | 是 | 1080P 分辨率下的 Y 坐标 | **返回值** - 类型:`void` @@ -440,7 +312,7 @@ public async Task WaitForOcrMatch(string target, Rect rect = default, doub ```javascript // 点击坐标 (100, 200) -page.Click(100, 200); +page.click(100, 200); log.info('点击完成'); ``` @@ -455,63 +327,3 @@ public void Click(double x, double y) ``` - - -## 键盘鼠标操作 - -### Keyboard - -**属性说明** -- 类型:`IKeyboardSimulator` -- 提供键盘模拟功能 - -**使用场景** -- 输入文本 -- 按下/释放按键 -- 组合键操作 - -**JavaScript 调用示例** - -```javascript -// 输入文本 -page.Keyboard.TextEntry("Hello World"); - -// 按下单个按键 -page.Keyboard.KeyDown(65); // ASCII 码,A键 -page.Keyboard.KeyUp(65); - -// 组合键示例 -page.Keyboard.ModifiedKeyStroke(17, 65); // Ctrl+A -``` - -### Mouse - -**属性说明** -- 类型:`IMouseSimulator` -- 提供鼠标模拟功能 - -**使用场景** -- 鼠标移动 -- 鼠标点击 -- 鼠标拖拽 - -**JavaScript 调用示例** - -```javascript -// 移动鼠标 -page.Mouse.MoveMouseTo(100, 200); - -// 左键点击 -page.Mouse.LeftButtonClick(); - -// 左键双击 -page.Mouse.LeftButtonDoubleClick(); - -// 右键点击 -page.Mouse.RightButtonClick(); - -// 拖拽 -page.Mouse.LeftButtonDown(); -page.Mouse.MoveMouseBy(0, 100); -page.Mouse.LeftButtonUp(); -``` diff --git a/src/dev/js/rec.md b/src/dev/js/rec.md index c57ccb5..654b620 100644 --- a/src/dev/js/rec.md +++ b/src/dev/js/rec.md @@ -441,8 +441,8 @@ OpenCV Mat 矩阵对象,用于图像处理。 const captureRegion = captureGameRegion(); // 进行图像处理 - const grayMat = captureRegion.SrcMat.CvtColor(OpenCvSharp.ColorConversionCodes.BGR2GRAY); - const threshold = grayMat.Threshold(127, 255, OpenCvSharp.ThresholdTypes.Binary); + const grayMat = captureRegion.SrcMat.CvtColor(OpenCvSharp.OpenCvSharp.ColorConversionCodes.BGR2GRAY); + const threshold = grayMat.Threshold(127, 255, OpenCvSharp.OpenCvSharp.ThresholdTypes.Binary); // 获取坐标 const position = genshin.getPositionFromMap(); @@ -495,8 +495,8 @@ OpenCV 图像处理库的 JavaScript 接口。 const captureRegion = captureGameRegion(); // 进行图像处理 - const grayMat = captureRegion.SrcMat.CvtColor(OpenCvSharp.ColorConversionCodes.BGR2GRAY); - const threshold = grayMat.Threshold(127, 255, OpenCvSharp.ThresholdTypes.Binary); + const grayMat = captureRegion.SrcMat.CvtColor(OpenCvSharp.OpenCvSharp.ColorConversionCodes.BGR2GRAY); + const threshold = grayMat.Threshold(127, 255, OpenCvSharp.OpenCvSharp.ThresholdTypes.Binary); // 模板匹配 const template = file.readImageMatSync("assets/template.png");