Nell’articolo di oggi vedremo come realizzare con Raspberry Pi un sistema automatizzato in grado di leggere le targhe delle auto ogni tot secondi (se presenti) e in tal caso inviare una foto della targa con sotto un messaggio di testo contente le lettere e numeri che compongono la targa.
In questo articolo impareremo a riconoscere e leggere il numero di targa delle automobili utilizzando Raspberry Pi e OpenCV . Per riconoscere la targa utilizzeremo OpenCV Contour Detection con la combinazione di Tesseract OCR.
Componenti:
- Raspberry Pi
- Pi camera
- Librerie
Applicazioni:
- automatizzare i caselli
- scoprire trasgressori
- sistemi di sicurezza automatizzati
- apertura cancelli
Se non hai mai utilizzato prima d’ora la Raspberry Pi Camera dovrai configurala. Per avere maggiori info riguarda la prima configurazione ti invito a leggere il mio articolo: Come installare e configurare la Raspberry Pi Camera
Dobbiamo installare poi varie librerie tra cui:
- open cv
- telepot
- Tesseract
- imutils
Ci sono tre passaggi logici fondamentali
- Rilevamento targa
- Segmentazione dei caratteri una volta rilevata la targa
- Riconoscimento dei caratteri con OCR
Installazioni librerie
Aggiorniamo il Raspberry digitando il seguente comando nel terminale:
1 |
sudo apt-get update |
Usa i seguenti comandi per installare le dipendenze necessarie per l’installazione di OpenCV sul tuo Raspberry Pi.
1 2 3 4 5 6 |
sudo apt install libhdf5-dev -y sudo apt install libhdf5-serial-dev –y sudo apt install libatlas-base-dev –y sudo apt install libjasper-dev -y sudo apt install libqtgui4 –y sudo apt install libqt4-test –y |
Successivamente, usa il comando seguente per installare OpenCV sul tuo Raspberry Pi.
1 |
pip3 install opencv-contrib-python==4.1.0.25 |
Per installare Tesseract OCR (Optical Character Recognition) utilizzando l’opzione apt:
1 |
sudo apt install tesseract-ocr |
installa pytesseract con il comando:
1 |
pip3 install pytesseract |
imutils viene utilizzato per semplificare le funzioni di elaborazione delle immagini essenziali come traduzione, rotazione, ridimensionamento e visualizzazione di immagini Matplotlib con OpenCV. Utilizzare il comando seguente per installare imutils:
1 |
pip3 install imutils |
Configurazione bot telegram
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
CODICE
Crea la cartella chiamata “timelapse” su desktop, cosi potrai copiare e incollare il codice
Lo puoi scaricare da questo link oppure vedere qui in basso
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 |
import telepot import time import os import cv2 import imutils import numpy as np import pytesseract from PIL import Image from picamera import PiCamera #inizializzo camera a una risoluzione HD camera = PiCamera () camera.resolution = (1024,720) # Handling message from Telegram def handleMessage(msg): i=0 #con questo ciclo while avremo modo di avere un loop infinito quindi potremmo analizzare continuamente le varie immagini scattate in un intervallo di tempo X while True: id = msg['chat']['id'] camera.capture("/home/pi/Desktop/timelapse/image{0:04d}.jpg".format(i)) #scatto foto che sono inserite nella cartella timelapse stringa="/home/pi/Desktop/timelapse/image{0:04d}.jpg".format(i) #mi servirà dopo per agevolare l'inivio della foto su telegram img = cv2.imread(str("/home/pi/Desktop/timelapse/image{0:04d}.jpg".format(i)),cv2.IMREAD_COLOR) i=i+1 img = cv2.resize(img, (1024,720) ) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grey scale gray = cv2.bilateralFilter(gray, 11, 17, 17) #Blur to reduce noise edged = cv2.Canny(gray, 30, 200) #Perform Edge detection #rilevamento dei bordi. # find contours in the edged image, keep only the largest # ones, and initialize our screen contour cnts = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) # Una volta rilevati i contorni li ordiniamo dal grande al piccolo e consideriamo solo i primi 10 risultati ignorando gli altri. #Nella nostre immagini potrebbero essercizi immagini contenti in un piano chiuso e tra questi piani c'è anche la nostra targa #Per filtrare l'immagine della targa tra i risultati ottenuti, #esamineremo tutti i risultati e verificheremo quale ha un contorno a forma #di rettangolo con quattro lati e una figura chiusa. Dal momento che una #targa sarebbe sicuramente una figura rettangolare a quattro lati. cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:10] screenCnt = 0 # loop over our contours, cercare i contorni sulla nostra immagine for c in cnts: # approximate the contour peri = cv2.arcLength(c, True) #Il valore 0,018 è un valore sperimentale; puoi giocarci intorno per #verificare quale funziona meglio per te. per chi ha dimestichezza potrebbe utilizzare modelli di appredimento automatico addestrati #Una volta trovato il valore giusto lo salviamo in una variabile #chiamata screenCnt e poi disegniamo un rettangolo attorno ad esso per #assicurarci di aver rilevato correttamente la targa. approx = cv2.approxPolyDP(c, 0.018 * peri, True) # if our approximated contour has four points, then # we can assume that we have found our screen if len(approx) == 4: screenCnt = approx break if screenCnt is 0: detected = 0 print ("No contour detected") else: detected = 1 if detected == 1: cv2.drawContours(img, [screenCnt], -1, (0, 255, 0), 3) 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) # Masking the part other than the number plate # Now crop #maschero l'intera immagine tranne la regione della targa , ritagliamo l area della targa e la salviamo in una immagine (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] #Read the number plate text = pytesseract.image_to_string(Cropped, lang='eng', config='--psm 13') #rilevamento targa come stringa result = "targa "+text print("Detected Number is:",text.strip()) bot.sendPhoto(id, open(stringa, 'rb')) #mando foto al bot bot.sendMessage(id, result) #manda la targa come stringa al bot #cv2.imshow('image',img) #cv2.imshow('Cropped',Cropped) time.sleep(20) bot = telepot.Bot("YOURAPIKEY") #sostituisci la api key che hai trovato prima bot.message_loop(handleMessage); #la funzione handleMessage viene chiamata print ("Listening to bot messages…."); while 1: time.sleep(4000); |
Esegui il codice, vai sul bot e scrivi /start, e mettiamo una bella targa davanti alla cam.
Ecco qui il video:
I risultati di questo metodo non saranno accurati . La precisione dipende dalla chiarezza dell’immagine, dall’orientamento, dall’esposizione alla luce e così via.
Iscriviti ai nostri gruppi Telegram
Link utili