首页
/ 终极解决方案:OnmyojiAutoScript结界卡识别问题深度分析与修复指南

终极解决方案:OnmyojiAutoScript结界卡识别问题深度分析与修复指南

2026-02-05 05:35:57作者:温玫谨Lighthearted

OnmyojiAutoScript是一款功能强大的阴阳师自动化脚本工具,能够帮助玩家自动完成结界卡管理等多种游戏任务。其中结界卡识别功能作为核心模块,直接影响脚本的自动化效率和可靠性。本文将深入分析结界卡识别过程中常见的问题,并提供完整的解决方案,帮助用户轻松解决识别异常问题。

结界卡识别功能概述

结界卡系统是阴阳师游戏中的重要玩法,玩家通过放置不同类型的结界卡(如太鼓、斗鱼、太阴等)获取相应资源奖励。OnmyojiAutoScript的结界卡识别功能通过图像识别和OCR技术,自动识别好友结界中的可用结界卡类型及数值,实现智能选择最优结界卡进行寄养。

OnmyojiAutoScript界面预览 OnmyojiAutoScript主界面展示,包含结界卡管理模块入口

核心识别逻辑位于项目的两个关键文件中:

常见结界卡识别问题及表现

在实际使用过程中,结界卡识别可能会遇到多种问题,主要表现为以下几种情况:

1. 结界卡类型识别错误

系统可能将太鼓卡识别为斗鱼卡,或无法区分变异结界卡,导致选择错误的结界卡进行寄养。这通常是由于图像识别模板匹配度不足或游戏界面更新导致模板失效。

2. 数值提取不准确

OCR识别结界卡数值时出现偏差,如将"6"识别为"8",或无法提取数值,导致无法判断结界卡品质。这与游戏分辨率、字体渲染效果以及OCR算法参数设置有关。

3. 识别速度慢或超时

在滑动浏览好友结界列表时,识别速度慢导致错过最佳结界卡,或因超时终止识别流程。这与设备性能、网络延迟以及滑动策略有关。

4. 特殊场景处理失效

在好友结界满员、网络波动导致界面加载缓慢、或遇到特殊活动界面时,识别逻辑可能失效,导致脚本卡住或误操作。

问题深度分析

图像识别原理与局限

OnmyojiAutoScript采用模板匹配算法进行结界卡类型识别,通过预定义的结界卡图像模板与实时截图进行比对。项目中定义了多种结界卡模板,如:

# 太鼓6星结界卡识别模板
I_CARDS_KAIKO_6 = RuleImage(roi_front=(193,204,89,73), roi_back=(169,148,130,501), 
                            threshold=0.8, method="Template matching", 
                            file="./tasks/KekkaiActivation/cards/cards_cards_kaiko_6.png")

当游戏界面更新导致结界卡外观变化,或截图存在光照、角度差异时,模板匹配度会下降,导致识别错误。

OCR数值提取机制

数值提取采用OCR(光学字符识别)技术,通过识别结界卡详情界面中的数字文本获取资源数值:

def check_card_num(self) -> tuple[str, int]:
    # OCR识别
    raw_text = self.O_CARD_NUM.ocr(self.device.image)
    # 判断结界卡类型
    if any(c in raw_text for c in ['体', 'カ', '力']):
        card_type = '斗鱼'
    elif any(c in raw_text for c in ['勾', '玉']):
        card_type = '太鼓'
    # 提取纯数字部分
    cleaned = re.sub(r'[^\d+]', '', raw_text)
    match = re.search(r'\d+', cleaned)
    value = int(match.group()) if match else 0
    return card_type, value

当游戏字体模糊、背景复杂或存在特殊符号干扰时,OCR识别准确率会显著下降。

滑动与识别策略

脚本通过滑动屏幕浏览好友结界列表,每次滑动后进行结界卡识别:

def perform_swipe_action(self):
    duration = 2
    safe_pos_x = random.randint(340, 600)
    safe_pos_y = random.randint(500, 565)
    p1 = (safe_pos_x, safe_pos_y)
    p2 = (safe_pos_x, safe_pos_y - 416)
    self.device.swipe_adb(p1, p2, duration=duration)
    time.sleep(2)

固定的滑动距离和等待时间可能不适应不同设备的性能差异,导致截图时机不准确,影响识别效果。

完整解决方案

针对以上问题,我们提供以下系统性解决方案:

1. 更新图像识别模板

随着游戏版本更新,结界卡外观可能发生变化,需要定期更新识别模板。项目维护者可通过dev_tools/assets_extract.py工具重新生成最新的图像资源:

python dev_tools/assets_extract.py

普通用户可通过以下步骤手动更新模板:

  1. 截取最新的结界卡截图
  2. 调整图片尺寸和区域ROI
  3. 替换对应目录下的模板文件(如./tasks/KekkaiActivation/cards/)
  4. 调整匹配阈值(threshold)参数

2. 优化OCR识别参数

通过调整OCR识别参数提高数值提取准确率:

  1. 修改OCR区域ROI,确保只包含数值显示区域:
# 在assets.py中调整OCR区域
O_CARD_NUM = RuleOcr(roi=(926,262,95,31), area=(926,262,95,31), 
                     mode="Single", method="Default", name="card_number")
  1. 优化文本清理正则表达式,增强对特殊字符的处理:
# 增强版文本清理
cleaned = re.sub(r'[^\d+]', '', raw_text)
# 处理可能的全角数字
cleaned = cleaned.replace('0', '0').replace('1', '1').replace('2', '2').replace('3', '3')
cleaned = cleaned.replace('4', '4').replace('5', '5').replace('6', '6').replace('7', '7')
cleaned = cleaned.replace('8', '8').replace('9', '9')

3. 动态调整滑动策略

根据设备性能动态调整滑动参数,确保截图时机准确:

def perform_swipe_action(self):
    # 根据设备性能调整滑动参数
    device_performance = self.get_device_performance()  # 需要实现该方法
    duration = 1.5 if device_performance == "high" else 2.5
    wait_time = 1 if device_performance == "high" else 2
    
    safe_pos_x = random.randint(340, 600)
    safe_pos_y = random.randint(500, 565)
    p1 = (safe_pos_x, safe_pos_y)
    p2 = (safe_pos_x, safe_pos_y - 416)
    self.device.swipe_adb(p1, p2, duration=duration)
    time.sleep(wait_time)

4. 增强异常处理机制

完善异常处理逻辑,提高脚本稳定性:

def _current_select_best(self, best_card_type=None, best_card_num=0, selected_card=False):
    try:
        # 主识别逻辑
        # ...
    except Exception as e:
        logger.error(f"识别过程发生异常: {str(e)}")
        self.save_image(content=f"识别异常_{str(e)}")
        # 尝试恢复操作
        self.back_realm()
        return False

5. 配置调试模式

启用调试模式可以帮助定位识别问题:

# 在config.py中开启调试模式
config = {
    # ...
    "debug": True,
    "save_recognition_images": True  # 保存识别过程中的截图
}

开启后,脚本会将识别过程中的关键截图保存到本地,帮助分析识别失败原因。

高级优化技巧

对于有开发能力的用户,可以尝试以下高级优化:

1. 集成机器学习模型

替换传统的模板匹配和OCR识别,使用深度学习模型提高识别准确率。项目中预留了机器学习集成接口:

# 在module/ocr/models.py中实现自定义模型
class MLBasedOCR:
    def __init__(self):
        # 加载预训练模型
        self.model = self.load_model()
        
    def recognize(self, image):
        # 模型推理过程
        # ...
        return result

2. 多模板融合识别

结合多个模板匹配结果,提高识别鲁棒性:

def multi_template_matching(self, image, templates):
    results = []
    for template in templates:
        result = self.match_template(image, template)
        results.append(result)
    # 融合结果
    return self.fuse_results(results)

3. 自适应阈值调整

根据截图质量动态调整匹配阈值:

def adaptive_threshold(self, image):
    # 分析图像清晰度和对比度
    clarity = self.analyze_clarity(image)
    # 根据清晰度调整阈值
    return 0.75 if clarity > 0.8 else 0.65

总结与展望

结界卡识别是OnmyojiAutoScript的核心功能之一,其准确性直接影响脚本的使用体验。通过本文介绍的方法,用户可以有效解决常见的识别问题,提高脚本的稳定性和效率。

项目开发团队持续优化识别算法,未来将引入更先进的计算机视觉技术,如目标检测和语义分割,进一步提升识别准确率和鲁棒性。用户可通过定期更新项目代码获取最新改进。

OnmyojiAutoScript表格视图 结界卡识别结果以表格形式展示,清晰直观

希望本文提供的解决方案能帮助您更好地使用OnmyojiAutoScript,享受更流畅的游戏自动化体验!如有其他问题,欢迎在项目issue中反馈。

要开始使用OnmyojiAutoScript,请克隆仓库:

git clone https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript
登录后查看全文
热门项目推荐
相关项目推荐