You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提升游戏日志OCR准确率,解决Discord消息重复发送的技术咨询

提升游戏日志OCR准确率的策略(解决Discord消息重复问题)

问题背景

我编写了一段代码读取游戏日志并向Discord发送消息,代码可正常运行,但OCR准确率偏低,导致消息重复发送。尝试过二值化转黑字白底预处理,结果反而更糟。日志为深色背景、浅色文字,部分条目带有彩色名称前缀,需要提升OCR准确率以避免重复发送。

当前代码

import cv2
import numpy as np
import pytesseract
import time
import requests
import json
import pyautogui

# Discord Webhook地址
webhook_url = "https://discord.com/api/webhooks/1111838770568888401/GJeNJ9YrMgq6_Mn3XMcX2JQlvmlZsmGhNLp1sNSRpu1RxRXEwkctIUe_iRanurRz1pS8"

# 需监控的短语及对应Discord消息模板
target_phrases = {
    "was killed": "<@&1184910793871994920> Day{message}",
    "Tamed": "<@&1184962484675809340> Day{message}",
}

# Tesseract配置
tesseract_path = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
pytesseract.pytesseract.tesseract_cmd = tesseract_path

# OCR检测间隔(秒)
check_interval = 5

# 存储已处理过的事件,避免重复发送
previous_occurrences = set()

# 日志所在屏幕区域坐标(x, y, 宽度, 高度)
list_region = (750, 198, 400, 400)

# 发送Discord消息函数
def send_discord_message(message):
    data = {"content": message}
    headers = {"Content-Type": "application/json"}
    response = requests.post(webhook_url, data=json.dumps(data), headers=headers)
    if response.status_code != 204:
        print("发送Discord消息失败:", response.text)
    else:
        print("Discord消息发送成功")

# 主循环
while True:
    # 截取指定区域的屏幕截图
    screenshot = pyautogui.screenshot(region=list_region)
    screenshot = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)

    # OCR提取文本
    extracted_text = pytesseract.image_to_string(screenshot)
    print("提取到的文本:\n", extracted_text)

    # 按"Day"分割日志条目
    messages = extracted_text.strip().split('Day')

    # 处理每个日志条目
    for message in messages:
        # 检查是否包含目标短语且未处理过
        for target_phrase, discord_message in target_phrases.items():
            if target_phrase.lower() in message.lower() and message.strip() not in previous_occurrences:
                print(f"检测到短语 '{target_phrase}'")
                send_discord_message(discord_message.format(message=message))
                previous_occurrences.add(message.strip())

    # 等待下一次检测
    time.sleep(check_interval)

提升OCR准确率的策略

一、针对性图像预处理

针对深色背景浅色文字的日志,普通二值化会丢失细节,改用以下预处理步骤:

  • 颜色反转+自适应二值化:先反转颜色让文字变黑、背景变白,再用自适应阈值处理(适配局部光照差异):
    # 反转颜色
    screenshot = cv2.bitwise_not(screenshot)
    # 转灰度后做自适应二值化
    gray = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)
    thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    
  • 灰度化+降噪:先转灰度,再用高斯模糊去除屏幕噪点:
    gray = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (3,3), 0)
    
  • 提升对比度:增强文字与背景的区分度:
    alpha = 1.5  # 对比度增益
    beta = 0     # 亮度调整
    adjusted = cv2.convertScaleAbs(screenshot, alpha=alpha, beta=beta)
    

二、Tesseract参数优化

  • 限定语言与字符集:指定英文识别,同时限定允许识别的字符范围,减少错误:
    # --psm 6:假设输入是单一均匀文本块;字符白名单限定日志常见字符
    extracted_text = pytesseract.image_to_string(thresh, lang='eng', config='--psm 6 -c tessedit_char_whitelist="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,!\'"')
    
  • 调整页面分割模式(PSM):日志是规整的条目,用--psm 6或--psm 7(单段文本)更合适,避免Tesseract误分割。

三、优化去重与匹配逻辑

即使OCR有小错误,也能通过逻辑避免重复发送:

  • 模糊匹配替代精确匹配:用fuzzywuzzy库做部分匹配,容忍个别字符识别错误:
    from fuzzywuzzy import fuzz
    
    # 替换原精确匹配逻辑,匹配阈值可调整(如80)
    if fuzz.partial_ratio(target_phrase.lower(), message.lower()) > 80 and message.strip() not in previous_occurrences:
        # 发送消息逻辑
    
  • 基于关键标识去重:提取日志中的唯一标识(如Day后的数字),只记录这些标识,而非整句,避免因OCR小错误导致重复:
    # 提取Day后的数字示例
    import re
    day_match = re.search(r'Day(\d+)', extracted_text)
    if day_match:
        day_id = day_match.group(1)
        if day_id not in previous_occurrences:
            # 发送消息并记录day_id
    
  • 时间窗口去重:记录事件的时间戳,最近N分钟内的相同事件不再发送,避免重复识别同一条日志。

四、其他辅助措施

  • 缩小截图区域:确保截图只包含日志条目,排除游戏UI边框、按钮等干扰元素;
  • 提升游戏分辨率:更高分辨率下文字更清晰,OCR准确率自然提升;
  • 训练自定义Tesseract模型:如果日志使用固定字体,收集该字体的样本训练自定义语言包,可大幅提升识别精度(适合长期使用场景)。

内容的提问来源于stack exchange,提问作者NooberPlays

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:18:17