使用Pytesseract识别部落冲突截图数字失败,求技术解决方案
部落冲突截图数字识别异常问题排查与解决方法
我尝试用Pytesseract提取《部落冲突》游戏截图中的数字,但识别结果异常,输出内容为“Uke awl BOB C”。以下是实现代码及相关处理后的图像:
import cv2 import pytesseract image = cv2.imread('x.png',0) thresh = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY_INV)[1] kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) result = 255 - close data = pytesseract.image_to_string(result, lang='eng',config='--psm 6') print(data) cv2.imshow('thresh', thresh) cv2.imshow('result', result) cv2.imshow('close', close) cv2.waitKey()
原始截图:
形态学闭运算后的图像:
问题原因
- 游戏采用特殊艺术字体,Tesseract默认英文训练集对这类非标准字体识别准确率极低
- 当前固定阈值处理无法适配截图局部明暗差异,形态学操作的核大小导致字符特征被破坏
解决方法
1. 优化图像处理逻辑
改用自适应阈值处理,调整形态学核大小,突出数字字符特征:
import cv2 import pytesseract image = cv2.imread('x.png', 0) # 自适应高斯阈值,应对截图明暗不均问题 thresh = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 缩小核尺寸,避免字符粘连或变形 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1)) close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) result = 255 - close cv2.imshow('optimized_result', result) cv2.waitKey()
2. 限定Tesseract仅识别数字
通过配置参数过滤非数字字符,避免无关识别结果:
# 替换原识别代码,指定白名单仅包含数字 data = pytesseract.image_to_string(result, lang='eng', config='--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789') print(data)
参数说明:
--oem 3:启用默认OCR引擎模式tessedit_char_whitelist=0123456789:强制仅识别0-9的数字,排除其他字符干扰
3. 自定义字体训练(进阶方案)
如果上述方法仍达不到预期效果,可以针对游戏数字字体制作自定义训练集:
- 截取游戏中所有数字的清晰样本,生成Tesseract训练所需的
.tif图像和.box标注文件 - 使用Tesseract训练工具生成专属语言包,识别时指定该语言包即可大幅提升准确率
内容的提问来源于stack exchange,提问作者N.Armada
相关产品推荐
相关产品推荐

