In un articolo precedente abbiamo visto come creare un sistema che permette di riconoscere le targhe ed estrapolare i caratteri sotto forma di stringa inviando su bot telegram su Raspberry Pi immagine e la targa sotto forma di caratteri.
Inoltre abbiamo anche visto come utilizzare un servo motore SG90 su Raspberry Pi.
Possiamo combinare le due tipologie di progetti per creare un sistema che simula l’apertura di un cancello nel momento in cui riconosce la targa ed è uguale a quella presa come riferimento per effettuare il confronto.
Materiale da utilizzare
- Raspberry Pi
- Raspberry Pi Camera
- SG90
Per chi utilizzasse per la prima volta la Raspberry Pi Camera leggendo questo articolo sarete in grado di configurarla da zero: Come installare e configurare la Raspberry Pi Camera
TI invito a leggere anche l’articolo precedente sul bot e sul riconoscimento di targhe:
Ecco un pinout del sg90
Ecco un diagramma di collegamento
Dobbiamo installare poi varie librerie tra cui:
- open cv
- 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 |
Codice
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 |
import time import os import cv2 import imutils import numpy as np import pytesseract from PIL import Image from picamera import PiCamera # use this custom pin-factory to fix servo jitter. # IMPORTANT: make sure pigpio deamon is running: 'sudo pigpiod' from gpiozero.pins.pigpio import PiGPIOFactory from gpiozero import Servo from time import sleep # create a custom pin-factory to fix servo jitter # more info here: https://gpiozero.readthedocs.io/en/stable/api_output.html#servo # and here: https://gpiozero.readthedocs.io/en/stable/api_pins.html pigpio_factory = PiGPIOFactory() servo = Servo(17, pin_factory=pigpio_factory) targariferimento = "FV-I81EX" camera = PiCamera () camera.resolution = (1024,720) i=0 while True: camera.capture("/home/pi/Desktop/timelapse/image{0:04d}.jpg".format(i)) img = cv2.imread(str("/home/pi/Desktop/timelapse/image{0:04d}.jpg".format(i)),cv2.IMREAD_COLOR) 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 # 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) cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:10] screenCnt = 0 # loop over our contours for c in cnts: # approximate the contour peri = cv2.arcLength(c, True) 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) # Masking the part other than the number plate 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) # Now crop (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').strip() print("Detected Number is:",text) print("targa riferimento :",targariferimento) if text == targariferimento: servo.min() print("servo min") sleep(3) servo.max() #cv2.imshow('image',img) #cv2.imshow('Cropped',Cropped) cv2.waitKey(5000) time.sleep(5) |
Avvia il codice, se la targa letta è uguale a quella di riferimento il servomotore si muove
Ecco un 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