· 4 years ago · Jul 02, 2021, 06:08 AM
1import os
2import io
3from aip import AipOcr
4from PIL import Image
5import pandas as pd
6
7#这里调用的百度的API,自己去申请QAQ
8APP_ID = '23****47'
9API_KEY = 'n*****tyALkG3jbeyhpceMQ5'
10SECRET_KEY = 'Z*****pSIKeVbHxgnwgR7nG8amPD9FR'
11client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
12
13#下面的所有都需要自适应自己的设备
14#这里是名字截取的大小
15rectSizName = 375,91
16#这里是伤害框截取的大小
17rectSizDamage = 307,83
18#这里是名字的相对位置
19namePos = [(830, 373), (833, 533), (830, 696), (833, 853)]
20#这里是伤害的相对位置
21damegePos = [(1780, 373), (1780, 533), (1780, 696), (1780, 853)]
22
23
24
25#将图片转为字节码
26def toByte(img):
27 imgByteArr = io.BytesIO()
28 img.save(imgByteArr, format='PNG')
29 imgByteArr = imgByteArr.getvalue()
30 return imgByteArr
31
32
33
34
35#将path目录下的所有图片(当前层),通过百度的图像识别,保存至df(即dataframe)的col_name那一列上面。
36def getDateFrame(df,col_name,path):
37 #遍历这个目录下的所有名字
38 list = os.listdir(path)
39
40 #新建一列
41 df[col_name] = None
42
43 for picture in list:
44 #如果文件不是png格式,那么直接continue,jpg格式我没测试过不知道
45 if picture[len(picture)-3:] != 'png':
46 continue
47 #输出一下图片的名字
48 print(picture)
49
50 #打开图片
51 img = Image.open(path + '\\' + picture)
52
53 #因为每个图片有四个伤害值
54 for i in range(4):
55 #截获名字的那小部分图
56 nameCrop = img.crop((namePos[i][0],namePos[i][1],namePos[i][0]+rectSizName[0],namePos[i][1]+rectSizName[1]))
57 #截获伤害的那一小部分图
58 damageCrop = img.crop((damegePos[i][0],damegePos[i][1],damegePos[i][0]+rectSizDamage[0],damegePos[i][1]+rectSizDamage[1]))
59
60 #调用API之后,返回的结果保存至words_result里面
61 words_result = client.basicGeneral(toByte(nameCrop))['words_result']
62
63 #如果啥都没查到,意味着断网,或者识别了个寂寞(即没有伤害值)
64 if len(words_result) == 0 :
65 break
66
67 #名字获得
68 name = words_result[0]['words']
69
70 #这里是把守护者基地的等级给刨掉了。写的有点丑
71 if(len(name)>=3):
72 name = name[:len(name)-2]
73 if name[-1]>='0' and name[-1]<='9' :
74 name = name[:len(name) - 1]
75 if name[-1] >= '0' and name[-1] <= '9':
76 name = name[:len(name) - 1]
77
78 #这里是调用API 获得伤害值
79 words_result = client.basicGeneral(toByte(damageCrop))['words_result']
80 if len(words_result) == 0 :
81 break
82
83 #获取啦!保存至damage里面,因为可能很坑!所以需要格式处理一下子,保存到tmp里面。
84 damage = words_result[0]['words']
85 tmp = ""
86 for i in range(len(str(damage))):
87 if(str(damage)[i]>='0' and str(damage)[i]<='9') :
88 tmp = tmp + str(damage)[i]
89
90 #这里name就是名字,tmp就是对应的伤害值
91 print(name,tmp)
92
93 #将对应列对应行设置成伤害值。
94 df._set_value(name,col_name,tmp)
95 print(df)
96 df.to_csv(path + '\\' + 'result.csv', encoding='gbk')
97
98if __name__ == '__main__':
99 print("目录结构:在根目录下,用日期命名各个文件夹,称为日期文件夹,对于每个日期文件夹,里面存储png会战伤害截图")
100 print("即:")
101 print("root/")
102 print("root/2021-07-02/伤害1.png")
103 print("root/2021-07-02/伤害2.png")
104 print("root/2021-07-02/伤害3.png")
105 print("root/2021-07-03/伤害1.png")
106 print("root/2021-07-03/伤害2.png")
107 print("root/2021-07-03/伤害3.png")
108
109 print("""
110├─root
111│ │ final_result.csv
112│ ├─2021-07-02
113│ │ 伤害1.png
114│ │ 伤害2.png
115│ │ 伤害3.png
116│ │ result.csv
117│ │
118│ ├─2021-07-03
119│ │ 伤害1.png
120│ │ 伤害2.png
121│ │ 伤害3.png
122│ │ result.csv
123│ │
124│ ├─2021-07-04
125│ │ 伤害1.png
126│ │ 伤害2.png
127│ │ 伤害3.png
128│ │ result.csv""")
129
130 dir_path = input("请输入根目录,如(D:\KGQGJ\root):")
131 #dir_path = "D:\KGQGJ\A4"
132
133 df = pd.DataFrame()
134 df['name'] = None
135 df = df.set_index("name")
136
137
138 for file in os.listdir(dir_path):
139 file_path = os.path.join(dir_path, file)
140 if os.path.isdir(file_path):
141 print(file_path,file)
142 getDateFrame(df=df,col_name=file,path=file_path)
143
144 df.to_csv(dir_path + '\\' + 'final_result.csv', encoding='gbk')
145