In questo articolo esploreremo come realizzare un sistema automatizzato per il riconoscimento delle targhe automobilistiche utilizzando Raspberry Pi Compute Module 4 (CM4), la carrier board Ochin V2 e una Raspberry Pi Camera. Questo progetto consente di leggere le targhe dei veicoli ogni pochi secondi e, in caso di rilevamento, di inviare una foto della targa con un messaggio contenente i caratteri riconosciuti.
L’obiettivo sarà implementare un sistema che utilizza OpenCV per rilevare la targa e Tesseract OCR per leggere il testo. Inoltre, vedremo come configurare un bot Telegram per ricevere i risultati direttamente sul proprio smartphone.
Prima di cominciare, per coloro i quali non conoscono la carrier board ochin V2 consiglio di leggere i seguenti articoli:
- Ochin V2 di Seeed Studio: la carrier board per Raspberry Pi CM4
- Come configurare il Raspberry Pi Compute Module 4 con ochin V2
- Guida all’uso della Raspberry Pi Camera su Compute Module 4 con Ochin V2
Componenti necessari
- Raspberry Pi Compute Module 4 (CM4)
- Carrier board Ochin V2
- Raspberry Pi Camera v1.3
- Librerie software (OpenCV, Tesseract OCR, Telepot, Imutils)
Applicazioni pratiche
Questo sistema può essere impiegato in diversi contesti, tra cui:
- Automatizzazione dei caselli stradali
- Monitoraggio di veicoli non autorizzati
- Sistemi di sicurezza automatizzati
- Apertura di cancelli tramite riconoscimento delle targhe
Installazione e configurazione di Raspberry Pi e Camera
Se non hai mai configurato una Raspberry Pi Camera, ti consiglio di leggere la guida specifica sulla configurazione della Raspberry Pi Camera che trovi qui.
Prima di iniziare, è importante assicurarsi che il sistema sia aggiornato. Apri il terminale e digita:
1 2 |
sudo apt update sudo apt upgrade |
Successivamente, installa le librerie necessarie come libcamera, utilizzata per catturare immagini con la Pi Camera, e Tesseract OCR, che verrà impiegata per il riconoscimento dei caratteri delle targhe automobilistiche:
1 2 |
sudo apt install libcamera-apps sudo apt-get install tesseract-ocr |
Creare un ambiente virtuale Python
Per evitare conflitti con i pacchetti preinstallati, ti consiglio di lavorare all’interno di un ambiente virtuale Python. Ecco come crearlo:
1 2 |
python3 -m venv myenv source myenv/bin/activate |
All’interno dell’ambiente virtuale, installa le librerie necessarie:
1 |
pip install opencv-python imutils pytesseract telepot |
Rilevamento delle targhe: Passaggi principali
Il processo di riconoscimento della targa segue tre fasi fondamentali:
- Rilevamento della targa: Utilizziamo OpenCV per individuare la targa nell’immagine, sfruttando la tecnica di rilevamento dei contorni.
- Segmentazione dei caratteri: Una volta rilevata la targa, viene segmentata per isolare i caratteri.
- Riconoscimento con OCR: Tesseract OCR viene utilizzato per convertire l’immagine della targa in testo leggibile.
Configurazione del bot Telegram con Telepot
Il primo passo consiste nell’aprire l’applicazione telegram. Una volta aperta cerchiamo “BotFather” tramite la funzione cerca cliccando sull’apposita lente di ingrandimento.
“BotFather” è un bot che permette di creare altri bot.
Avviamo il bot scrivendo “/start“, poi premiamo invio.
Per creare un nuovo bot digitiamo “/newbot”.
BotFather ci chiederà di assegnare un nome al nostro nuovo Bot, basta digitare un qualsiasi nome e poi premere Invio.
Dobbiamo anche inserire un username che lo renderà riconoscibile pubblicamente. Username deve terminare in “Bot” o ” _bot”.
In seguito alla assegnazione del nome e dell’username BotFather ci comunicherà informazioni importanti in seguito per compilare il codice per il funzionamento della camera e dell’invio dati. ATTENZIONE: QUESTE INFOMAZIONI LE DOVREMMO TENERE SOLO PER NOI. La prima parte riguarda il percorso per trovare il nostro bot. La seconda è la API che sarà utilizzato nel nostro codice.
Per l’implementazione del bot occorre una specifica libreria. Per installare questa libreria basta eseguire il comando (prima usciamo dalle eventuali directory digitando cd).
pip install telepot
Perché abbiamo scelto Telepot? Sebbene esistano altre librerie come python-telegram-bot o aiogram, Telepot offre una maggiore semplicità d’uso per progetti come questo, richiedendo meno configurazioni e risultando più adatto per l’invio rapido di messaggi e foto.
Codice Python per catturare e inviare targhe
Crea la cartella chiamata “timelapse” su desktop, cosi potrai copiare e incollare il codice.
Ecco un esempio di codice Python che cattura le immagini, le elabora e invia i risultati tramite il bot Telegram:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
import telepot from telepot.loop import MessageLoop import cv2 import imutils import numpy as np import pytesseract import os import time # Function to capture an image using libcamera-still def capture_image(image_path, width=1920, height=1080, quality=90): """ Captures an image using libcamera-still with the specified parameters. Args: image_path (str): The path where the image will be saved. width (int): Image width in pixels (default is 1920). height (int): Image height in pixels (default is 1080). quality (int): Image quality as a percentage (default is 90). Returns: bool: True if the image was captured successfully, False otherwise. """ command = f"libcamera-still -t 100 --autofocus-mode auto -o {image_path} --width {width} --height {height} --quality {quality}" exit_code = os.system(command) return exit_code == 0 # True if exit_code is 0, indicates success # Function to detect and recognize the license plate in an image def detect_license_plate(image_path): """ Detects a vehicle's license plate in an image and extracts the characters. Args: image_path (str): The path of the image to analyze. Returns: str: The recognized text (license plate) or an error message. """ img = cv2.imread(image_path) if img is None: return "Error: Unable to load image" # Convert the image to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Apply a filter to reduce noise gray = cv2.bilateralFilter(gray, 11, 17, 17) # Detect edges using Canny method edged = cv2.Canny(gray, 30, 200) # Find contours in the image cnts = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:10] screenCnt = None # Look for a rectangular contour for c in cnts: peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.018 * peri, True) if len(approx) == 4: screenCnt = approx break if screenCnt is None: return "Error: No license plate detected" # Create a mask for the license plate's shape mask = np.zeros(gray.shape, np.uint8) cv2.drawContours(mask, [screenCnt], 0, 255, -1) # Apply the mask to the original image new_image = cv2.bitwise_and(img, img, mask=mask) # Find the coordinates of the license plate and crop the image (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] # Use Tesseract OCR to recognize characters text = pytesseract.image_to_string(cropped, lang='eng', config='--psm 13') return text.strip() if text else "Error: Unable to recognize license plate" # Function to handle Telegram messages def handle_message(msg): """ Handles the messages received from the Telegram bot and initiates the license plate detection process. Args: msg (dict): The message received from Telegram. """ chat_id = msg['chat']['id'] i = 0 while True: image_path = f"timelapse/image{i:04d}.jpg" i += 1 # Capture an image using libcamera if not capture_image(image_path): time.sleep(10) # Retry if the capture fails continue # Detect the license plate license_plate_text = detect_license_plate(image_path) # Send the photo and license plate text to the Telegram bot bot.sendPhoto(chat_id, open(image_path, 'rb')) bot.sendMessage(chat_id, f"Detected License Plate: {license_plate_text}") time.sleep(10) # Wait 10 seconds before capturing the next image # Main function to start the bot def main(): """ Main function to initialize the Telegram bot and start the message loop. """ global bot # Declare the bot variable as global bot = telepot.Bot("yourapikey") # Replace with your API key MessageLoop(bot, handle_message).run_as_thread() print("Telegram bot started. Listening for messages...") # Keep the bot active while True: time.sleep(10) # Only run the program if executed directly if __name__ == "__main__": main() |
Esegui il codice, vai sul bot e scrivi /start, e mettiamo una bella targa davanti alla cam.
Ecco qui il risultato:
Spiegazione dei parametri di libcamera-still
Il comando libcamera-still
che utilizziamo per catturare le immagini include vari parametri:
-t 100
: Imposta il tempo di attesa per l’acquisizione dell’immagine.--autofocus-mode auto
: Attiva la modalità autofocus automatica.-o {image_path}
: Specifica il percorso di salvataggio dell’immagine.--width 1920 --height 1080
: Definisce la risoluzione dell’immagine in pixel.--quality 90
: Imposta la qualità dell’immagine in percentuale (90%).
Per ulteriori dettagli sui parametri, puoi consultare la documentazione ufficiale di Arducam.
Considerazioni finali
I risultati di questo sistema dipendono dalla qualità delle immagini acquisite. Fattori come la luce, l’angolazione e la chiarezza dell’immagine possono influenzare la precisione del riconoscimento. Consigliamo di ottimizzare il setup per migliorare l’affidabilità del sistema.
Possibili problemi
- Verifica se la cartella timelapse è stata creata correttamente sul desktop
- Permessi insufficienti: Assicurati che lo script Python abbia i permessi necessari per scrivere nella cartella timelapse. Puoi modificarli con:
1chmod -R 777 /home/pi/Desktop/timelapse
Iscriviti ai nostri gruppi Telegram
Link utili
- Arduino UNO R3
- Elegoo UNO R3
- Arduino Starter Kit per principianti
- Elegoo Advanced Starter Kit
- Arduino Nano