-
Notifications
You must be signed in to change notification settings - Fork 7
/
ocr.py
100 lines (88 loc) · 3.89 KB
/
ocr.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
'''图像识别、文字处理,考虑多种ocr方式'''
from PIL import ImageGrab, Image
import re
from rapidocr_onnxruntime import RapidOCR
ocr = RapidOCR(det_use_dml=True, rec_use_dml=True)
def rapidocr(x, y, w, h):
'''返回使用paddle ocr引擎识别及处理结果
参数:
x:截图坐标x
y:截图坐标y
w:截图宽度w
h:截图高度h
返回:
basic:主词条等基本信息list
名称,部位,主属性,数值,等级
['雷云之笼', '时之沙', '攻击力', '46.6%', '+20']
result:副词条属性dict
key:词条属性(含百分比差异说明)
value:词条数值
如:{'防御力': 23.0, '元素充能效率': 5.8, '暴击伤害': 5.4}
'''
# 截屏与ocr识别
img = ImageGrab.grab(bbox = (x, y, x + w, y + h))
img.save('src/grab.png')
result, elapse = ocr('src/grab.png', use_det=True, use_cls=False, use_rec=True)
result = [item [1] for item in result]
# 千位符(含误识别的.)兼容
pattern_thou = r'\d\.\d{3}|\d\,\d{3}'
txt = [re.sub(pattern_thou, item.replace(',', '').replace('.', ''), item) for item in result]
print(txt)
name = txt[0].replace('明威之', '明威之镡').replace('无边醋乐之笼', '无边酣乐之筵').replace('无边醋乐之筵', '无边酣乐之筵').replace('浮溯之玉', '浮溯之珏').replace('阳之遗', '阳辔之遗').replace('遮雷之姿', '虺雷之姿').replace('海祗之冠', '海祇之冠').replace('海低之冠', '海祇之冠').replace('海张之冠', '海祇之冠').replace('蛋笑之面', '嗤笑之面').replace('金铜时唇', '金铜时晷').replace('将帅兜', '将帅兜鍪').replace('雷灾的子遗', '雷灾的孑遗').replace('星罗圭璧之唇', '星罗圭璧之晷').replace('魔岩琢塑之樽', '巉岩琢塑之樽').replace('宗室银瓷', '宗室银瓮')
parts = txt[1]
main_name = txt[2]
main_digit = txt[3]
lvl = txt[4]
basic = [name, parts, main_name, main_digit, lvl]
# 中文和数字正则
pattern_chinese = r'[\u4e00-\u9fa5]+'
pattern_digit = r'\d+(\.\d+)?'
result = {}
for item in txt[-4:]:
try:
# 词条名称
name = re.findall(pattern_chinese, item)
name = name[0]
# 数值
digit = float(re.search(pattern_digit, item).group())
# 兼容千位符
if digit < 2:
digit *= 1000
if name in '暴击率':
result['暴击率'] = digit
elif name in '暴击伤害':
result['暴击伤害'] = digit
elif name in '元素精通':
result['元素精通'] = digit
elif name in '攻击力' and '%' in item:
result['攻击力百分比'] = digit
elif name in '攻击力':
result['攻击力'] = digit
elif name in '生命值' and '%' in item:
result['生命值百分比'] = digit
elif name in '生命值':
result['生命值'] = digit
elif name in '防御力' and '%' in item:
result['防御力百分比'] = digit
elif name in '防御力':
result['防御力'] = digit
elif name in '元素充能效率':
result['元素充能效率'] = digit
else:
result[item] = 0
except:
result[item] = 0
print(basic, result)
return basic, result
if __name__ == '__main__':
# 截图坐标
x, y, w, h = (1808, 277, 377, 714) # 副词条
# x, y, w, h = (1948, 200, 360, 70) # 圣遗物名称
# ocr测试
import time
start = time.time()
rapidocr(x, y, w, h)
end = time.time()
print(end - start)
# import score
# print(score.cal_score(tesseract_ocr(x, y, w, h), '雷电将军'))