- Preduvjeti
- Koraci u prepoznavanju registarske pločice pomoću Raspberry Pi
- 1. Otkrivanje registarske pločice
- 2. Segmentacija likova
- 3. Prepoznavanje likova
- Slučajevi neuspjeha u prepoznavanju registarske pločice
- Ostali uspješni primjeri
Sigurnost je uvijek bila glavna briga čovječanstva. Danas imamo kamere za video nadzor u školama, bolnicama i na svakom drugom javnom mjestu kako bismo se osjećali sigurno. Prema istraživanju HIS-a, procjenjuje se da je još 2014. bilo instalirano i funkcioniralo oko 245 milijuna sigurnosnih kamera, što je poput posjedovanja jedne sigurnosne kamere na svakih 30 ljudi na ovom planetu. Napredom u tehnologiji, posebno u obradi slika i strojnom učenju, moguće je učiniti ove fotoaparate pametnijima osposobljavajući ih za obradu podataka iz video feeda.
Video feed s ovih kamera može se koristiti za prepoznavanje lica, analizu uzoraka, analizu emocija i još mnogo toga što bi ga doista približilo nečemu poput "Božjeg oka" prikazanog u filmu FF7. Zapravo su nadzorne tvrtke poput Hikvision-a i mnoge druge već počele primjenjivati ove značajke u svoje proizvode. Prije smo koristili obradu slike MATLAB za čitanje pločice s brojevima, danas ćemo u ovom članku naučiti kako prepoznati i očitati broj registarske pločice iz automobila koristeći Raspberry Pi i OpenCV. Upotrijebit ćemo neke slučajne Googleove slike vozila i napisati program za prepoznavanje registarske pločice pomoću OpenCV Contour Detection, a zatim ćemo pročitati broj s pločice pomoću Tesseract OCR-a. Zvuči zanimljivo, zar ne !, pa krenimo.
Preduvjeti
Kao što je ranije rečeno, koristit ćemo knjižnicu OpenCV za otkrivanje i prepoznavanje lica. Stoga obavezno instalirajte OpenCV knjižnicu na Raspberry Pi prije nego što nastavite s ovim vodičem. Također napajajte svoj Pi 2A adapterom i povežite ga s monitorom zaslona radi lakšeg uklanjanja pogrešaka.
Ovaj vodič neće objasniti kako točno OpenCV radi, ako ste zainteresirani za učenje obrade slika, pogledajte ove osnove OpenCV-a i napredne vodiče za obradu slika. Također možete naučiti o konturama, otkrivanju mrlja itd. U ovom vodiču za segmentaciju slika pomoću OpenCV-a. Radit ćemo nešto slično ovome kako bismo na slici otkrili registarsku tablicu automobila.
Koraci u prepoznavanju registarske pločice pomoću Raspberry Pi
Prepoznavanje registarskih oznaka ili skraćeno LPR uključuje tri glavna koraka. Koraci su sljedeći
1. Otkrivanje registarske pločice: Prvi korak je otkrivanje registarske tablice iz automobila. Upotrijebit ćemo opciju konture u OpenCV-u za otkrivanje pravokutnih objekata kako bismo pronašli tablicu s brojevima. Točnost se može poboljšati ako znamo točnu veličinu, boju i približno mjesto pločice s brojevima. Uobičajeno se algoritam otkrivanja obučava na temelju položaja kamere i vrste registarske pločice koja se koristi u toj određenoj zemlji. To postaje zamršenije ako slika nema niti automobil, u ovom ćemo slučaju dodatni korak za otkrivanje automobila, a zatim i registarske pločice.
2. Segmentacija znakova: Nakon što smo otkrili registarsku pločicu, moramo je izrezati i spremiti kao novu sliku. To se opet može učiniti lako pomoću OpenCV-a.
3. Prepoznavanje znakova: Nova slika koju smo dobili u prethodnom koraku zasigurno će imati neke znakove (brojeve / abecede). Dakle, na njemu možemo izvršiti OCR (optičko prepoznavanje znakova) kako bismo otkrili broj. Već smo objasnili optičko prepoznavanje znakova (OCR) pomoću Raspberry Pi.
1. Otkrivanje registarske pločice
Prvi korak u ovom čitaču registarskih pločica Raspberry Pi je otkrivanje registarske pločice. Uzmimo uzorak slike automobila i krenimo s otkrivanjem registarske pločice na tom automobilu. Tada ćemo koristiti istu sliku i za segmentaciju likova i prepoznavanje znakova. Ako želite skoknuti ravno u kôd bez objašnjenja, onda se možete pomaknuti do dna ove stranice, gdje se nalazi cjeloviti kôd. Test slika koju koristim za ovaj vodič je prikazana u nastavku.

Korak 1: Smanjite veličinu slike na željenu veličinu, a zatim je dodajte u sivim skalama. Kôd za isti naveden je u nastavku
img = cv2.resize (img, (620,480)) grey = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY) # pretvori u sivu ljestvicu
Promjenom veličine pomažemo nam da izbjegnemo probleme sa slikama veće rezolucije, pazite da tablica s brojevima i dalje ostaje u kadru nakon promjene veličine. Skaliranje sive boje uobičajeno je u svim koracima obrade slike. To ubrzava ostale naredne postupke, pri obradi slike više se ne moramo baviti detaljima boja. Slika bi se transformirala ovako nekako kad se završi ovaj korak

Korak 2: Svaka će slika imati korisne i beskorisne informacije, u ovom slučaju za nas su samo registarske pločice korisne informacije, a ostale su prilično beskorisne za naš program. Te se beskorisne informacije nazivaju bukom. Uobičajeno korištenje dvostranog filtra (Zamućivanje) uklonit će neželjene detalje sa slike. Šifra istog je
sivi = cv2.bilateralFilter (sivi, 11, 17, 17)
Sintaksa je odredište_slika = cv2.bilateralFilter (izvor_slika, promjer piksela, sigmaColor, sigmaSpace). Možete povećati boju sigme i prostor sigme sa 17 na više vrijednosti kako biste zamaglili više pozadinskih informacija, ali pripazite da se korisni dio ne zamuti. Izlazna slika prikazana je u nastavku, jer možete vidjeti da su detalji pozadine (stablo i zgrada) zamagljeni na ovoj slici. Na taj način možemo izbjeći da se program kasnije koncentrira na ove regije.

Korak 3: Sljedeći je korak zanimljiv gdje izvodimo detekciju ruba. Postoji mnogo načina za to, najlakši i najpopularniji način je korištenje metode canny edge iz OpenCV-a. Redak za isto učiniti prikazan je u nastavku
edged = cv2.Canny (siva, 30, 200) # Izvedi otkrivanje rubova
Sintaksa će biti odredište_slika = cv2.Canny (izvor_slika, pragVrijednost 1, PragVrijednost 2). Prag vrijednosti 1 i prag vrijednosti 2 minimalne su i maksimalne vrijednosti praga. Prikazuju se samo rubovi koji imaju gradijent intenziteta veći od minimalne vrijednosti praga i manji od maksimalne vrijednosti praga. Rezultirajuća slika prikazana je u nastavku

Korak 4: Sada možemo početi tražiti konture na našoj slici, već smo naučili kako pronaći konture pomoću OpenCV-a u našem prethodnom vodiču, pa nastavljamo isto.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours (cnts) cnts = sorted (cnts, key = cv2.contourArea, reverse = True) screenCnt = None
Jednom kada su brojači detektirani, razvrstavamo ih od velikog do malog i uzimamo u obzir samo prvih 10 rezultata, ne obazirući se na ostale. Na našoj slici brojač može biti sve što ima zatvorenu površinu, ali od svih dobivenih rezultata također će biti i registarska pločica, jer je to također zatvorena površina.
Da bismo filtrirali sliku registarske pločice među dobivene rezultate, petlju ćemo pregledati sve rezultate i provjeriti koja ima konturu oblika pravokutnika s četiri stranice i zatvorenom figurom. Budući da bi registarska pločica definitivno bila četverostrana figura pravokutnika.
# petlja preko naših kontura za c u cnts: # približna kontura peri = cv2.arcLength (c, True) približno = cv2.approxPolyDP (c, 0,018 * peri, True) # ako naša približna kontura ima četiri točke, tada # mi možemo pretpostaviti da smo pronašli svoj zaslon ako je len (približno) == 4: screenCnt = približno pauza
Vrijednost 0,018 je eksperimentalna vrijednost; možete se poigrati oko njega i provjeriti koji vam najbolje odgovara. Ili ga prenesite na sljedeću razinu pomoću strojnog učenja za vježbanje na temelju slika automobila, a zatim tamo upotrijebite pravu vrijednost. Nakon što pronađemo pravi brojač, spremamo ga u varijablu koja se zove screenCnt, a zatim oko njega nacrtamo okvir pravokutnika kako bismo bili sigurni da smo ispravno otkrili registarsku pločicu.

Korak 5: Sad kad znamo gdje je registarska pločica, preostale informacije su nam prilično beskorisne. Tako možemo nastaviti s maskiranjem cijele slike, osim mjesta na kojem je tablica s brojevima. Kôd za isto je prikazan u nastavku
# Maskiranje dijela koji nije maska registarske pločice = np.zeros (gray.shape, np.uint8) new_image = cv2.drawContours (maska ,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = maska)
Maskirana nova slika pojavit će se otprilike kao ispod

2. Segmentacija likova
Sljedeći korak u prepoznavanju matične ploče Raspberry Pi je segmentacija registarske pločice sa slike izrezivanjem i spremanjem kao nove slike. Tada ovu sliku možemo koristiti za otkrivanje lika na njoj. Kôd za obrezivanje slike roi (regija od interesa) iz glavne slike prikazan je ispod
# Sada je obrezivanje (x, y) = np.gdje (maska == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Obrezano = sivo
Rezultirajuća slika prikazana je u nastavku. Obično dodan obrezivanju slike, možemo je i sivo obojiti i po potrebi izrezati. To je učinjeno radi poboljšanja prepoznavanja likova u sljedećem koraku. Međutim, otkrio sam da dobro funkcionira čak i s originalnom slikom.

3. Prepoznavanje likova
Posljednji korak u ovom prepoznavanju pločice s pločicom Raspberry Pi zapravo je čitanje podataka s pločice s segmentirane slike. Upotrijebit ćemo paket pytesseract za čitanje znakova sa slike, baš kao što smo to činili u prethodnom vodiču. Kôd za isti naveden je u nastavku
# Pročitajte broj pločice text = pytesseract.image_to_string (Cropped, config = '- psm 11') print ("Otkriveni broj je:", tekst)
Već smo objasnili kako konfigurirati Tesseract motor, pa ovdje po potrebi možemo konfigurirati Tesseract OCR kako bismo postigli bolje rezultate ako je potrebno. Otkriveni znak se zatim ispisuje na konzoli. Kada se sastavi rezultat je prikazan kao dolje

Kao što vidite, originalna slika imala je broj „HR 25 BR9044“, a naš je program otkrio da je na zaslonu ispisala istu vrijednost.
Slučajevi neuspjeha u prepoznavanju registarske pločice
Kompletnu projektnu datoteku za prepoznavanje registarske pločice Raspberry Pi možete preuzeti ovdje, sadrži program i testne slike koje smo koristili za provjeru našeg programa. Bez da se to kaže, imajte na umu da rezultati ove metode neće biti točni . Točnost ovisi o jasnoći slike, orijentaciji, izloženosti svjetlu itd. Da biste postigli bolje rezultate, zajedno s ovim možete pokušati implementirati algoritme strojnog učenja.
Da bismo dobili ideju, pogledajmo još jedan primjer kada automobil nije izravno okrenut prema kameri.

Kao što vidite, naš je program uspio ispravno otkriti registarsku pločicu i obrezati je. Ali biblioteka Tesseract nije uspjela pravilno prepoznati znakove. Umjesto stvarnog "TS 08 UE 3396", OCR je prepoznao da je "1508 ye 3396". Ovakvi se problemi mogu ispraviti korištenjem slika bolje orijentacije ili konfiguriranjem Tesseract motora.
Drugi je najgori scenarij gdje kontura ne uspije pravilno otkriti registarsku pločicu. Na slici ispod nalazi se previše pozadinskih podataka i loše osvjetljenje pa program čak nije uspio prepoznati registarsku pločicu s broja. U ovom slučaju moramo se ponovno osloniti na Strojno učenje ili poboljšati kvalitetu slike.

Ostali uspješni primjeri
Većinu vremena kvaliteta slike i orijentacija slike su točni, program je uspio identificirati registarsku pločicu i očitati broj s nje. Snimke u nastavku pokazuju nekoliko uspješnih dobivenih rezultata. Sve testne slike i kod koji se ovdje koriste ponovno će biti dostupni u ZIP datoteci koja se ovdje nalazi.


Nadam se da ste razumjeli automatsko prepoznavanje matične pločice pomoću Raspberry Pi-a i uživali sami graditi nešto cool. Što mislite što još možete učiniti s OpenCV-om i Tesseractom ?, Javite mi svoje mišljenje u odjeljku za komentare. Ako imate bilo kakvih pitanja u vezi s ovim člankom, slobodno ih ostavite u odjeljku za komentare u nastavku ili koristite forume za druge tehničke upite.
