提升游戏日志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
相关产品推荐
相关产品推荐

