From a60d6732f0b2e5c366c8b9014a94ace987fbfaae Mon Sep 17 00:00:00 2001 From: uye <99072975+ABA2396@users.noreply.github.com> Date: Thu, 31 Jul 2025 19:21:20 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E8=82=89=E9=B8=BD=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E8=AF=86=E5=88=AB=20(#13427)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * perf: 节点统一 hsv * perf: 普通战斗 hsv * fix: 部分节点得分过低 * chore: 肉鸽节点不使用 colorWithClose * chore: 调整安全屋模板 * perf: 优化绿色系识别 --- resource/tasks/Roguelike/JieGarden.json | 112 +++++++++++++----- .../JieGarden@Roguelike@StageSafeHouse.png | Bin 10687 -> 14644 bytes src/MaaCore/Vision/Matcher.cpp | 27 +++++ tools/MaskRangeTool/main.py | 30 +++-- 4 files changed, 128 insertions(+), 41 deletions(-) diff --git a/resource/tasks/Roguelike/JieGarden.json b/resource/tasks/Roguelike/JieGarden.json index 7ef4a24029..8d6f2bd600 100644 --- a/resource/tasks/Roguelike/JieGarden.json +++ b/resource/tasks/Roguelike/JieGarden.json @@ -534,8 +534,15 @@ }, "JieGarden@Roguelike@SquadDefault": {}, "JieGarden@Roguelike@StageBoons": { - "Doc": "得偿所愿", - "templThreshold": 0.95, + "Doc": "得偿所愿 绿色系", + "method": "HSVCount", + "colorWithClose": false, + "colorScales": [ + [ + [70, 0, 0], + [80, 255, 170] + ] + ], "next": ["JieGarden@Roguelike@StageBoonsEnter", "JieGarden@Roguelike@Stages#next"] }, "JieGarden@Roguelike@StageBoonsEnter": { @@ -544,9 +551,10 @@ "next": ["JieGarden@Roguelike@StageBoonsEnter", "JieGarden@Roguelike@StageEncounterJudgeClick"] }, "JieGarden@Roguelike@StageBoskyPassage": { - "Doc": "思维边界", + "Doc": "思维边界 粉色系", "baseTask": "JieGarden@Roguelike@Stage", "method": "HSVCount", + "colorWithClose": false, "colorScales": [ [ [150, 120, 50], @@ -560,11 +568,13 @@ "next": ["JieGarden@Roguelike@StageBoskyPassageEnter", "JieGarden@Roguelike@StageEncounterJudgeClick"] }, "JieGarden@Roguelike@StageCombatDps": { + "Doc": "普通战斗 紫色系", "method": "HSVCount", + "colorWithClose": false, "colorScales": [ [ - [127, 80, 50], - [136, 200, 180] + [130, 0, 30], + [140, 170, 150] ] ], "postDelay": 600, @@ -594,9 +604,16 @@ ] }, "JieGarden@Roguelike@StageConfrontation": { - "Doc": "狭路相逢", + "Doc": "狭路相逢 青色系", "baseTask": "JieGarden@Roguelike@Stage", - "templThreshold": 0.95, + "method": "HSVCount", + "colorWithClose": false, + "colorScales": [ + [ + [80, 0, 50], + [90, 255, 180] + ] + ], "next": ["JieGarden@Roguelike@StageEncounterEnter", "JieGarden@Roguelike@Stages#next"] }, "JieGarden@Roguelike@StageDreadfulFoe": { @@ -620,12 +637,17 @@ }, "JieGarden@Roguelike@StageDreadfulFoeEnter": {}, "JieGarden@Roguelike@StageEmergencyDps": { - "templThreshold": 0.95, + "Doc": "困难战斗 红色系", "method": "HSVCount", + "colorWithClose": false, "colorScales": [ [ - [0, 31, 51], - [179, 233, 226] + [0, 150, 50], + [10, 200, 210] + ], + [ + [170, 150, 50], + [180, 200, 210] ] ], "postDelay": 600, @@ -637,19 +659,28 @@ }, "JieGarden@Roguelike@StageEmergencyDpsEnter": {}, "JieGarden@Roguelike@StageEmergencyTransportation": { - "Doc": "先行一步,拒绝可以获取2希望", + "Doc": "先行一步,拒绝可以获取2希望 青色系", "baseTask": "JieGarden@Roguelike@Stage", "method": "HSVCount", + "colorWithClose": false, "colorScales": [ [ - [15, 1, 93], - [93, 129, 141] + [80, 0, 50], + [90, 255, 180] ] ], "next": ["JieGarden@Roguelike@StageEncounterEnter", "JieGarden@Roguelike@Stages#next"] }, "JieGarden@Roguelike@StageEncounter": { - "templThreshold": 0.96 + "Doc": "不期而遇 青色系", + "method": "HSVCount", + "colorWithClose": false, + "colorScales": [ + [ + [80, 0, 50], + [90, 255, 180] + ] + ] }, "JieGarden@Roguelike@StageEncounterDrawCopperResult": { "Docs": "某些事件需要投钱来判断结果,这里要点一下投钱结果页面的对号", @@ -697,9 +728,16 @@ "specificRect": [1100, 558, 111, 50] }, "JieGarden@Roguelike@StageGuidance": { - "Doc": "指点迷津", + "Doc": "指点迷津 粉色系", "baseTask": "JieGarden@Roguelike@Stage", - "templThreshold": 0.97, + "method": "HSVCount", + "colorWithClose": false, + "colorScales": [ + [ + [150, 120, 50], + [180, 200, 200] + ] + ], "next": ["JieGarden@Roguelike@StageGuidanceEnter", "JieGarden@Roguelike@Stages#next"] }, "JieGarden@Roguelike@StageGuidanceEnter": { @@ -708,19 +746,28 @@ "next": ["JieGarden@Roguelike@StageGuidanceEnter", "JieGarden@Roguelike@StageEncounterJudgeClick"] }, "JieGarden@Roguelike@StageProphecy": { - "Doc": "命运所指", + "Doc": "命运所指 青色系", "baseTask": "JieGarden@Roguelike@Stage", "method": "HSVCount", + "colorWithClose": false, "colorScales": [ [ - [18, 1, 94], - [93, 173, 109] + [80, 0, 50], + [90, 255, 180] ] ], "next": ["JieGarden@Roguelike@StageEncounterEnter", "JieGarden@Roguelike@Stages#next"] }, "JieGarden@Roguelike@StageSafeHouse": { - "templThreshold": 0.95 + "Doc": "安全屋 淡青色", + "method": "HSVCount", + "colorWithClose": false, + "colorScales": [ + [ + [90, 60, 90], + [95, 255, 180] + ] + ] }, "JieGarden@Roguelike@StageSafeHouseEnter": { "next": ["JieGarden@Roguelike@StageSafeHouseEnter", "JieGarden@Roguelike@StageEncounterJudgeClick"] @@ -735,7 +782,15 @@ "next": ["JieGarden@Roguelike@StageEncounterOption#next"] }, "JieGarden@Roguelike@StageTrader": { - "templThreshold": 0.95 + "Doc": "商店 绿色系", + "method": "HSVCount", + "colorWithClose": false, + "colorScales": [ + [ + [70, 0, 0], + [80, 255, 170] + ] + ] }, "JieGarden@Roguelike@StageTraderEnter": { "next": [ @@ -764,21 +819,14 @@ "exceededNext": ["JieGarden@Roguelike@ExitThenAbandon"] }, "JieGarden@Roguelike@StageWindAndRain": { - "Doc": "失与得", + "Doc": "失与得 青色系", "baseTask": "JieGarden@Roguelike@Stage", "method": "HSVCount", + "colorWithClose": false, "colorScales": [ [ - [18, 130, 155], - [20, 180, 180] - ], - [ - [15, 130, 160], - [16, 150, 220] - ], - [ - [15, 40, 85], - [95, 120, 110] + [80, 0, 50], + [90, 255, 180] ] ], "next": ["JieGarden@Roguelike@StageEncounterEnter", "JieGarden@Roguelike@Stages#next"] diff --git a/resource/template/Roguelike/JieGarden/JieGarden@Roguelike@StageSafeHouse.png b/resource/template/Roguelike/JieGarden/JieGarden@Roguelike@StageSafeHouse.png index 2fd990f3aeddf09a44dd0523552b8e7705f7caaf..df6c82b496aa3538d7aa7b2fb7df857d36c54bed 100644 GIT binary patch literal 14644 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

qKoAtj(|OwpJKQAwHV z#+l3~0SaNj`@If8-}4RUz*Aosu2!b1qj(n+sQCWTnf*Wb^4!n8_tA~b?LYbKQzs5B z=47ef>0PTgII;Qhv7+Y+0KRv3Ci^@xII3#N2=?WrYa3g;p6eVvIRE5>$6UZWtO7Cx z%$4%^!mKvtSKj&X((>y4hZZV@0%Uf1ZR7vF^T7{3KesqB{_OF4N}daQW?R-^1)v9( z7@`y&@PdAMkbx0fg_2?%7&n|tAu9-+aW*hR6=SqcyJpJ#Jc*)i9EXgdUu3R#`_2%v z|0QiS0dSUX)`qzMwLi%ac@_->gt;qm4#-Rro1mX)WhLQQ6bQxx%Pz&iWWQB1nrG({ zx_-MdoORPoAXfUFTE7Ff8d%PWzXe%NMN>6BPdNDoV)mo?|ibn(?sc#u-4jb0GJ)F zIZ~vLlL=ut?gl|4oxXbG!;4q?MyH2o$(3f~H-30>Fr+)WH2cS%f8zN33>RGQaYVYk z@Y3ea$5)njBLlAQ2v$z|B@>eCCtgux2g;@J8I>tk>iNCOF=5cNlrz~kxNB!wa~hI1Rat%)Hp14Mi8oX8H81}W*~hwqyi zA31yN=0KtQ^-oR~T-T9ur`t0CmK1`sJq;tZe0!|T+h@=Ho8SK4#g+AnS8#1F*6Qr_ z)m!yO5QN`&{GlPwr@bw=D&R$Mo4DLuz47E88Ok5l2thhnKfA=9CbgPxP7S#3M*V%a0@$3bX0J$C>@Awk$6 z(+0M~c*qzl6j`|n?9POaw8>o&X-`ZfB0-s@5M+u`p2e~bmr2*B(Fw&dXw-u^ZW!%E z0S7>*Af)5C1w;&_6{Yki0su=Vmwg{SH7AAbjUCyGA4boED9uc45! zRy+yFm`EpEs~hipdEvy;d~MnzxPt}otW(K)C-}WHUtU~Z8>?1^%SG3*0qFNmpWSV? zJKZ2rYOoM+!1I6lv4>uH;Fu+>1LGr0^ZP%%wYC$6VDwGbb;P(q9+6JseufqaWVTlp zj<0xHN43&g2MO^=dPYiCu8EN`;rZDerDlw|{VZ9tq_y5d0#akhh*AFA+_DYG3nj3n z@e8KaihJEKjkDtsiCR?xVo|R-@f jpeg_params = { cv::IMWRITE_JPEG_QUALITY, 95, cv::IMWRITE_JPEG_OPTIMIZE, 1 }; + asst::imwrite( + utils::path("debug/hsv/" + text + "_" + utils::get_time_filestem() + ".jpg"), + cropped, + jpeg_params); + } +#endif + // FIXME: 老接口太难重构了,先弄个这玩意兼容下,后续慢慢全删掉 m_result.rect = rect; m_result.score = max_val; diff --git a/tools/MaskRangeTool/main.py b/tools/MaskRangeTool/main.py index 99d0c00786..e89ad94a05 100644 --- a/tools/MaskRangeTool/main.py +++ b/tools/MaskRangeTool/main.py @@ -16,24 +16,36 @@ if __name__ == '__main__': rgb_base_mask_range_ignore_dark = [[[20, 20, 20], [255, 255, 255]]] # 忽略暗色背景 # 自动判断图片的合适 mask_ranges - # image = cv2.imread(str(maa_dir / "resource" / "template" / "StartToVisit.png")) + # image = cv2.imread(str(maa_dir / "resource" / "template" / "Roguelike" / "JieGarden" / "JieGarden@Roguelike@StageConfrontation.png")) # generate_mask_ranges(image, 'luv', luv_base_mask_range_ignore_light_dark) # generate_mask_ranges(image, 'hsv', hsv_base_mask_range_ignore_dark) # generate_mask_ranges(image, 'rgb', rgb_base_mask_range_ignore_dark) # 在给定的 mask_ranges 下展示一张图 - image = cv2.imread(str(maa_dir / "resource" / "template" / "StartToVisit.png")) - mask_ranges = [[[250, 250, 250], [255, 255, 255]]] - show_image_mask(image, calc_mask_from_ranges(image, mask_ranges, 'rgb', True), 'rgb') + image = cv2.imread(str(maa_dir / "resource" / "template" / "Roguelike" / "JieGarden" / "JieGarden@Roguelike@StageBoons.png")) + mask_ranges = [ + [ + [70, 0, 0], + [80, 255, 170] + ] + ] + + show_image_mask(image, calc_mask_from_ranges(image, mask_ranges, 'hsv', False), 'hsv') # mask_ranges = [[[93, 81, 130], [102, 97, 142]], [[128, 100, 164], [134, 110, 169]], [[95, 85, 145], [105, 95, 155]]] # show_image_mask(image, calc_mask_from_ranges(image, mask_ranges, 'luv', True), 'luv') # 在给定的 mask_ranges 下比较两张图 - image1 = cv2.imread(str(maa_dir / "resource" / "template" / "StartToVisit.png")) - image2 = cv2.imread(str(maa_dir / "resource" / "template" / "StartToVisitDetermine.png")) - mask_ranges = [[[250, 250, 250], [255, 255, 255]]] - compare_2_image_with_mask_ranges(image1, image2, mask_ranges, "rgb") - compare_2_image_with_mask_ranges(image1, image2, mask_ranges, "rgb", True) + image1 = cv2.imread(str(maa_dir / "resource" / "template" / "Roguelike" / "JieGarden" / "JieGarden@Roguelike@StageSafeHouse.png")) + image2 = cv2.imread(str(maa_dir / "resource" / "template" / "Roguelike" / "JieGarden" / "JieGarden@Roguelike@StageConfrontation.png")) + mask_ranges = [ + [ + [85, 0, 60], + [95, 240, 240] + ] + ] + + # compare_2_image_with_mask_ranges(image1, image2, mask_ranges, "hsv") + # compare_2_image_with_mask_ranges(image1, image2, mask_ranges, "hsv", True) # mask_ranges = [[[93, 81, 125], [102, 97, 150]], [[95, 85, 145], [105, 95, 155]]] # compare_2_image_with_mask_ranges(image1, image2, mask_ranges, "luv") # compare_2_image_with_mask_ranges(image1, image2, mask_ranges, "luv", True)