From af111da7785faf934cf212d1dd8e068084f2d0ff Mon Sep 17 00:00:00 2001 From: JJMdzh Date: Tue, 8 Apr 2025 19:49:42 +0800 Subject: [PATCH] =?UTF-8?q?OCR=E6=91=A9=E6=8B=89log=20(#539)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update repo.json * OCR摩拉log OCR识别摩拉输出到log * update repo.json --------- Co-authored-by: JJMdzh <205532257+JJMdzh@users.noreply.github.com> --- repo.json | 11 +- repo/js/OCR摩拉log/assets/CharacterMenu.png | Bin 0 -> 847 bytes repo/js/OCR摩拉log/main.js | 146 ++++++++++++++++++++ repo/js/OCR摩拉log/manifest.json | 13 ++ repo/js/OCR摩拉log/settings.json | 7 + 5 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 repo/js/OCR摩拉log/assets/CharacterMenu.png create mode 100644 repo/js/OCR摩拉log/main.js create mode 100644 repo/js/OCR摩拉log/manifest.json create mode 100644 repo/js/OCR摩拉log/settings.json diff --git a/repo.json b/repo.json index 3fafdcd2..0893aa5d 100644 --- a/repo.json +++ b/repo.json @@ -1,5 +1,5 @@ { - "time": "20250408175531", + "time": "20250408194152", "url": "https://github.com/babalae/bettergi-scripts-list/archive/refs/heads/main.zip", "file": "repo.json", "indexes": [ @@ -31781,6 +31781,15 @@ "description": "切换下一队~|~用于切换到下一队", "tags": [] }, + { + "name": "OCR摩拉log", + "type": "directory", + "hash": "823852e0542c74066794f2125532f9bb1927d94c", + "version": "1.0", + "author": "吉吉喵", + "description": "OCR摩拉log~|~OCR识别摩拉输出到log", + "tags": [] + }, { "name": "OCR购买食材", "type": "directory", diff --git a/repo/js/OCR摩拉log/assets/CharacterMenu.png b/repo/js/OCR摩拉log/assets/CharacterMenu.png new file mode 100644 index 0000000000000000000000000000000000000000..6896b154d19048dfac202c1697428046a0b9c5df GIT binary patch literal 847 zcmV-V1F-ywP)KmrZC?R}{y8_sz_EZ@#KSh(-u%jkIwD7b#kCA?T(H zE!`B{6zr;9xGSQVMa2lN{9KiiWkj)(g_4y@i$$!hR;bc+B&KLg;#Wd!CKK~!-o3}g zWRe+~H#30}7x52w@$NhS`#umQ`KU2*(cXrG5Pxd|g~55s%SzyoXzNGlW9{JQ4Qo z-OXn^HZ$XS0I0E%jJU4DH~UX>_pbqxaVOAg5x6rj&fqVnSiU@gV@EiAyocVtn>43l z!Ql$r9)87@AHHKtM?1c+ixF$B`T383Xj{1~m^_QNmIT@9*Q8QOj1eyM{l@C%Budr3 zCF$lkkA|MH^^-K9ncEx33e^=YpSc|$u~7RUVNm2n zkOn=FGUXZHG~|c~6?PVYWhuVey^W#glT78jz%iMdVerK?sb$HclL|V&{er)TCu;Jt zIgkFQQ*27FLmOQTb!;RfBH+3X=X$R(`g|O#N-_|@Qi?A>-%iVlCd}*tu~?Me%h!4M zcr=iw1a@xkU{iV>g+gIoxMXBUA}FhN1}YSMjHxUVkw_RTAitO3`x>ovrt02}^r{5+`u`>U(HgWi zr85?6rRs{7pvoF0H*7W3Hz`Ghoi#VP5d04f+7c}iOHE^-1g*Ei?Sd^}lJ^cRXgW!hV2>ZUS($JR-7V8P4RCxXg12E&|>n>0Y-hz2~ Z-T)=~pgvr=IH&*s002ovPDHLkV1ipMm0AD* literal 0 HcmV?d00001 diff --git a/repo/js/OCR摩拉log/main.js b/repo/js/OCR摩拉log/main.js new file mode 100644 index 00000000..a2187246 --- /dev/null +++ b/repo/js/OCR摩拉log/main.js @@ -0,0 +1,146 @@ +// 定义替换映射表 +const replacementMap = { + "监": "盐", + "卵": "卯" +}; + +// 定义所有图标的图像识别对象,每个图片都有自己的识别区域 +let CharacterMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/CharacterMenu.png"), 60, 991, 38, 38); + +// 定义一个函数用于识别图像 +async function recognizeImage(recognitionObject, timeout = 5000) { + let startTime = Date.now(); + while (Date.now() - startTime < timeout) { + try { + // 尝试识别图像 + let imageResult = captureGameRegion().find(recognitionObject); + if (imageResult) { + // log.info(`成功识别图像,坐标: x=${imageResult.x}, y=${imageResult.y}`); + // log.info(`图像尺寸: width=${imageResult.width}, height=${imageResult.height}`); + return { success: true, x: imageResult.x, y: imageResult.y }; + } + } catch (error) { + log.error(`识别图像时发生异常: ${error.message}`); + } + await sleep(500); // 短暂延迟,避免过快循环 + } + log.warn(`经过多次尝试,仍然无法识别图像`); + return { success: false }; +} + +// 定义一个函数用于识别文字并点击 +async function recognizeTextAndClick(targetText, ocrRegion, timeout = 5000) { + let startTime = Date.now(); + let retryCount = 0; // 重试计数 + while (Date.now() - startTime < timeout) { + try { + // 尝试 OCR 识别 + let resList = captureGameRegion().findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); // 指定识别区域 + // 遍历识别结果,检查是否找到目标文本 + for (let res of resList) { + // 后处理:根据替换映射表检查和替换错误识别的字符 + let correctedText = res.text; + for (let [wrongChar, correctChar] of Object.entries(replacementMap)) { + correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); + } + + if (correctedText.includes(targetText)) { + // 如果找到目标文本,计算并点击文字的中心坐标 + let centerX = res.x + res.width / 2; + let centerY = res.y + res.height / 2; + await click(centerX, centerY); + await sleep(500); // 确保点击后有足够的时间等待 + return { success: true, x: centerX, y: centerY }; + } + } + } catch (error) { + retryCount++; // 增加重试计数 + log.warn(`页面标志识别失败,正在进行第 ${retryCount} 次重试...`); + } + await sleep(1000); // 短暂延迟,避免过快循环 + } + log.warn(`经过多次尝试,仍然无法识别文字: ${targetText}`); + return { success: false }; +} + +// 定义一个独立的函数用于在指定区域进行 OCR 识别并输出识别内容 +async function recognizeTextInRegion(ocrRegion, timeout = 5000) { + let startTime = Date.now(); + let retryCount = 0; // 重试计数 + while (Date.now() - startTime < timeout) { + try { + // 在指定区域进行 OCR 识别 + let ocrResult = captureGameRegion().find(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); + if (ocrResult) { + // 后处理:根据替换映射表检查和替换错误识别的字符 + let correctedText = ocrResult.text; + for (let [wrongChar, correctChar] of Object.entries(replacementMap)) { + correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar); + } + return correctedText; // 返回识别到的内容 + } else { + log.warn(`OCR 识别区域未找到内容`); + return null; // 如果 OCR 未识别到内容,返回 null + } + } catch (error) { + retryCount++; // 增加重试计数 + log.warn(`OCR 摩拉数识别失败,正在进行第 ${retryCount} 次重试...`); + } + await sleep(500); // 短暂延迟,避免过快循环 + } + log.warn(`经过多次尝试,仍然无法在指定区域识别到文字`); + return null; // 如果未识别到文字,返回 null +} + +(async function () { + setGameMetrics(1920, 1080, 1); + await genshin.returnMainUi(); + const notification = settings.notification || false; + + // 按下 C 键 + keyPress("C"); + await sleep(1500); + + let recognized = false; + + // 识别“角色菜单”图标或“天赋”文字 + let startTime = Date.now(); + while (Date.now() - startTime < 5000) { + // 尝试识别“角色菜单”图标 + let characterMenuResult = await recognizeImage(CharacterMenuRo, 5000); + if (characterMenuResult.success) { + await click(177, 433); + await sleep(500); + recognized = true; + break; + } + + // 尝试识别“天赋”文字 + let targetText = "天赋"; + let ocrRegion = { x: 133, y: 395, width: 115, height: 70 }; // 设置对应的识别区域 + let talentResult = await recognizeTextAndClick(targetText, ocrRegion); + if (talentResult.success) { + log.info(`点击天赋文字,坐标: x=${talentResult.x}, y=${talentResult.y}`); + recognized = true; + break; + } + + await sleep(1000); // 短暂延迟,避免过快循环 + } + + // 如果识别到了“角色菜单”或“天赋”,则识别“摩拉数值” + if (recognized) { + let ocrRegionMora = { x: 1620, y: 25, width: 152, height: 46 }; // 设置对应的识别区域 + let recognizedText = await recognizeTextInRegion(ocrRegionMora); + if (recognizedText) { + log.info(`成功识别到摩拉数值: ${recognizedText}`); + if (notification) { + notification.Send(`摩拉数值: ${recognizedText}`); + } + } else { + log.warn("未能识别到摩拉数值。"); + } + } else { + log.warn("未能识别到角色菜单或天赋,跳过摩拉数值识别。"); + } +})(); diff --git a/repo/js/OCR摩拉log/manifest.json b/repo/js/OCR摩拉log/manifest.json new file mode 100644 index 00000000..e4ccd616 --- /dev/null +++ b/repo/js/OCR摩拉log/manifest.json @@ -0,0 +1,13 @@ +{ + "manifest_version": 1, + "name": "OCR摩拉log", + "version": "1.0", + "description": "OCR识别摩拉输出到log", + "authors": [ + { + "name": "吉吉喵", + } + ], + "settings_ui": "settings.json", + "main": "main.js", +} \ No newline at end of file diff --git a/repo/js/OCR摩拉log/settings.json b/repo/js/OCR摩拉log/settings.json new file mode 100644 index 00000000..b5d48fa7 --- /dev/null +++ b/repo/js/OCR摩拉log/settings.json @@ -0,0 +1,7 @@ +[ + { + "name": "notification", + "type": "checkbox", + "label": "通知" + } +]