added near block merge function and fixed some bugs

This commit is contained in:
Bigsk 2023-01-21 22:46:29 +08:00
parent f833861759
commit 8ffeeb17f5
11 changed files with 103 additions and 17 deletions

110
main.py
View File

@ -78,6 +78,37 @@ class number(object):
i += 1
break
def __distance(self, p1, p2):
return ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2) ** 0.5
def __closest_pair(self, X, Y):
if len(X) <= 3:
return min([self.__distance(X[i], X[j]) for i in range(len(X)) for j in range(i+1, len(X))])
mid = len(X)//2
XL, XR = X[:mid], X[mid:]
YL, YR = [p for p in Y if p in XL], [p for p in Y if p in XR]
d = min(self.__closest_pair(XL, YL), self.__closest_pair(XR, YR))
line = (X[mid][0] + X[mid-1][0]) / 2
YS = [p for p in Y if abs(p[0]-line) < d]
return min(d, self.__closest_split_pair(YS, d))
def __closest_split_pair(self, Y, d):
n = len(Y)
for i in range(n-1):
for j in range(i+1, min(i+8, n)):
if self.__distance(Y[i], Y[j]) < d:
d = self.__distance(Y[i], Y[j])
return d
def __dis(self, p1, p2):
X = p1 + p2
Y = sorted(X, key=lambda p: (p[0], p[1]))
return self.__closest_pair(X, Y)
def search(self, keyword):
'''
Search a plane by it registration number
@ -131,30 +162,73 @@ class number(object):
ocr_filter = []
for _ in range(self.times):
eocr_result = self.__eocr.readtext(img, detail=1)
if self.debug:
print(eocr_result)
print("------------------------------")
# OCR recognize
pocr_result = self.__pocr.ocr(img, cls=True)
if self.debug:
print(pocr_result)
print("------------------------------")
for e in eocr_result:
if e[2] > self.filter and e[1] not in ocr_filter:
ocr_result.append(
(tuple([tuple(i) for i in e[0]]), e[1], e[2])
)
ocr_filter.append(e[1])
print("------------------------------B-")
eocr_result = self.__eocr.readtext(img, detail=1)
if self.debug:
print(eocr_result)
print("------------------------------A-")
# OCR results tidy up
for i in range(len(pocr_result[0])):
for j in range(len(pocr_result[0])):
if self.debug:
print("------------------------------D-")
print(pocr_result[0][i][0], pocr_result[0][j][0])
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:
if self.debug:
print("D Appended")
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))
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))
else:
if self.debug:
disout = 0
if len(eocr_result[i][0]) == 4 and len(eocr_result[j][0]) == 4:
disout = self.__dis(pocr_result[0][i][0], pocr_result[0][j][0])
print(i != j, len(pocr_result[0][i][0]) == 4, len(pocr_result[0][j][0]) == 4, disout)
print("------------------------------D-")
for i in range(len(eocr_result)):
for j in range(len(eocr_result)):
if self.debug:
print("------------------------------C-")
print(eocr_result[i][0], eocr_result[j][0])
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:
if self.debug:
print("C Appended")
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))
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))
else:
if self.debug:
disout = 0
if len(eocr_result[i][0]) == 4 and len(eocr_result[j][0]) == 4:
disout = self.__dis(eocr_result[i][0], eocr_result[j][0])
print(i != j, len(eocr_result[i][0]) == 4, len(eocr_result[j][0]) == 4, disout)
print("------------------------------C-")
pocr_result = [sorted(pocr_result[0], key=lambda x: len(x[1][0]), reverse=True)]
eocr_result = sorted(eocr_result, key=lambda x: len(x[1]), reverse=True)
if self.debug:
print(pocr_result)
print(eocr_result)
# OCR results sum up
for p in pocr_result[0]:
if p[1][1] > self.filter and p[1][0] not in ocr_filter:
ocr_result.append(
(tuple([tuple(i) for i in p[0]]), p[1][0], p[1][1])
)
ocr_filter.append(p[1][0])
# OCR result tidy up
for e in eocr_result:
if e[2] > self.filter and e[1] not in ocr_filter:
ocr_result.append(
(tuple([tuple(i) for i in e[0]]), e[1], e[2])
)
ocr_filter.append(e[1])
# Read database
for i in ocr_result:
@ -167,7 +241,9 @@ class number(object):
return None
if __name__ == "__main__":
import json
num = number()
os.makedirs("out", exist_ok=True)
for pic in os.listdir("test"):
print(pic, ":")
print(num.recognize(os.path.join("test", pic)))
with open(os.path.join("out", f"{pic}.json"), "w+") as fb:
fb.write(json.dumps(num.recognize(os.path.join("test", pic))))

1
out/1.jpg.json Normal file
View File

@ -0,0 +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"}

1
out/10.jpg.json Normal file
View File

@ -0,0 +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"}

1
out/2.jpg.json Normal file
View File

@ -0,0 +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)"}

1
out/3.jpg.json Normal file
View File

@ -0,0 +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"}

1
out/4.jpg.json Normal file
View File

@ -0,0 +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"}

1
out/5.jpg.json Normal file
View File

@ -0,0 +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"}

1
out/6.jpg.json Normal file
View File

@ -0,0 +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"}

1
out/7.jpg.json Normal file
View File

@ -0,0 +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"}

1
out/8.jpg.json Normal file
View File

@ -0,0 +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"}

1
out/9.jpg.json Normal file
View File

@ -0,0 +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"}