|
@@ -1,13 +1,16 @@
|
1
|
1
|
import argparse
|
|
2
|
+import cv2
|
2
|
3
|
import glob
|
3
|
4
|
import os
|
4
|
5
|
import multiprocessing
|
|
6
|
+import numpy
|
5
|
7
|
from PIL import Image, ImageFilter
|
6
|
|
-from PIL.ImageOps import autocontrast, invert, grayscale, contain
|
|
8
|
+from PIL.ImageOps import autocontrast, invert, grayscale, contain, expand
|
7
|
9
|
import pytesseract
|
8
|
10
|
import signal
|
9
|
11
|
import sys
|
10
|
12
|
|
|
13
|
+
|
11
|
14
|
# ----
|
12
|
15
|
# Program
|
13
|
16
|
# ----
|
|
@@ -71,17 +74,17 @@ MOREINFO_TARGETS = [
|
71
|
74
|
|
72
|
75
|
KILLS_TARGETS = [
|
73
|
76
|
("Kill Points", (1418, 312), (1694, 352), True, False, 0),
|
74
|
|
- ("T1 Kills", (1321, 637), (1538, 684), True, False, 0),
|
|
77
|
+ ("T1 Kills", (1325, 637), (1538, 684), True, False, 0),
|
75
|
78
|
("T1 Kill Points", (1986, 637), (2212, 684), True, False, 0),
|
76
|
|
- ("T2 Kills", (1321, 702), (1538, 755), True, False, 0),
|
|
79
|
+ ("T2 Kills", (1325, 702), (1538, 755), True, False, 0),
|
77
|
80
|
("T2 Kill Points", (1986, 702), (2212, 755), True, False, 0),
|
78
|
|
- ("T3 Kills", (1321, 770), (1538, 824), True, False, 0),
|
|
81
|
+ ("T3 Kills", (1325, 770), (1538, 824), True, False, 0),
|
79
|
82
|
("T3 Kill Points", (1986, 770), (2212, 824), True, False, 0),
|
80
|
|
- ("T4 Kills", (1321, 847), (1538, 897), True, False, 0),
|
|
83
|
+ ("T4 Kills", (1325, 847), (1538, 897), True, False, 0),
|
81
|
84
|
("T4 Kill Points", (1986, 847), (2212, 897), True, False, 0),
|
82
|
|
- ("T5 Kills", (1321, 918), (1538, 968), True, False, 0),
|
|
85
|
+ ("T5 Kills", (1325, 918), (1538, 968), True, False, 0),
|
83
|
86
|
("T5 Kill Points", (1986, 918), (2212, 968), True, False, 0),
|
84
|
|
- ("Previous Kills", (1626, 985), (2228, 1039), False, False, 0)
|
|
87
|
+ ("Previous Kills", (1626, 985), (2228, 1039), False, False, -385)
|
85
|
88
|
]
|
86
|
89
|
|
87
|
90
|
# ----
|
|
@@ -132,24 +135,34 @@ def read_file(fileTuple):
|
132
|
135
|
|
133
|
136
|
# Read text from a section of an image using Tesseract
|
134
|
137
|
def read_string_from_image(rgbImage, box, is_number, inv, bonusRightTrim, debugFilePath):
|
135
|
|
- # Crop to correct dimentions
|
|
138
|
+ # Crop to correct dimensions
|
136
|
139
|
rgbImage = rgbImage.crop((box.x, box.y, box.x2, box.y2))
|
137
|
140
|
|
138
|
141
|
# Invert if flagged
|
139
|
142
|
if inv: rgbImage = invert(rgbImage)
|
140
|
143
|
|
141
|
|
- # Apply filters
|
142
|
|
- rgbImage = grayscale(rgbImage)
|
143
|
|
- rgbImage = autocontrast(rgbImage, cutoff=(0, 75))
|
|
144
|
+ # Apply Pillow filters to cut off artifacts
|
|
145
|
+ rgbImage = autocontrast(rgbImage, cutoff=(0, 50))
|
|
146
|
+
|
|
147
|
+ # Convert to OpenCV
|
|
148
|
+ npImage=numpy.array(rgbImage)
|
|
149
|
+
|
|
150
|
+ # Set colors to grayscale
|
|
151
|
+ npImage=cv2.cvtColor(npImage, cv2.COLOR_BGR2GRAY)
|
|
152
|
+
|
|
153
|
+ # Apply OpenCV Filters
|
|
154
|
+ npImage = cv2.medianBlur(npImage, 3)
|
|
155
|
+ _, npImage = cv2.threshold(npImage, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
|
|
156
|
+ # npImage = cv2.adaptiveThreshold(npImage, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
|
|
157
|
+
|
|
158
|
+ # Convert to Pillow
|
|
159
|
+ rgbImage = Image.fromarray(npImage)
|
144
|
160
|
|
145
|
161
|
# Crop to content
|
146
|
|
- bbox = autocontrast(invert(rgbImage), cutoff=(0, 90)).getbbox()
|
|
162
|
+ bbox = invert(rgbImage).getbbox()
|
147
|
163
|
if bbox: rgbImage = rgbImage.crop((bbox[0], bbox[1], bbox[2] + bonusRightTrim, bbox[3]))
|
148
|
|
-
|
149
|
|
- # Resize and sharpen
|
150
|
|
- rgbImage = contain(rgbImage, (800, 800), method=1)
|
151
|
|
- rgbImage = rgbImage.filter(ImageFilter.EDGE_ENHANCE_MORE)
|
152
|
|
- rgbImage = rgbImage.filter(ImageFilter.SHARPEN)
|
|
164
|
+ if bbox: rgbImage = rgbImage.crop(invert(rgbImage).getbbox())
|
|
165
|
+ rgbImage = expand(rgbImage, border=10, fill=255)
|
153
|
166
|
|
154
|
167
|
if arguments.debug:
|
155
|
168
|
rgbImage.save(debugFilePath)
|
|
@@ -205,7 +218,7 @@ if __name__ == '__main__':
|
205
|
218
|
# Get all previously scraped data # TODO: limit to filenames only
|
206
|
219
|
alreadyScraped = ""
|
207
|
220
|
for outputPath in [OUTPUT_PATH_PROFILE, OUTPUT_PATH_MOREINFO, OUTPUT_PATH_KILLS]:
|
208
|
|
- with open(projectFolder + outputPath, "r+", newline='', encoding='utf-8') as outputFile:
|
|
221
|
+ with open(projectFolder + outputPath, "w+", newline='', encoding='utf-8') as outputFile:
|
209
|
222
|
alreadyScraped = alreadyScraped + outputFile.read()
|
210
|
223
|
|
211
|
224
|
# Mark as duplicates
|