- Requisits previs
- Passos relacionats amb el reconeixement de matrícules mitjançant Raspberry Pi
- 1. Detecció de matrícules
- 2. Segmentació de caràcters
- 3. Reconeixement de personatges
- Casos fallits en el reconeixement de plaques numèriques
- Altres exemples d'èxit
La seguretat sempre ha estat una preocupació important per a la humanitat. Avui disposem de càmeres de videovigilància a les escoles, hospitals i qualsevol altre lloc públic per fer-nos sentir segurs. Segons una enquesta realitzada per HIS, s'estima que hi havia al voltant de 245 milions de càmeres de seguretat instal·lades i funcionant el 2014, que és com tenir una càmera de seguretat per cada 30 persones en aquest planeta. Amb l’avenç tecnològic, especialment en el processament d’imatges i l’aprenentatge automàtic, és possible que aquestes càmeres siguin més intel·ligents entrenant-les per processar la informació del canal de vídeo.
El canal de vídeo d’aquestes càmeres es pot utilitzar per realitzar reconeixements facials, anàlisis de patrons, anàlisi d’emocions i molt més, cosa que l’acostaria realment a una cosa semblant a l’“ Ull de Déu ”que es mostra a la pel·lícula FF7. De fet, empreses de vigilància com Hikvision i moltes altres ja han començat a implementar aquestes funcions als seus productes. Abans hem utilitzat el processament d’imatges MATLAB per llegir la matrícula, avui en aquest article aprendrem a reconèixer i llegir el número de matrícula d’automòbils que utilitza Raspberry Pi i OpenCV. Utilitzarem algunes imatges aleatòries de vehicles de Google i escriurem un programa per reconèixer la matrícula mitjançant OpenCV Contour Detection i, a continuació, llegirem el número de la placa amb Tesseract OCR. Sona interessant oi !, així que comencem.
Requisits previs
Com es va dir anteriorment, utilitzarem la biblioteca OpenCV per detectar i reconèixer les cares. Per tant, assegureu-vos d’instal·lar OpenCV Library a Raspberry Pi abans de continuar amb aquest tutorial. També alimenteu el Pi amb un adaptador 2A i connecteu-lo a un monitor de pantalla per facilitar la depuració.
Aquest tutorial no explicarà com funciona exactament OpenCV, si esteu interessats en aprendre el processament d’imatges, consulteu aquests conceptes bàsics d’OpenCV i els tutorials avançats de processament d’imatges. També podeu obtenir informació sobre els contorns, la detecció de blobs, etc. en aquest tutorial de segmentació d’imatges mitjançant OpenCV. Farem alguna cosa similar a això per detectar la matrícula del cotxe a partir de la imatge.
Passos relacionats amb el reconeixement de matrícules mitjançant Raspberry Pi
El reconeixement de matrícules o LPR en resum, implica tres passos principals. Els passos són els següents
1. Detecció de matrícules: el primer pas és detectar la matrícula del cotxe. Utilitzarem l’opció de contorn a OpenCV per detectar objectes rectangulars per trobar la placa de matrícula. La precisió es pot millorar si coneixem la mida exacta, el color i la ubicació aproximada de la matrícula. Normalment, l'algorisme de detecció s'entren en funció de la posició de la càmera i del tipus de matrícula utilitzada en aquest país en concret. Això es fa més complicat si la imatge no té ni un cotxe, en aquest cas farem un pas addicional per detectar el cotxe i després la matrícula.
2. Segmentació de caràcters: un cop detectada la matrícula, hem de retallar-la i desar-la com a nova imatge. Una vegada més, això es pot fer fàcilment mitjançant OpenCV.
3. Reconeixement de caràcters: ara, la nova imatge que hem obtingut al pas anterior segur que tindrà escrits alguns caràcters (números / alfabets). Per tant, podem realitzar OCR (reconeixement òptic de caràcters) per detectar-ne el nombre. Ja hem explicat el reconeixement òptic de caràcters (OCR) mitjançant Raspberry Pi.
1. Detecció de matrícules
El primer pas d’aquest Lector de matrícules de Raspberry Pi és detectar la matrícula. Prenem una imatge de mostra d’un cotxe i comencem per detectar la matrícula d’aquest cotxe. A continuació, farem servir la mateixa imatge per a la segmentació i el reconeixement de caràcters. Si voleu saltar directament al codi sense explicacions, podeu desplaçar-vos cap avall fins al final d'aquesta pàgina, on es proporciona el codi complet. A continuació es mostra la imatge de prova que estic fent servir per aquest tutorial.

Pas 1: canvieu la mida de la imatge a la mida desitjada i, a continuació, en escala de grisos. A continuació es dóna el codi del mateix
img = cv2.resize (img, (620.480)) gris = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) #converteix a escala de grisos
Quan canvieu la mida, ens ajudem a evitar problemes amb imatges de resolució més gran. Assegureu-vos que la matrícula es mantingui al marc després de canviar la mida. L’escala de grisos és habitual en tots els passos de processament d’imatges. Això accelera altres processos següents, ja que ja no hem de tractar els detalls del color en processar una imatge. La imatge es transformaria com aquesta quan es faci aquest pas

Pas 2: Cada imatge tindrà informació útil i inútil, en aquest cas per a nosaltres només la matrícula és la informació útil, la resta són pràcticament inútils per al nostre programa. Aquesta informació inútil s’anomena soroll. Normalment, mitjançant un filtre bilateral (desenfocament) s’eliminaran els detalls no desitjats d’una imatge. El codi del mateix és
gris = cv2.bilateralFilter (gris, 11, 17, 17)
La sintaxi és destination_image = cv2.bilateralFilter (source_image, diametre del píxel, sigmaColor, sigmaSpace). Podeu augmentar el color sigma i l’espai sigma de 17 a valors superiors per difuminar més informació de fons, però tingueu cura que la part útil no quedi borrosa. La imatge de sortida es mostra a continuació, ja que podeu veure que els detalls del fons (arbre i edifici) estan difuminats en aquesta imatge. D’aquesta manera podem evitar que el programa es concentri en aquestes regions més endavant.

Pas 3: el següent pas és interessant on realitzem la detecció de vores. Hi ha moltes maneres de fer-ho, la manera més fàcil i popular és fer servir el mètode cany edge d’OpenCV. A continuació es mostra la línia per fer el mateix
edged = cv2.Canny (gris, 30, 200) #Perform Detecció de vores
La sintaxi serà destination_image = cv2.Canny (source_image, thresholdValue 1, thresholdValue 2). El valor llindar 1 i el valor llindar 2 són els valors llindar mínim i màxim. Només es mostraran les vores que tenen un gradient d’intensitat superior al valor del llindar mínim i inferior al valor del llindar màxim. La imatge resultant es mostra a continuació

Pas 4: Ara podem començar a cercar contorns a la nostra imatge, ja hem après sobre com trobar contorns mitjançant OpenCV al nostre tutorial anterior, de manera que continuem com el mateix.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours ( cnts) cnts = ordenats (cnts, key = cv2.contourArea, reverse = True) screenCnt = None
Un cop detectats els comptadors, els classifiquem de grans a petits i només considerem els primers 10 resultats ignorant els altres. A la nostra imatge, el comptador podria ser qualsevol cosa que tingui una superfície tancada, però de tots els resultats obtinguts el número de la matrícula també hi serà, ja que també és una superfície tancada.
Per filtrar la imatge de la matrícula entre els resultats obtinguts, farem un bucle a través de tots els resultats i comprovarem que té un contorn de forma rectangular amb quatre costats i una figura tancada. Com que una matrícula seria sens dubte una figura de quatre cares de rectangle.
# bucle sobre els nostres contorns per c en cnts: # aproximar el contorn peri = cv2.arcLength (c, True) aprox = cv2.approxPolyDP (c, 0,018 * peri, True) # si el nostre contorn aproximat té quatre punts, aleshores # we es pot assumir que hem trobat la nostra pantalla si len (aprox) == 4: screenCnt = aprox trencar
El valor 0,018 és un valor experimental; podeu jugar-hi per comprovar quin us funciona millor. O feu-ho al següent nivell mitjançant l’aprenentatge automàtic per entrenar-vos a partir d’imatges de cotxes i, tot seguit, feu-hi servir el valor adequat. Un cop hem trobat el comptador adequat, el guardem en una variable anomenada screenCnt i, a continuació, dibuixem un quadre rectangular al seu voltant per assegurar-nos que hem detectat correctament la matrícula.

Pas 5: ara que ja sabem on és la matrícula, la informació restant és pràcticament inútil per a nosaltres. Per tant, podem procedir a emmascarar tota la imatge, excepte el lloc on es troba la matrícula. A continuació es mostra el codi per fer el mateix
# Enmascarament de la peça diferent de la màscara de la matrícula = np.zeros (gray.shape, np.uint8) new_image = cv2.drawContours (mask, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = màscara)
La nova imatge emmascarada apareixerà com a sota

2. Segmentació de caràcters
El següent pas del reconeixement de la matrícula de Raspberry Pi és segmentar la matrícula de la imatge retallant-la i desant-la com a imatge nova. A continuació, podem utilitzar aquesta imatge per detectar el personatge que hi ha. A continuació es mostra el codi per retallar la imatge roi (regió d’interès) de la imatge principal
# Ara retalla (x, y) = np.where (màscara == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Retallat = gris
La imatge resultant es mostra a continuació. Normalment s’afegeix a retallar la imatge, també podem grisar-la i afilar-la si cal. Això es fa per millorar el reconeixement de personatges al següent pas. Tot i així, he trobat que funciona bé fins i tot amb la imatge original.

3. Reconeixement de personatges
El darrer pas d’aquest reconeixement de la matrícula de Raspberry Pi és llegir la informació de la matrícula de la imatge segmentada. Utilitzarem el paquet pytesseract per llegir els caràcters de la imatge, tal com vam fer al tutorial anterior. A continuació es dóna el codi del mateix
#Llegiu la matrícula text = pytesseract.image_to_string (retallada, config = '- psm 11') imprimeix ("El número detectat és:", text)
Ja hem explicat com configurar un motor Tesseract, de manera que, si cal, aquí podem configurar el Tesseract OCR per obtenir millors resultats si cal. El caràcter detectat s’imprimeix a la consola. Quan es compila, el resultat es mostra a continuació

Com podeu veure, la imatge original tenia el número "HR 25 BR9044" i el nostre programa ha detectat que imprimia el mateix valor a la pantalla.
Casos fallits en el reconeixement de plaques numèriques
El fitxer complet del projecte d’aquest reconeixement de plaques de matrícula Raspberry Pi es pot descarregar des d’aquí, conté el programa i les imatges de prova que hem utilitzat per comprovar el nostre programa. Sense dir-ho, cal recordar que els resultats d’aquest mètode no seran precisos . La precisió depèn de la claredat de la imatge, orientació, etc. exposició a la llum. Per obtenir millors resultats, podeu provar d'implementar algoritmes d'aprenentatge automàtic juntament amb això.
Per fer-nos una idea, vegem un altre exemple en què el cotxe no està cap a la càmera directament.

Com podeu veure, el nostre programa va ser capaç de detectar correctament la matrícula i retallar-la. Però la biblioteca Tesseract no ha pogut reconèixer correctament els personatges. En lloc de l'actual "TS 08 UE 3396", l'OCR ha reconegut que és "1508 ye 3396". Problemes com aquest es poden corregir utilitzant imatges d’orientació millor o configurant el motor Tesseract .
Un altre dels pitjors casos és que el contorn no detecta correctament la matrícula. La imatge següent conté massa informació de fons i una mala il·luminació que fins i tot el programa no ha pogut identificar la matrícula del número. En aquest cas, hem de retransmetre l'aprenentatge automàtic o millorar la qualitat de la imatge.

Altres exemples d'èxit
La majoria de les vegades que la qualitat i l’orientació de la imatge són correctes, el programa va ser capaç d’identificar la matrícula i llegir-ne el número. A continuació, es mostren alguns dels resultats obtinguts amb èxit. Una vegada més, totes les imatges de prova i el codi utilitzat aquí estaran disponibles al fitxer ZIP que es proporciona aquí.


Espero que hagueu entès el reconeixement automàtic de les plaques numèriques amb Raspberry Pi i us hagi agradat construir quelcom fresc pel vostre compte. Què més penseu que es pot fer amb OpenCV i Tesseract ?, Feu -me saber les vostres opinions a la secció de comentaris. Si teniu cap pregunta sobre aquest article, no dubteu a deixar-los a la secció de comentaris a continuació o a utilitzar els fòrums per a altres consultes tècniques.
