- Предварителни условия
- Стъпки, свързани с разпознаването на регистрационния номер с помощта на Raspberry Pi
- 1. Откриване на регистрационния номер
- 2. Сегментиране на знаци
- 3. Разпознаване на символи
- Случаи на неуспех при разпознаване на регистрационния номер
- Други успешни примери
Сигурността винаги е била основна грижа за човечеството. Днес имаме камери за видеонаблюдение в училища, болници и на всяко друго обществено място, за да се чувстваме сигурни. Според проучване на HIS се изчислява, че през 2014 г. е имало инсталирани и функциониращи около 245 милиона охранителни камери, което е все едно да имате една охранителна камера на всеки 30 души на тази планета. С напредъка в технологиите, особено в обработката на изображения и машинното обучение, е възможно да направите тези камери по-умни, като ги обучите да обработват информация от видео емисията.
Видео емисията от тези камери може да се използва за извършване на разпознаване на лица, анализ на модели, анализ на емоции и много други, което наистина би го доближило до нещо като „Божието око“, показано във филма FF7. Всъщност компании за наблюдение като Hikvision и много други вече са започнали да прилагат тези функции в своите продукти. Преди използвахме обработка на изображения MATLAB за четене на регистрационния номер, днес в тази статия ще научим как да разпознаваме и четем номера на регистрационния номер от автомобили, използващи Raspberry Pi и OpenCV. Ще използваме няколко произволни изображения на превозни средства от Google и ще напишем програма за разпознаване на регистрационната табела с помощта на OpenCV Contour Detection и след това ще прочетем номера от табелата с помощта на Tesseract OCR. Звучи интересно нали !, така че нека да започнем.
Предварителни условия
Както беше казано по-рано, ние ще използваме библиотеката OpenCV за откриване и разпознаване на лица. Така че не забравяйте да инсталирате OpenCV библиотека на Raspberry Pi, преди да продължите с този урок. Също така захранвайте своя Pi с адаптер 2A и го свържете към монитор на дисплея за по-лесно отстраняване на грешки.
Този урок няма да обясни как точно работи OpenCV, ако се интересувате от обучение за обработка на изображения, разгледайте тези основи на OpenCV и разширени уроци за обработка на изображения. Можете също така да научите за контури, откриване на петна и т.н. в този урок за сегментиране на изображения, използвайки OpenCV. Ще направим нещо подобно на това, за да открием регистрационната табела на автомобила от изображението.
Стъпки, свързани с разпознаването на регистрационния номер с помощта на Raspberry Pi
Разпознаването на регистрационния номер или накратко LPR включва три основни стъпки. Стъпките са както следва
1. Откриване на регистрационния номер : Първата стъпка е да се открие регистрационната табела от автомобила. Ще използваме опцията за контур в OpenCV, за да открием правоъгълни обекти за намиране на регистрационната табела. Точността може да се подобри, ако знаем точния размер, цвета и приблизителното местоположение на табелката с номера. Обикновено алгоритъмът за откриване се обучава въз основа на позицията на камерата и вида на регистрационния номер, използван в конкретната държава. Това става по-сложно, ако изображението дори няма кола, в този случай ще направим допълнителна стъпка за откриване на автомобила и след това регистрационната табела.
2. Сегментиране на знаци: След като открием регистрационната табела, трябва да я изрежем и запазим като ново изображение. Отново това може да се направи лесно с помощта на OpenCV.
3. Разпознаване на символи: Сега на новото изображение, което получихме в предишната стъпка, със сигурност са написани някои знаци (цифри / азбуки). И така, можем да извършим OCR (оптично разпознаване на символи) върху него, за да открием номера. Вече обяснихме оптичното разпознаване на символи (OCR) с помощта на Raspberry Pi.
1. Откриване на регистрационния номер
Първата стъпка в този четец на регистрационни номера на Raspberry Pi е да се открие регистрационната табела. Нека вземем примерно изображение на автомобил и да започнем с откриването на регистрационния номер на този автомобил. След това ще използваме същото изображение и за сегментиране на символи и разпознаване на символи. Ако искате да преминете направо в кода без обяснение, можете да превъртите надолу до края на тази страница, където е предоставен пълният код. Тестовото изображение, което използвам за този урок, е показано по-долу.
Стъпка 1: Преоразмерете изображението до необходимия размер и след това го вземете в сива скала. Кодът за същото е даден по-долу
img = cv2.resize (img, (620,480)) сиво = cv2.cvtColor (img, cv2.COLOR_BGR2GREY) #convert в сива скала
Преоразмеряването ни помага да избегнем проблеми с изображения с по-голяма разделителна способност, уверете се, че табелката с номера все още остава в рамката след преоразмеряването. Мащабирането на сивото е често срещано във всички стъпки за обработка на изображения. Това ускорява други синуси на следващия процес, при обработката на изображението вече не се налага да се занимаваме с цветните детайли. Изображението ще бъде преобразено нещо подобно, когато тази стъпка бъде направена
Стъпка 2: Всяко изображение ще има полезна и безполезна информация, в този случай за нас само регистрационният номер е полезната информация, останалите са почти безполезни за нашата програма. Тази безполезна информация се нарича шум. Обикновено използването на двустранен филтър (замъгляване) ще премахне нежеланите детайли от изображението. Кодът за същото е
сив = cv2.bilateralFilter (сив, 11, 17, 17)
Синтаксисът е destination_image = cv2.bilateralFilter (source_image, диаметър на пиксела, sigmaColor, sigmaSpace). Можете да увеличите цвета на сигмата и пространството на сигма от 17 на по-високи стойности, за да размажете повече информация за фона, но внимавайте полезната част да не се размие. Изходното изображение е показано по-долу, тъй като можете да видите, че подробностите за фона (дърво и сграда) са замъглени в това изображение. По този начин можем да избегнем програмата да се концентрира върху тези региони по-късно.
Стъпка 3: Следващата стъпка е интересна, когато извършваме откриване на ръбове. Има много начини да го направите, най-лесният и популярен начин е да използвате метода canny edge от OpenCV. Линията, която прави същото, е показана по-долу
edged = cv2.Canny (сиво, 30, 200) # Извършване на откриване на ръба
Синтаксисът ще бъде destination_image = cv2.Canny (source_image, pragValue 1, pragValue 2). Праговата стойност 1 и Праговата стойност 2 са минималните и максималните прагови стойности. Показват се само ръбовете, които имат градиент на интензивност над минималната прагова стойност и по-малка от максималната прагова стойност. Полученото изображение е показано по-долу
Стъпка 4: Сега можем да започнем да търсим контури на нашето изображение, вече научихме как да намираме контури с помощта на OpenCV в нашия предишен урок, така че просто продължаваме по същия начин.
NTS = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) CNTs = imutils.grab_contours (CNTs) CNTs = сортирани (CNTs, ключ = cv2.contourArea, обратни = True) screenCnt = Няма
След като броячите бъдат открити, ние ги сортираме от големи на малки и отчитаме само първите 10 резултата, като игнорираме останалите. В нашето изображение броячът може да бъде всичко, което има затворена повърхност, но от всички получени резултати номерът на регистрационния номер също ще бъде там, тъй като той също е затворена повърхност.
За да филтрираме изображението на регистрационната табела сред получените резултати, ще завъртим всички резултати и ще проверим кой има контур с форма на правоъгълник с четири страни и затворена фигура. Тъй като регистрационният номер определено ще бъде четириъгълна фигура с правоъгълник.
# контур над нашите контури за c в cnts: # приближаваме контура peri = cv2.arcLength (c, True) приблизително = cv2.approxPolyDP (c, 0.018 * peri, True) # ако нашият приближен контур има четири точки, тогава # ние можем да предположим, че сме намерили екрана си, ако len (приблизително) == 4: screenCnt = приблизително почивка
Стойността 0,018 е експериментална стойност; можете да играете около него, за да проверите кое работи най-добре за вас. Или го пренесете на следващото ниво, като използвате машинно обучение за обучение въз основа на изображения на автомобила и след това използвайте правилната стойност там. След като намерим правилния брояч, ние го запазваме в променлива, наречена screenCnt, и след това нарисуваме правоъгълно поле около него, за да сме сигурни, че сме открили регистрационния номер правилно.
Стъпка 5: Сега, когато знаем къде е табелката с номера, останалата информация е почти безполезна за нас. Така че можем да пристъпим към маскиране на цялата картина, с изключение на мястото, където е табелката с номера. Кодът, който прави същото, е показан по-долу
# Маскиране на частта, различна от маската на регистрационния номер = np.zeros (сива форма, np.uint8) new_image = cv2.drawContours (маска,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = маска)
Маскираното ново изображение ще се появи нещо като по-долу
2. Сегментиране на знаци
Следващата стъпка в разпознаването на регистрационния номер на Raspberry Pi е да сегментирате регистрационната табела от изображението, като го изрежете и запазите като ново изображение. След това можем да използваме това изображение, за да открием характера в него. Кодът за изрязване на изображението roi (регион от интерес) от основното изображение е показан по-долу
# Сега изрязване (x, y) = np. където (маска == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Подрязано = сиво
Полученото изображение е показано по-долу. Обикновено се добавя към изрязването на изображението, ние също можем да го оцветим в сиво и да го острием, ако е необходимо. Това се прави, за да се подобри разпознаването на символите в следващата стъпка. Установих обаче, че работи добре дори и с оригиналното изображение.
3. Разпознаване на символи
Последната стъпка в това разпознаване на регистрационния номер на Raspberry Pi е действителното четене на информацията от регистрационния номер от сегментираното изображение. Ще използваме пакета pytesseract за четене на символи от изображение, точно както направихме в предишния урок. Кодът за същото е даден по-долу
# Прочетете номерната плоча text = pytesseract.image_to_string (Cropped, config = '- psm 11') print (" Откритият номер е:", текст)
Вече обяснихме как да конфигурираме двигател на Tesseract, така че тук отново, ако е необходимо, можем да конфигурираме OCR на Tesseract, за да получим по-добри резултати, ако е необходимо. След това откритият знак се отпечатва на конзолата. Когато се компилира резултатът е показан по-долу
Както можете да видите оригиналното изображение е с номер „HR 25 BR9044“ и нашата програма е открила, че е отпечатало същата стойност на екрана.
Случаи на неуспех при разпознаване на регистрационния номер
Пълният проектен файл, който разпознаването на регистрационния номер на Raspberry Pi може да бъде изтеглен от тук, съдържа програмата и тестовите изображения, които използвахме за проверка на нашата програма. Без да се казва, трябва да се помни, че резултатите от този метод няма да бъдат точни . Точността зависи от яснотата на изображението, ориентация, излагането на слънчева светлина и др. За да получите по-добри резултати, можете да опитате да внедрите алгоритми за машинно обучение заедно с това.
За да добиете представа, нека разгледаме друг пример, при който колата не е обърната директно към камерата.
Както можете да видите, нашата програма успя да открие правилно регистрационния номер и да го изреже. Но библиотеката на Tesseract не успя да разпознае правилно символите. Вместо действителното „TS 08 UE 3396“, OCR го разпознава като „1508 ye 3396“. Проблеми като този могат да бъдат коригирани чрез използване на изображения с по-добра ориентация или чрез конфигуриране на двигателя на Tesseract .
Друг най-лош сценарий е, когато контурът не успее да открие правилно регистрационния номер. Изображението по-долу има твърде много информация за фона и лошо осветление, че програмата дори не успя да идентифицира регистрационния номер от номера. В този случай трябва отново да разчитаме на машинно обучение или да подобряваме качеството на картината.
Други успешни примери
Повечето пъти времето за качество и ориентация на изображението е правилно, програмата успя да идентифицира регистрационния номер и да прочете номера от него. Долните моментни снимки показват малко от успешните получени резултати. Отново всички тестови изображения и използваният тук код ще бъдат налични в ZIP файла, предоставен тук.
Надявам се, че сте разбрали автоматичното разпознаване на номера с помощта на Raspberry Pi и сте се радвали да създадете нещо страхотно сами. Какво друго мислите, че може да се направи с OpenCV и Tesseract ?, Кажете ми вашите мисли в раздела за коментари. Ако имате въпроси относно тази статия, не се колебайте да ги оставите в раздела за коментари по-долу или да използвате форумите за други технически въпроси.