Skip to content

Commit 8ffeeb1

Browse files
committedJan 21, 2023
added near block merge function and fixed some bugs
1 parent f833861 commit 8ffeeb1

File tree

11 files changed

+101
-15
lines changed

11 files changed

+101
-15
lines changed
 

‎main.py

Lines changed: 91 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,37 @@ def __update_database(self):
7878
i += 1
7979
break
8080

81+
def __distance(self, p1, p2):
82+
return ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2) ** 0.5
83+
84+
def __closest_pair(self, X, Y):
85+
if len(X) <= 3:
86+
return min([self.__distance(X[i], X[j]) for i in range(len(X)) for j in range(i+1, len(X))])
87+
88+
mid = len(X)//2
89+
XL, XR = X[:mid], X[mid:]
90+
YL, YR = [p for p in Y if p in XL], [p for p in Y if p in XR]
91+
92+
d = min(self.__closest_pair(XL, YL), self.__closest_pair(XR, YR))
93+
94+
line = (X[mid][0] + X[mid-1][0]) / 2
95+
YS = [p for p in Y if abs(p[0]-line) < d]
96+
97+
return min(d, self.__closest_split_pair(YS, d))
98+
99+
def __closest_split_pair(self, Y, d):
100+
n = len(Y)
101+
for i in range(n-1):
102+
for j in range(i+1, min(i+8, n)):
103+
if self.__distance(Y[i], Y[j]) < d:
104+
d = self.__distance(Y[i], Y[j])
105+
return d
106+
107+
def __dis(self, p1, p2):
108+
X = p1 + p2
109+
Y = sorted(X, key=lambda p: (p[0], p[1]))
110+
return self.__closest_pair(X, Y)
111+
81112
def search(self, keyword):
82113
'''
83114
Search a plane by it registration number
@@ -131,30 +162,73 @@ def recognize(self, image):
131162
ocr_filter = []
132163

133164
for _ in range(self.times):
165+
# OCR recognize
166+
pocr_result = self.__pocr.ocr(img, cls=True)
167+
if self.debug:
168+
print(pocr_result)
169+
print("------------------------------B-")
134170
eocr_result = self.__eocr.readtext(img, detail=1)
135171
if self.debug:
136172
print(eocr_result)
137-
print("------------------------------")
138-
pocr_result = self.__pocr.ocr(img, cls=True)
173+
print("------------------------------A-")
174+
175+
# OCR results tidy up
176+
for i in range(len(pocr_result[0])):
177+
for j in range(len(pocr_result[0])):
178+
if self.debug:
179+
print("------------------------------D-")
180+
print(pocr_result[0][i][0], pocr_result[0][j][0])
181+
if i != j and len(pocr_result[0][i][0]) == 4 and len(pocr_result[0][j][0]) == 4 and self.__dis(pocr_result[0][i][0], pocr_result[0][j][0]) < 5:
182+
if self.debug:
183+
print("D Appended")
184+
pocr_result.append(((pocr_result[0][i][0], pocr_result[0][j][0]), pocr_result[0][i][1][1] + pocr_result[0][j][1][1], (pocr_result[0][i][1][2] + pocr_result[0][j][1][2]) / 2))
185+
pocr_result.append(((pocr_result[0][j][0], pocr_result[0][i][0]), pocr_result[0][j][1][1] + pocr_result[0][i][1][1], (pocr_result[0][j][1][2] + pocr_result[0][i][1][2]) / 2))
186+
else:
187+
if self.debug:
188+
disout = 0
189+
if len(eocr_result[i][0]) == 4 and len(eocr_result[j][0]) == 4:
190+
disout = self.__dis(pocr_result[0][i][0], pocr_result[0][j][0])
191+
print(i != j, len(pocr_result[0][i][0]) == 4, len(pocr_result[0][j][0]) == 4, disout)
192+
print("------------------------------D-")
193+
194+
for i in range(len(eocr_result)):
195+
for j in range(len(eocr_result)):
196+
if self.debug:
197+
print("------------------------------C-")
198+
print(eocr_result[i][0], eocr_result[j][0])
199+
if i != j and len(eocr_result[i][0]) == 4 and len(eocr_result[j][0]) == 4 and self.__dis(eocr_result[i][0], eocr_result[j][0]) < 5:
200+
if self.debug:
201+
print("C Appended")
202+
eocr_result.append(((eocr_result[i][0], eocr_result[j][0]), eocr_result[i][1] + eocr_result[j][1], (eocr_result[i][2] + eocr_result[j][2]) / 2))
203+
eocr_result.append(((eocr_result[j][0], eocr_result[i][0]), eocr_result[j][1] + eocr_result[i][1], (eocr_result[j][2] + eocr_result[i][2]) / 2))
204+
else:
205+
if self.debug:
206+
disout = 0
207+
if len(eocr_result[i][0]) == 4 and len(eocr_result[j][0]) == 4:
208+
disout = self.__dis(eocr_result[i][0], eocr_result[j][0])
209+
print(i != j, len(eocr_result[i][0]) == 4, len(eocr_result[j][0]) == 4, disout)
210+
print("------------------------------C-")
211+
212+
pocr_result = [sorted(pocr_result[0], key=lambda x: len(x[1][0]), reverse=True)]
213+
eocr_result = sorted(eocr_result, key=lambda x: len(x[1]), reverse=True)
214+
139215
if self.debug:
140216
print(pocr_result)
141-
print("------------------------------")
142-
for e in eocr_result:
143-
if e[2] > self.filter and e[1] not in ocr_filter:
144-
ocr_result.append(
145-
(tuple([tuple(i) for i in e[0]]), e[1], e[2])
146-
)
147-
ocr_filter.append(e[1])
217+
print(eocr_result)
218+
219+
# OCR results sum up
148220
for p in pocr_result[0]:
149221
if p[1][1] > self.filter and p[1][0] not in ocr_filter:
150222
ocr_result.append(
151223
(tuple([tuple(i) for i in p[0]]), p[1][0], p[1][1])
152224
)
153225
ocr_filter.append(p[1][0])
154-
155-
# OCR result tidy up
156-
157-
226+
for e in eocr_result:
227+
if e[2] > self.filter and e[1] not in ocr_filter:
228+
ocr_result.append(
229+
(tuple([tuple(i) for i in e[0]]), e[1], e[2])
230+
)
231+
ocr_filter.append(e[1])
158232

159233
# Read database
160234
for i in ocr_result:
@@ -167,7 +241,9 @@ def recognize(self, image):
167241
return None
168242

169243
if __name__ == "__main__":
244+
import json
170245
num = number()
246+
os.makedirs("out", exist_ok=True)
171247
for pic in os.listdir("test"):
172-
print(pic, ":")
173-
print(num.recognize(os.path.join("test", pic)))
248+
with open(os.path.join("out", f"{pic}.json"), "w+") as fb:
249+
fb.write(json.dumps(num.recognize(os.path.join("test", pic))))

‎out/1.jpg.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"icao24": "780ecb", "registration": "B-6995", "manufacturericao": "BOEING", "manufacturername": "Boeing", "model": "737NG 84P/W", "typecode": "B738", "serialnumber": "61323", "linenumber": "", "icaoaircrafttype": "L2J", "operator": "", "operatorcallsign": "", "operatoricao": "", "operatoriata": "", "owner": "Urumqi Airlines", "testreg": "", "registered": "", "reguntil": "", "status": "", "built": "", "firstflightdate": "", "seatconfiguration": "", "engines": "", "modes": "false", "adsb": "false", "acars": "false", "notes": "", "categoryDescription": "No ADS-B Emitter Category Information"}

‎out/10.jpg.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"icao24": "70c0a6", "registration": "A4O-DC", "manufacturericao": "AIRBUS", "manufacturername": "Airbus", "model": "A330 243", "typecode": "A332", "serialnumber": "1049", "linenumber": "", "icaoaircrafttype": "L2J", "operator": "", "operatorcallsign": "OMAN AIR", "operatoricao": "OMA", "operatoriata": "", "owner": "Oman Air", "testreg": "", "registered": "", "reguntil": "", "status": "", "built": "", "firstflightdate": "", "seatconfiguration": "", "engines": "", "modes": "false", "adsb": "false", "acars": "false", "notes": "", "categoryDescription": "No ADS-B Emitter Category Information"}

‎out/2.jpg.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"icao24": "780d77", "registration": "B-2762", "manufacturericao": "BOEING", "manufacturername": "Boeing", "model": "Boeing 787-8", "typecode": "B788", "serialnumber": "41542", "linenumber": "", "icaoaircrafttype": "L2J", "operator": "", "operatorcallsign": "XIAMEN AIR", "operatoricao": "CXA", "operatoriata": "", "owner": "Xiamen Airlines", "testreg": "", "registered": "", "reguntil": "", "status": "", "built": "", "firstflightdate": "", "seatconfiguration": "", "engines": "", "modes": "false", "adsb": "false", "acars": "false", "notes": "", "categoryDescription": "Heavy (> 300000 lbs)"}

‎out/3.jpg.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"icao24": "78060b", "registration": "B-6645", "manufacturericao": "AIRBUS", "manufacturername": "Airbus", "model": "A320 214", "typecode": "A320", "serialnumber": "4168", "linenumber": "", "icaoaircrafttype": "L2J", "operator": "", "operatorcallsign": "AIR SPRING", "operatoricao": "CQH", "operatoriata": "", "owner": "Spring Airlines", "testreg": "", "registered": "", "reguntil": "", "status": "", "built": "", "firstflightdate": "", "seatconfiguration": "", "engines": "", "modes": "false", "adsb": "false", "acars": "false", "notes": "", "categoryDescription": "No ADS-B Emitter Category Information"}

‎out/4.jpg.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"icao24": "7804cc", "registration": "B-5198", "manufacturericao": "BOEING", "manufacturername": "Boeing", "model": "737NG 89L/W", "typecode": "B738", "serialnumber": "36491", "linenumber": "", "icaoaircrafttype": "L2J", "operator": "", "operatorcallsign": "AIR CHINA", "operatoricao": "CCA", "operatoriata": "", "owner": "Air China", "testreg": "", "registered": "", "reguntil": "", "status": "", "built": "", "firstflightdate": "", "seatconfiguration": "", "engines": "", "modes": "false", "adsb": "false", "acars": "false", "notes": "", "categoryDescription": "No ADS-B Emitter Category Information"}

‎out/5.jpg.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"icao24": "780570", "registration": "B-6570", "manufacturericao": "AIRBUS", "manufacturername": "Airbus", "model": "A320 214", "typecode": "A320", "serialnumber": "4010", "linenumber": "", "icaoaircrafttype": "L2J", "operator": "", "operatorcallsign": "SHENZHEN AIR", "operatoricao": "CSZ", "operatoriata": "", "owner": "Shenzhen Airlines", "testreg": "", "registered": "", "reguntil": "", "status": "", "built": "", "firstflightdate": "", "seatconfiguration": "", "engines": "", "modes": "false", "adsb": "false", "acars": "false", "notes": "", "categoryDescription": "No ADS-B Emitter Category Information"}

‎out/6.jpg.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"icao24": "89616f", "registration": "A6-EFI", "manufacturericao": "BOEING", "manufacturername": "Boeing", "model": "777 F1H", "typecode": "B77L", "serialnumber": "35609", "linenumber": "", "icaoaircrafttype": "L2J", "operator": "", "operatorcallsign": "EMIRATES", "operatoricao": "UAE", "operatoriata": "", "owner": "Emirates Airline", "testreg": "", "registered": "", "reguntil": "", "status": "", "built": "", "firstflightdate": "", "seatconfiguration": "", "engines": "", "modes": "false", "adsb": "false", "acars": "false", "notes": "", "categoryDescription": "No ADS-B Emitter Category Information"}

‎out/7.jpg.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"icao24": "780b5c", "registration": "B-5850", "manufacturericao": "BOEING", "manufacturername": "Boeing", "model": "737NG 89L/W", "typecode": "B738", "serialnumber": "41311", "linenumber": "", "icaoaircrafttype": "L2J", "operator": "", "operatorcallsign": "", "operatoricao": "", "operatoriata": "", "owner": "Dalian Airlines", "testreg": "", "registered": "", "reguntil": "", "status": "", "built": "", "firstflightdate": "", "seatconfiguration": "", "engines": "", "modes": "false", "adsb": "false", "acars": "false", "notes": "", "categoryDescription": "No ADS-B Emitter Category Information"}

‎out/8.jpg.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"icao24": "8963a1", "registration": "A6-EFN", "manufacturericao": "BOEING", "manufacturername": "Boeing", "model": "777 F1H", "typecode": "B77L", "serialnumber": "42232", "linenumber": "", "icaoaircrafttype": "L2J", "operator": "", "operatorcallsign": "EMIRATES", "operatoricao": "UAE", "operatoriata": "", "owner": "Emirates Airline", "testreg": "", "registered": "", "reguntil": "", "status": "", "built": "", "firstflightdate": "", "seatconfiguration": "", "engines": "", "modes": "false", "adsb": "false", "acars": "false", "notes": "", "categoryDescription": "No ADS-B Emitter Category Information"}

‎out/9.jpg.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"icao24": "06a13b", "registration": "A7-BAY", "manufacturericao": "BOEING", "manufacturername": "Boeing", "model": "777 3DZER", "typecode": "B77W", "serialnumber": "41778", "linenumber": "1078", "icaoaircrafttype": "L2J", "operator": "Qatar Airways", "operatorcallsign": "QATARI", "operatoricao": "QTR", "operatoriata": "QR", "owner": "Qatar Airways", "testreg": "", "registered": "2013-03-01", "reguntil": "", "status": "", "built": "2013-01-01", "firstflightdate": "", "seatconfiguration": "", "engines": "", "modes": "false", "adsb": "false", "acars": "false", "notes": "", "categoryDescription": "No ADS-B Emitter Category Information"}

0 commit comments

Comments
 (0)
Please sign in to comment.