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

使用pytesseract与cv2识别血条时OCR误判分隔线为数字1的解决问询

血条OCR误识别分隔线为数字1的可落地方案
  • 最省成本的思路是直接把分隔线踢出识别范围:你识别的是固定位置的游戏UI,这根竖分隔线的坐标是完全固定的,根本没必要让它进入OCR的识别域。
  • 裁剪OCR输入ROI的时候,沿着分隔线右侧往左多裁2-3个像素,把竖线完全排除在裁剪范围外,从根源上消除误判可能。
  • 如果裁剪框已经固定没法调整,就直接在预处理阶段把分隔线所在的像素区域,填充成和数字背景一致的纯黑色,对应代码:
# 假设分隔线在ROI左边缘x=0到x=8的像素范围
ocr_input_img[:, 0:8] = 0
  • 不想改裁剪框的话,可以用预处理滤除细竖线干扰:UI上的分隔线是很细的纵向线条,比真实数字的笔画细很多,用横向的小结构元做形态学开运算,就能把这种细竖线磨掉,完全不影响正常的数字笔画识别。
  • 对应实现代码:
gray = cv2.cvtColor(ocr_input_img, cv2.COLOR_BGR2GRAY)
_, img_bin = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 用横向2px、纵向1px的核,专门滤除细纵向干扰线
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 1))
clean_img = cv2.morphologyEx(img_bin, cv2.MORPH_OPEN, kernel)
  • 不要用Tesseract的默认配置识别,直接把识别范围卡死:本来要识别的内容只有数字和斜杠,根本不需要让模型去匹配其他字符,同时指定单行识别模式,减少模型的无依据猜测。
  • 调用的时候传入自定义配置即可:
# psm 7 表示把输入图当成独立单行文本处理,不做多余的版面分析
custom_config = r'--psm 7 -c tessedit_char_whitelist=0123456789/'
ocr_result = pytesseract.image_to_string(clean_img, config=custom_config).strip()

这个配置对小尺寸的单行数字识别准确率提升非常明显,能减少80%左右的无意义误判。

  • 最后加一层后置校验的兜底逻辑,不管前面的步骤有没有疏漏,这个逻辑都能把偏差拉回来:血条的固有格式永远是当前HP/最大HP,正常逻辑下当前HP绝对不会比最大HP高。
  • 拿到识别结果之后,按斜杠拆分两个数值,如果发现当前HP大于最大HP,就从识别结果的最左侧逐位删除数字,直到拆分后的数值符合逻辑即可。
  • 举个实际例子:拿到的错误识别结果是11189/10180,拆分后当前值11189比最大值10180大,删掉第一位得到1189/10180,还是超出最大值范围,再删第一位得到189/10180,这时候数值逻辑通顺,就是正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 08:36:05