Il riconoscimento della targa veicolo è una delle applicazioni più interessanti di computer vision e elaborazione di immagini. In questo tutorial, esploreremo come utilizzare Python insieme a OpenCV per rilevare e riconoscere la targa di un veicolo in un’immagine. Puoi sperimentare e smanettare un po’ con il codice partendo dall’esempio qui sotto o scaricando il codice che trovi sul mio profilo GitHub.
Prerequisiti
Assicuriamoci di avere Python installato sul nostro sistema e installiamo le librerie necessarie eseguendo il seguente comando:
pip install opencv-python imutils pytesseract numpy
Che cosa sono OpenCV e Tesseract?
OpenCV, acronimo di “Open Source Computer Vision Library“, è una libreria open source dedicata alla visione artificiale e all’elaborazione di immagini. È progettata per fornire un set di strumenti ricco e completo per sviluppatori, ricercatori e appassionati che lavorano nell’ambito della visione artificiale.
Tesseract è un motore di riconoscimento ottico dei caratteri (OCR) open source sviluppato originariamente presso Hewlett Packard Labs. Oggi è uno dei progetti gestiti dalla comunità open source e ospitato dalla Software Freedom Conservancy.
Assicuriamoci anche di avere Tesseract installato sul nostro sistema. È possibile scaricarlo da qui.
Codice Sorgente
import cv2
import imutils
import numpy as np
import pytesseract
# Leggi l'immagine da file
img = cv2.imread('Auto/2.jpg', cv2.IMREAD_COLOR)
img = cv2.resize(img, (800, 600)) # Ridimensiona l'immagine
# Converti l'immagine in scala di grigi
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.bilateralFilter(gray, 13, 40, 40) # Riduci il rumore mantenendo i bordi
# Trova i bordi nell'immagine
edged = cv2.Canny(gray, 30, 200)
# Trova i contorni nell'immagine con il metodo RETR_TREE
contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = imutils.grab_contours(contours)
contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
screenCnt = None
# Trova il contorno del rettangolo (presumibilmente la targa)
for c in contours:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.018 * peri, True)
if len(approx) == 4:
screenCnt = approx
break
# Verifica se è stato trovato un contorno valido
if screenCnt is None:
detected = 0
print("Nessun contorno rilevato")
else:
detected = 1
# Disegna il contorno trovato sull'immagine originale
if detected == 1:
cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)
# Crea una maschera basata sul contorno trovato
mask = np.zeros(gray.shape, np.uint8)
new_image = cv2.drawContours(mask, [screenCnt], 0, 255, -1)
new_image = cv2.bitwise_and(img, img, mask=mask)
# Estrai la regione della targa dall'immagine originale
(x, y) = np.where(mask == 255)
(topx, topy) = (np.min(x), np.min(y))
(bottomx, bottomy) = (np.max(x), np.max(y))
Cropped = gray[topx:bottomx+1, topy:bottomy+1]
# Esegui l'OCR sulla regione della targa
text = pytesseract.image_to_string(Cropped, config='--psm 11')
print("Riconoscimento della targa di programming_fever\n")
print("Numero di targa rilevato:", text)
# Ridimensiona le immagini per mostrarle
img = cv2.resize(img, (500, 300))
Cropped = cv2.resize(Cropped, (400, 200))
# Mostra le immagini
cv2.imshow('Auto', img)
cv2.imshow('Targa Ritagliata', Cropped)
# Attendi che l'utente prema un tasto e poi chiudi le finestre
cv2.waitKey(0)
cv2.destroyAllWindows()
Spiegazione del Codice
1. Importazione delle Librerie
Iniziamo importando le librerie necessarie per il riconoscimento della targa veicolo, tra cui OpenCV, imutils, NumPy e PyTesseract.
2. Caricamento e Preprocessamento dell’Immagine
Carichiamo un’immagine di un veicolo e la ridimensioniamo per facilitare l’elaborazione. Convertiamo l’immagine in scala di grigi e applichiamo un filtro bilaterale per ridurre il rumore mantenendo i bordi.
3. Ricerca dei Contorni
Utilizzando l’algoritmo di Canny, individuiamo i bordi nell’immagine. Successivamente, troviamo i contorni e selezioniamo i 10 più grandi ordinati per area.
4. Identificazione del Contorno della Targa
Attraverso l’approssimazione di poligoni, cerchiamo un contorno con 4 vertici, presumibilmente rappresentante la targa del veicolo.
5. Riconoscimento della Targa tramite OCR
Se viene trovato un contorno valido, estraiamo la regione della targa e applichiamo l’OCR di Tesseract per riconoscere il testo.
6. Visualizzazione delle Immagini
Visualizziamo l’immagine originale con il contorno della targa evidenziato e la regione ritagliata contenente il testo della targa.
Questo tutorial fornisce una panoramica dettagliata su come implementare il riconoscimento targhe utilizzando Python e OpenCV. Sperimenta con diverse immagini per vedere come il codice si comporta in scenari diversi.