Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: [CN,EN,JP,TW] GET_SHIP was incorrectly identified. #3830

Open
wants to merge 4 commits into
base: dev
Choose a base branch
from

Conversation

zuak110
Copy link
Contributor

@zuak110 zuak110 commented May 29, 2024

描述

在目前的后宅爱心与家具币收集逻辑中,需要先点击“管理”再退出以得到后宅全部视野。
但是当程序进入后宅管理页面后([dorm.py:L493] self.ui_goto(page_dorm, skip_first_screenshot=True)),会错误识别到GET_SHIP导致程序出错无法继续工作。

问题分析

当前版本中 GET_SHIP 使用屏幕右下角的纯白色块来识别是否获得了船,后宅管理页面下方也为纯白色,这导致使用ui_goto()函数进入后宅页面后,识别到了 GET_SHIP,进而触发了以下代码后出现错误。

触发顺序:
[dorm.py:L493]
self.ui_goto(page_dorm, skip_first_screenshot=True) ->
    self.ui_additional() ->
        self.ui_page_main_popups() ->
            if get_ship:
                if self.appear_then_click(GET_SHIP, interval=5):
                    return True

解决方法

更换了GET_SHIP的识别方案。

测试

采用自建测试集,分为了有新船无新船两部分截图,分别进行测试。
测试了各个稀有度(白、蓝、紫、金、彩、Meta)的建造收获界面,均可以正常识别出GET_SHIP,未影响原有功能。
测试了常用的其他界面,均未识别出GET_SHIP,符合预期。

可能存在的问题

仅测试了国服相关界面,未测试其他服务器,同时自建测试集无法保证测试的全面性。

TODO

由于新版本增加了一键收集功能,接下来打算修改收集逻辑,通过识别新按钮直接进行爱心和家具币的收集。

与此问题相关的Issues

#3760 #3787 本人也出现了此问题

@zuak110
Copy link
Contributor Author

zuak110 commented May 29, 2024

看了先前两个被关闭的PR(#3782#3560),也是尝试修改 GET_SHIP,但是由于Meta船界面与其他船获取界面不同,直接识别左侧按钮会出现问题。

个人觉得如果要动 GET_SHIP,同时还要考虑底色和透明度对GET_SHIP可能造成的影响,只能通过识别屏幕右下角按钮和左下角分享按钮的小范围色块来实现。当前方案是通过增加白色块和箭头中间的小部分暗色区域来实现的。这一改动可以和其他所有此处有纯白背景的界面进行区分。

我提交PR前对我能想到的界面都进行了测试,但是更大范围的测试的确是必要的,否则可能会影响其他基础功能。

下一步可能还是要优先处理后宅的收集逻辑,避免进入管理页面。

@Air111
Copy link
Contributor

Air111 commented May 29, 2024

当前方案是通过增加白色块和箭头中间的小部分暗色区域来实现的。这一改动可以和其他所有此处有纯白背景的界面进行区分。

这个暗色区域是否会因为具体舰船而变化?比如金船的底色是黄的

如果要识别非纯白色的区域,或许可以参考一下IDLE的识别

@zuak110
Copy link
Contributor Author

zuak110 commented May 29, 2024

这个暗色区域是否会因为具体舰船而变化?比如金船的底色是黄的

对的,由于各舰船底色不同,导致这部分暗色区域会因为底色不同而发生一些颜色的变化。

例如在我的测试中暗色区域摘出了如下颜色:
白船 #74777b RGB: (116, 119, 123)
蓝船 #6e7a87 RGB: (110, 122, 135)
紫船 #777185 RGB: (119, 113, 133)
金船 #867a69 RGB: (134, 122, 105)
彩船 #83817b RGB: (131, 129, 123)
Meta #6b686c RGB: (107, 104, 108)

考虑识别区域为3X30的像素空间,有影响的暗色区域为3X3,用CIE76计算平均色差,不同颜色舰船的整体色差控制在25%以内,平均色差为20%。

之所以考虑这种解决方法也是因为按钮本身对底色做了一次不透明处理,使得不同底色对这部分区域的影响不会特别明显,不然那就会出现识别紫船不识别蓝船的尴尬情况。

我个人测试了后是不影响各颜色舰船的识别的,但是我也担心有意外情况出现,所以尽可能将暗色区域放的比较小,只要偏移纯白色一丁点就可以了。

如果要识别非纯白色的区域,或许可以参考一下IDLE的识别

哈哈哈好的好的

@LmeSzinc LmeSzinc added the assets issue / 资源适配问题 maybe need replace some asset label May 29, 2024
@Air111
Copy link
Contributor

Air111 commented Jun 1, 2024

#3843

@LmeSzinc
Copy link
Owner

LmeSzinc commented Jun 2, 2024

具有背景颜色的区域用来算平均颜色是不严谨的,不要这样做。
GET_SHIP的改法两种,一个是选择一个有足够特征的区域进行模板匹配,比如边上的锁定按钮分享按钮;二个是选择另一个非白色的区域用来排除,需要当前 GET_SHIP 是白色且附近的某个区域不是白色

@zuak110
Copy link
Contributor Author

zuak110 commented Jun 2, 2024

具有背景颜色的区域用来算平均颜色是不严谨的,不要这样做。 GET_SHIP的改法两种,一个是选择一个有足够特征的区域进行模板匹配,比如边上的锁定按钮分享按钮;二个是选择另一个非白色的区域用来排除,需要当前 GET_SHIP 是白色且附近的某个区域不是白色

同意。

提交PR前考虑过同时识别两处位置进行排除,也就是第二种方法,但由于调用过多做这种代码上的修改需要极其谨慎。

关于提到的这两种改法,我有一些考虑:

方法1:对左侧按钮进行模板匹配,但必须单独处理Meta结晶的界面(按钮位置与普通船不同);
方法2:同时识别两处做排除(或者识别一处附加附近非白色区域),以现在这张模板图为例,由于按钮一定存在非白色区域,这个区域可能是除了纯白色的任何颜色,那么对非白色区去色,然后截图当前界面,对截图的这部分区域的非白色再去色,最后进行模板匹配,也就是说实质上是二值化后再匹配。

你觉得哪种方法更合适一些?

@LmeSzinc
Copy link
Owner

尽量用模板匹配,比如对这里match_luma
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
assets issue / 资源适配问题 maybe need replace some asset 需要修改 / Request changes Changes required in PR
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants