jak zrobić w tym kodzie aby mógł program odczytywać kody QR o gorszej jakości ? Przykładowe zdjęcie które chce odczytać
import cv2
from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageTk
from pyzbar.pyzbar import decode
import numpy as np
def preprocess_for_qr_detection(cv_image):
# Konwersja do skali szarości
gray_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
# Wyostrzenie obrazu
sharpen_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpened = cv2.filter2D(gray_image, -1, sharpen_kernel)
return sharpened
def load_image_with_pil(file_path):
pil_image = Image.open(file_path)
cv_image = np.array(pil_image)
# Konwersja RGB na BGR dla OpenCV
cv_image = cv_image[:, :, ::-1].copy()
return cv_image
def decode_qr_and_mark(image):
preprocessed_image = preprocess_for_qr_detection(image)
decoded_objects = decode(preprocessed_image)
for obj in decoded_objects:
# Dla każdego zdekodowanego obiektu, narysuj zieloną obwódkę wokół kodu QR
points = obj.polygon
# Jeśli punkty nie tworzą kwadratu, znajdź otoczkę wypukłą
if len(points) > 4:
hull = cv2.convexHull(np.array([point for point in points], dtype=np.float32))
points = hull
# Liczba punktów w otoczce wypukłej
n = len(points)
# Narysuj otoczkę wypukłą
for j in range(n):
cv2.line(image, tuple(points[j]), tuple(points[(j+1) % n]), (0,255,0), 3)
return image, decoded_objects
def select_image():
file_path = filedialog.askopenfilename()
if not file_path:
return
cv_image = load_image_with_pil(file_path)
marked_image, decoded_objects = decode_qr_and_mark(cv_image.copy())
marked_image = cv2.cvtColor(marked_image, cv2.COLOR_BGR2RGB)
im = Image.fromarray(marked_image)
img = ImageTk.PhotoImage(image=im)
image_label.configure(image=img)
image_label.image = img
# Wyświetl dane zdekodowanego kodu QR
if decoded_objects:
decoded_text = "\n".join([obj.data.decode("utf-8") for obj in decoded_objects])
else:
decoded_text = "Nie znaleziono kodu QR."
text_label.config(text=decoded_text)
# Inicjalizacja głównego okna interfejsu użytkownika
window = Tk()
window.title('Dekoder Kodów QR')
frame = Frame(window)
frame.pack(padx=10, pady=10)
image_label = Label(frame)
image_label.pack(side=LEFT, padx=10, pady=10)
text_label = Label(frame, text="Tutaj pojawią się dane zdekodowanego kodu QR", justify=LEFT)
text_label.pack(side=LEFT, padx=10, pady=10)
btn_load_image = Button(window, text="Wczytaj obraz", command=select_image)
btn_load_image.pack(side=BOTTOM, pady=10)
window.mainloop()