Archive for 11. aug. 2014

OpenCV: leiame pildilt autonumbri

august 11, 2014

Kuna vahel on hea enda ajule anda koormust rohkem kui 15%, siis mõtlesin võiks jälle OpenCV’ga mängida.
Ausalt öeldes pole C++ väga ammu kasutanud. Mida soovisin teha, oli panna arvuti pildilt auto numbreid otsima, algul tegin palju katsetusi (trial / error development) ja jõudsin sarnasesse punkti, kuhu OpenCV profid. OpenCV pani aju 105% tööle, tuli lausa lisajahutus appi võtta -:)

Millised oleks selle süsteemi rakendused: tulid mõned uitmõtted, ntx sul firmal värav, mis tunneb auto ära ja otsustab – kas see auto lasta automaatväravatest läbi või mitte. Või politseil “background task”, kui patrull ringi sõidab, siis arvuti jooksvalt analüüsib autode numbreid ja teavitab, kas see auto tuleks auto peatada ntx ärandatud / arestitud jne jne.


Leidsin kaks asjalikku algoritmi ja sisuliselt buildisin neist projektidest DLL’id as IS, Delphi’s tegin vaid UI poole:

https://github.com/skandhurkat/CarDetect

https://github.com/MasteringOpenCV/code/tree/master/Chapter5_NumberPlateRecognition

Ka neil algoritmidel omad puudused: paljusid numbreid ei leia, eriti kui autost on pilt tehtud suure nurga all. Parima tulemuse saate, kui autot otse pildistada. Üldiselt algoritmid seal mitmetahulised, aga sisu mõneti sarnane, leia ristküliku taoline kontuur, mille suurus ei ole X ja Y väärtustest suurem. Pildil on numbrilaud alati mingise väikese nurga all, OCR jaoks oleks hea kui see korrigeerida sirgeks. See autonumbri tuvastus pole nii lihtne, kui võiks arvata !

Meie riigiteataja ka abiks: saate teada, millised autonumbri mõõdud Eestis kasutusel:

https://www.riigiteataja.ee/akt/13040616

Mõtlesin, et algul kasutan Harris’e nurkade detektorit, aga autonumbrite omadused ja autode kujud ajavad selle suht sassi. Aga harimise mõttes panen algoritmid, millega leida pildilt nurki ja jooni.

http://docs.opencv.org/modules/imgproc/doc/feature_detection.html?highlight=cornerharris#cornerharris

Lühidalt üritan kirjeldada ära nende projektide töö põhimõtet:

* Esmalt teeme pildi mustvalgeks cvtColor

* Järgnevalt eemaldame kerge müra blur(img_gray, img_gray, Size(5,5));

* Siis sooritame Sobel teisenduse.

http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html

Sisuliselt leiab kohad kus kontuuride värvid muutuvad ja saame kontuuridest sisuliselt mustvalge pildi.


sobel

Järgnevalt Threshold, sisuliselt ütleme, et jäta tähtsamad pikslid alles, Sobel kontuurid on natuke laialivalguvad. Saame kenasti valged kontuurjooned mustal tagataustal.

http://docs.opencv.org/doc/tutorials/imgproc/threshold/threshold.html

threshold

morphologyEx kuidas seda nüüd öeldagi, leia ja ühenda pikslid, mis asuvad lähestikku. Saame regioonid, mida analüüsida (ala kas on ristküliku moodi).

http://docs.opencv.org/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.html

close

* Siis findContours abil leiame kõik välised kontuurid: nüüd kus need leitud saame need kanda tagasi olemasolevale pildile.

mask1

Edasine on paras keemia, mida soovitan neist C++ lähtekoodidest lugeda, sisuliselt tuleb analüüsida, kas on ikka ristkülik ja kas seal midagi põnevat sees.

Minu testprogramm teeb cache kataloogi jpeg failid “võimalike” numbritega. Samm, mille võite teha ise, OCR programm peale lasta. Mina soovitan Tesseract-ocr tekstituvastust !

Minu testprogrammi saab siit www.stiigo.com/download/carnumbers.zip

Advertisements