Skocz do zawartości

Problem z programem do rozpoznawania tekstu (numeru tablic rejestracyjnych)


Marson

Pomocna odpowiedź

import cv2
import pytesseract
import time
from pytesseract import Output

def extract_license_plate(image_path):
    
    image = cv2.imread(image_path)

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    blur = cv2.GaussianBlur(gray, (5, 5), 0)

    edges = cv2.Canny(blur, 100, 200)

    contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]

    plate_text = None

    for contour in contours:
        peri = cv2.arcLength(contour, True)
        approx = cv2.approxPolyDP(contour, 0.018 * peri, True)

        if len(approx) == 4:
            x, y, w, h = cv2.boundingRect(approx)
            roi = image[y:y + h, x:x + w]
            plate_text = pytesseract.image_to_string(roi, config='--psm 8 --oem 3 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
            return ''.join(filter(str.isalnum, plate_text))
    return "no text detected"

cap=cv2.VideoCapture(0)

try:
	while True:
		ret, frame = cap.read()
		
		if ret:
			cv2.imwrite('/home/marek/tablica.png',frame)
			print("Image saved")	
			text = extract_license_plate('/home/marek/tablica.png')
			
		else:
			print("fail")
			
		if text is not None:
			print(f"Extracted Text: {text}")
		
		time.sleep(5)
		
except Exception as e:
	print(f"An error occurred: {e}")
	
finally:
	cap.release()
	print("Camera released.")

Pracuję nad projektem systemu służącego do automatycznego otwierania bramy, w momencie rozpoznania przez kamerę z Raspberry Pi, numerów tablic rejestracyjnych zapisanych w pliku tekstowym. Jestem dość zielony w jakiekolwiek programy związane z systemami wizyjnymi i mocno posiłkowałem się ChatemGPT 4, wrzuciłem do chatu zdjęcia przypominające docelowy obraz z kamery i kazałem mu pod to napisać program. Program działa prawie idealnie kiedy zczytuje tablice z gotowych zdjęć, jednak gdy zdjęcia pochodzą z kamery i pokazuje przed nią dokładnie to samo zdjęcie tylko wydrukowane, program nie rozpoznaje żadnych znaków. Pytanie gdzie może leżeć problem, czy wpływ na to ma zbyt niska jakość obrazu z kamerki (używam kamery ZeroCam z przejściówka do Raspberry PI 3A+) , potencjalnie zły kąt zdjęcia przed kamerka czy może jakiś błąd w kodzie?
Testuje działanie na załączonym obrazku
Z góry dziękuje za pomoc, ewentualny namiar do kogoś kto mógłby pomóc :))

seat przod.jpg

Link do komentarza
Share on other sites

Widzę, że nikt się nie odzywa, więc może ja spróbuję. Nie powiem Ci co źle działa w Twoim systemie, ale mogę podpowiedzieć, co (można) robić.

a) Prześledzić (i zrozumieć!) działanie programu, zwłaszcza rolę użytych wewnątrz funkcji extract_license_plate parametrów (użytych stałych). Np. stosowane jest rozmycie; czy porównałeś, jak wyglądają poszczególne obrazy (poprawnie rozpoznawane i nierozpoznawane) po zastosowaniu tego rozmycia? Czy sprawdziłeś jak wygląda wydzielanie konturów ?

b) Testować działanie na wielu obrazkach (im więcej tym lepiej) i to wykonanych z tej kamerki którą chcesz używać.

c) Napisać program który zapisze wiele różnych zdjęć z kamerki w różnych warunkach (pogodowych, oświetleniowych, różnych samochodów, różnych ustawień ... ) i na tym materiale testować funkcję rozpoznającą. Na przykład przez tydzień każde otwarcie bramy jest fotografowane (np ustawić automat: brama się zaczyna otwierać, robione jest i zapisywane zdjęcie).

d) Wygenerować nowy program podając tym razem rzeczywiste obrazy, sprawdzić czy i jak działa - porównać oba wygenerowane programy.

e) Opublikować problem na forum, ale w postaci nie wymagającej używania szklanej kuli (program, dane, przeprowadzone testy, wnioski jakie z nich wyciągnąłeś, pytania jakie ci się nasunęły). Wtedy będzie duże prawdopodobieństwo, że znajdzie się ktoś kto pomoże, lub ze znajomością rzeczy podpowie co robić dalej.

Pozdrawiam

                                Bogusław

PS: Przedstaw się, napisz coś o sobie (umiejętności), wtedy będzie można lepiej dobrać odpowiedzi. Na przykład w tej chwili nie jetem w stanie ocenić, czy moja odpowiedź cokolwiek ci pomoże, i to z dwóch przeciwnych powodów: wszystko to co napisałem jest dla ciebie oczywiste ale ... (spieszy ci się, nie chce ci się tyle robić, ten problem nie jest dla ciebie aż tak ważny itd), lub proponowane rozwiązania są dla ciebie za trudne.

Przypis ten jest nie po to, by cię urazić (jeśli to się stało, przepraszam) ale by pokazać, że udzielanie sensownych odpowiedzi na forum - nie mówiąc już o odpowiedziach pomocnych - nie jest wcale oczywiste.

                                                   B.

 

Edytowano przez bjrk
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.