Upload files to ''
This commit is contained in:
parent
69015b7e82
commit
2dca6e0453
|
@ -0,0 +1,56 @@
|
|||
import mysql.connector
|
||||
|
||||
|
||||
# det_res -> detection result
|
||||
def best(det_res):
|
||||
chars = ['®', '|', ' ', "'", '[', ']', ',', '\n', '\x0c', '/', '\\']
|
||||
for i in range(len(det_res)):
|
||||
for char in chars:
|
||||
det_res[i] = det_res[i].replace(char, '')
|
||||
|
||||
for ele in det_res:
|
||||
if len(ele) == 1:
|
||||
det_res.remove(ele)
|
||||
|
||||
while "" in det_res:
|
||||
det_res.remove("")
|
||||
|
||||
print(det_res)
|
||||
|
||||
db = mysql.connector.connect(host="localhost", user="root", database="wtb_db")
|
||||
cursor = db.cursor()
|
||||
|
||||
cursor.execute('SELECT * FROM coffee')
|
||||
db_results = cursor.fetchall()
|
||||
|
||||
score = []
|
||||
for i in range(len(db_results)):
|
||||
keywords = db_results[i][2].split(';')
|
||||
score.append(0)
|
||||
for res in det_res:
|
||||
print(f'\n=== {db_results[i][1]} ===')
|
||||
for keyword in keywords:
|
||||
if res.lower() in keyword.lower():
|
||||
print(f'{res} -- {keyword}')
|
||||
# dwa pierwsze to zawsze nazwa kawy, dlatego jest lepiej punktowana
|
||||
if i < 2:
|
||||
score[i] += 3
|
||||
else:
|
||||
score[i] += 1
|
||||
if score[i] != 0:
|
||||
if i != 0:
|
||||
score[i] = score[i]/i
|
||||
|
||||
print(score[i])
|
||||
print("=======================")
|
||||
|
||||
print(score)
|
||||
if score.index(max(score)) < 1:
|
||||
return 'Nie wykryto kawy w bazie danych'
|
||||
else:
|
||||
best_index = score.index(max(score))
|
||||
|
||||
return f"""
|
||||
WYKRYTO: {db_results[best_index][1]}\n
|
||||
Opis: {db_results[best_index][3]}
|
||||
"""
|
|
@ -0,0 +1,129 @@
|
|||
import numpy as np
|
||||
import cv2
|
||||
from imutils.object_detection import non_max_suppression
|
||||
import pytesseract
|
||||
# from matplotlib import pyplot as plt
|
||||
|
||||
from best import best
|
||||
|
||||
|
||||
def job(folder):
|
||||
folder = f'imgs/{folder}'
|
||||
# tworzenie biblioteki argumentów (ta forma ułatwia rozróżnienie tych argumentów od innych zmiennych)
|
||||
args = {"images": [f"{folder}/1.jpg", f"{folder}/2.jpg", f"{folder}/3.jpg"],
|
||||
"east": "frozen_east_text_detection.pb",
|
||||
"min_confidence": 0.5,
|
||||
"width": 320, # wielokrotność 32
|
||||
"height": 416 # *wielokrotność 32
|
||||
}
|
||||
# *uzasadnienie:
|
||||
# aplikacja przeznaczona jest dla urządzeń mobilnych, dla których naturalnym ustawieniem obiektywu jest to pionowe
|
||||
# (posiadające więcej px w wysokości niż szerokości). Mój telefon wykonuje zdjęcia w rodzielczości 3000x4000 px,
|
||||
# zatem ich stosunek wynosi 1,(3). Domyślną wartością tutaj jest 320 px, zatem 320 * 1,3 = 416
|
||||
|
||||
images = []
|
||||
for i in range(len(args['images'])):
|
||||
images.append(cv2.imread(args['images'][i]))
|
||||
|
||||
# zapisywanie oryginalnych wymiarów (zdjęcia z telefonu mają takie same wymiary, więc wystarczy sprawdzenie jednego)
|
||||
orig = images[0].copy()
|
||||
(origH, origW) = images[0].shape[:2]
|
||||
|
||||
# zdefiniowanie rozmiaru czytanego obrazka (najlepiej wielokrotność liczby 32)
|
||||
(newW, newH) = (args["width"], args["height"])
|
||||
|
||||
# obliczanie stosunku wymiarów zdjęcia do poprawnego przeskalowania (r = ratio)
|
||||
rW = origW / float(newW)
|
||||
rH = origH / float(newH)
|
||||
|
||||
# przeskalowanie zdjęć
|
||||
for i in range(len(images)):
|
||||
images[i] = cv2.resize(images[i], (newW, newH))
|
||||
(H, W) = images[0].shape[:2]
|
||||
|
||||
# tworzenie blobów, które zostaną przekazane do modelu EAST w celu wykrycia tekstu
|
||||
blob = cv2.dnn.blobFromImages(images, 1.0, (W, H), (123.68, 116.78, 103.94), swapRB=True, crop=False)
|
||||
|
||||
# załadowanie modelu EAST do wykrywania tekstu
|
||||
net = cv2.dnn.readNet(args["east"])
|
||||
|
||||
# zgodnie z poleceniem ze źródła wyznaczamy dwie warstwy z modelu EAST
|
||||
layerNames = ["feature_fusion/Conv_7/Sigmoid", "feature_fusion/concat_3"]
|
||||
|
||||
net.setInput(blob)
|
||||
(scores, geometry) = net.forward(layerNames)
|
||||
|
||||
def predictions(prob_score, geo):
|
||||
(numR, numC) = prob_score.shape[2:4]
|
||||
boxes = []
|
||||
confidence_val = []
|
||||
|
||||
for y in range(0, numR):
|
||||
scoresData = prob_score[0, 0, y]
|
||||
x0 = geo[0, 0, y]
|
||||
x1 = geo[0, 1, y]
|
||||
x2 = geo[0, 2, y]
|
||||
x3 = geo[0, 3, y]
|
||||
anglesData = geo[0, 4, y]
|
||||
|
||||
for i in range(0, numC):
|
||||
if scoresData[i] < args["min_confidence"]:
|
||||
continue
|
||||
|
||||
(offX, offY) = (i * 4.0, y * 4.0)
|
||||
|
||||
angle = anglesData[i]
|
||||
cos = np.cos(angle)
|
||||
sin = np.sin(angle)
|
||||
|
||||
h = x0[i] + x2[i]
|
||||
w = x1[i] + x3[i]
|
||||
|
||||
endX = int(offX + (cos * x1[i]) + (sin * x2[i]))
|
||||
endY = int(offY - (sin * x1[i]) + (cos * x2[i]))
|
||||
startX = int(endX - w)
|
||||
startY = int(endY - h)
|
||||
|
||||
boxes.append((startX, startY, endX, endY))
|
||||
confidence_val.append(scoresData[i])
|
||||
|
||||
return boxes, confidence_val
|
||||
|
||||
(boxes, confidence_val) = predictions(scores, geometry)
|
||||
boxes = non_max_suppression(np.array(boxes), probs=confidence_val)
|
||||
|
||||
""" Znajdowanie i rozpoznawanie tekstu """
|
||||
|
||||
results = []
|
||||
for (startX, startY, endX, endY) in boxes:
|
||||
startX = int(startX * rW)
|
||||
startY = int(startY * rH)
|
||||
endX = int(endX * rW)
|
||||
endY = int(endY * rH)
|
||||
|
||||
r = orig[startY:endY, startX:endX]
|
||||
|
||||
configuration = "-l eng --oem 1 --psm 8"
|
||||
text = pytesseract.image_to_string(r, config=configuration)
|
||||
|
||||
results.append(((startX, startY, endX, endY), text))
|
||||
|
||||
orig_image = orig.copy()
|
||||
|
||||
recognized = []
|
||||
for ((start_X, start_Y, end_X, end_Y), text) in results:
|
||||
# wyświetlanie tekstu wykrytego przez Tesseract
|
||||
recognized.append(format(text))
|
||||
print("{}\n".format(text))
|
||||
|
||||
text = "".join([x if ord(x) < 128 else "" for x in text]).strip()
|
||||
cv2.rectangle(orig_image, (start_X, start_Y), (end_X, end_Y), (0, 0, 255), 2)
|
||||
cv2.putText(orig_image, text, (start_X, start_Y - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
|
||||
|
||||
# plt.imshow(orig_image)
|
||||
# plt.title('Output')
|
||||
# plt.show()
|
||||
|
||||
info = best(recognized)
|
||||
|
||||
return info
|
|
@ -0,0 +1,181 @@
|
|||
from kivy.app import App
|
||||
from kivy.uix.label import Label
|
||||
from kivy.uix.gridlayout import GridLayout
|
||||
from kivy.uix.textinput import TextInput
|
||||
from kivy.uix.button import Button
|
||||
from kivy.uix.screenmanager import ScreenManager, Screen
|
||||
import mysql.connector
|
||||
from job import job
|
||||
|
||||
|
||||
class ConnectPage(GridLayout):
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
self.cols = 2
|
||||
|
||||
self.add_widget(Label(text='Name:'))
|
||||
self.name = TextInput(multiline=False)
|
||||
self.add_widget(self.name)
|
||||
|
||||
self.add_widget(Label(text='Password:'))
|
||||
self.password = TextInput(multiline=False)
|
||||
self.add_widget(self.password)
|
||||
|
||||
self.join = Button(text="Login")
|
||||
self.join.bind(on_press=self.join_button)
|
||||
self.add_widget(self.join)
|
||||
|
||||
self.join = Button(text="Register")
|
||||
self.join.bind(on_press=self.register_button)
|
||||
self.add_widget(self.join)
|
||||
|
||||
def join_button(self, instance):
|
||||
name = self.name.text
|
||||
password = self.password.text
|
||||
|
||||
if name in names:
|
||||
if password == users_res[names.index(name)][2]:
|
||||
chat_app.screen_manager.current = 'Kawa'
|
||||
else:
|
||||
info = f"Podane hasło jest błędne"
|
||||
chat_app.info_page.update_info(info)
|
||||
chat_app.screen_manager.current = 'Info'
|
||||
else:
|
||||
info = f"Brak nazwy i hasła w takiej kombinacji"
|
||||
chat_app.info_page.update_info(info)
|
||||
chat_app.screen_manager.current = 'Info'
|
||||
|
||||
def register_button(self, instance):
|
||||
name = self.name.text
|
||||
password = self.password.text
|
||||
if name in names:
|
||||
info = f"Name '{name}' already used"
|
||||
chat_app.info_page.update_info(info)
|
||||
chat_app.screen_manager.current = 'Info'
|
||||
else:
|
||||
cursor.execute(f"""
|
||||
INSERT INTO users (Name, Password)
|
||||
VALUES ('{name}', '{password}')
|
||||
""")
|
||||
db.commit()
|
||||
|
||||
info = f"Added user '{name}' with password '{password}'"
|
||||
chat_app.info_page.update_info(info)
|
||||
chat_app.screen_manager.current = 'Info'
|
||||
|
||||
|
||||
class InfoPage(GridLayout):
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
self.cols = 1
|
||||
self.message = Label(halign="center", valign="middle", font_size=30)
|
||||
self.message = Label()
|
||||
self.message.bind(width=self.update_text_width)
|
||||
self.add_widget(self.message)
|
||||
|
||||
self.join = Button(text="Back")
|
||||
self.join.bind(on_press=self.back)
|
||||
self.add_widget(self.join)
|
||||
|
||||
def back(self, instance):
|
||||
chat_app.screen_manager.current = 'Connect'
|
||||
|
||||
def update_info(self, message):
|
||||
self.message.text = message
|
||||
|
||||
def update_text_width(self, *_):
|
||||
self.message.text_size = (self.message.width * 0.9, None)
|
||||
|
||||
class InfoPage2(GridLayout):
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
|
||||
self.cols = 1
|
||||
self.message = Label(halign="center", valign="middle", font_size=30)
|
||||
self.message = Label()
|
||||
self.message.bind(width=self.update_text_width)
|
||||
self.add_widget(self.message)
|
||||
|
||||
self.join = Button(text="Back")
|
||||
self.join.bind(on_press=self.back)
|
||||
self.add_widget(self.join)
|
||||
|
||||
def back(self, instance):
|
||||
chat_app.screen_manager.current = 'Kawa'
|
||||
|
||||
def update_info(self, message):
|
||||
self.message.text = message
|
||||
|
||||
def update_text_width(self, *_):
|
||||
self.message.text_size = (self.message.width * 0.9, None)
|
||||
|
||||
|
||||
def result():
|
||||
info = job('1')
|
||||
chat_app.info_page.update_info(info)
|
||||
chat_app.screen_manager.current = 'Info2'
|
||||
|
||||
|
||||
def job_to_be_done(instance):
|
||||
info = 'Przetwarzam zdjęcia'
|
||||
chat_app.info_page.update_info(info)
|
||||
chat_app.screen_manager.current = 'Info'
|
||||
result()
|
||||
|
||||
|
||||
class Kawa(GridLayout):
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.cols = 1
|
||||
|
||||
self.add_widget(Label())
|
||||
self.add_widget(Label())
|
||||
self.join = Button(text="Zdjęcie")
|
||||
self.join.bind(on_press=job_to_be_done)
|
||||
self.add_widget(self.join)
|
||||
|
||||
|
||||
class WTB(App):
|
||||
def build(self):
|
||||
self.screen_manager = ScreenManager()
|
||||
|
||||
self.connect_page = ConnectPage()
|
||||
screen = Screen(name='Connect')
|
||||
screen.add_widget(self.connect_page)
|
||||
self.screen_manager.add_widget(screen)
|
||||
|
||||
self.info_page = InfoPage()
|
||||
screen = Screen(name='Info')
|
||||
screen.add_widget(self.info_page)
|
||||
self.screen_manager.add_widget(screen)
|
||||
|
||||
self.info_page = InfoPage2()
|
||||
screen = Screen(name='Info2')
|
||||
screen.add_widget(self.info_page)
|
||||
self.screen_manager.add_widget(screen)
|
||||
|
||||
self.kawa_page = Kawa()
|
||||
screen = Screen(name='Kawa')
|
||||
screen.add_widget(self.kawa_page)
|
||||
self.screen_manager.add_widget(screen)
|
||||
|
||||
return self.screen_manager
|
||||
|
||||
def back(self):
|
||||
chat_app.screen_manager.current = 'Connect'
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
db = mysql.connector.connect(host="localhost", user="root", database="wtb_db")
|
||||
cursor = db.cursor()
|
||||
cursor.execute('SELECT * FROM users')
|
||||
|
||||
users_res = cursor.fetchall()
|
||||
names = []
|
||||
for res in users_res:
|
||||
names.append(res[1])
|
||||
|
||||
chat_app = WTB()
|
||||
chat_app.run()
|
Loading…
Reference in New Issue