Изучение Python OpenCV / Урок #8 – Распознавание номерных знаков и чтение их — Transcript
Full transcript
- 0:00привет ходе этого урока мы научимся
- 0:02распознавать номерные знаки а также
- 0:04считывать информацию с них при помощи
- 0:06библиотеки opencv и но перед началом я
- 0:08рекомендую вам сайт айти прагер точка
- 0:10ком на этом сайте вы найдете код
- 0:12домашнее задание и много другой полезной
- 0:14информации ссылка на этот урок на сайте
- 0:16будет в описании к этому видео
- 0:18переходите не пожалеете
- 0:19в ходе этого урока мы также можем
- 0:21использовать натренирован ую модель
- 0:23точно так же как это мы делали в прошлом
- 0:25уроке но я предлагаю поступить немного
- 0:27иначе мы лучше будем использовать
- 0:29какие-либо сторонние библиотеки так как
- 0:31если использовать натренирован ую модель
- 0:33то в принципе этот урок он особо ничем
- 0:35не будет отличаться от прошлого урока
- 0:37поэтому в ходе этого урока мы с вами
- 0:40будем использовать различные сторонние
- 0:41библиотеки для считывания информации сын
- 0:44номерного знака
- 0:45ну а сам номерной знак мы уже будем
- 0:47находить самостоятельно при помощи
- 0:49библиотеки о пенсии и при помощи тех
- 0:51функций что мы изучали в ходе всего
- 0:53этого видеокурса для начала я предлагаю
- 0:56открыть терминал и сейчас мы установим
- 0:58кое-какие дополнительные библиотеки что
- 1:00нам понадобится в ходе самого этого
- 1:02видеоурока
- 1:03итак первый библиотека который нам
- 1:04понадобится это изи acer за счет этой
- 1:08библиотеке мы можем с вами считывать
- 1:10информацию с и картинки
- 1:12то есть например если там будет написано
- 1:13какой то текст то мы сможем вас читать
- 1:15поэтому мы давайте скопируем просто
- 1:18строку с и установка этой библиотеке им
- 1:20ну и так же выполним установку с модами
- 1:23блики внутри нашего проекта нам также
- 1:25нужна такая библиотека которая
- 1:27называется иметь ютился ну или ай эм
- 1:30ютилась за счет этой библиотеке мы имеем
- 1:32доступ к некоторым дополнительным
- 1:34базовым функциям при работе с
- 1:37изображениями то например вращение
- 1:39изображения это например там какая-то ее
- 1:41трансформация дополнительная да такое
- 1:43все можно делать при помощи up on se ven
- 1:44но даже здесь есть некоторые
- 1:46дополнительные интересные возможности
- 1:47которые которые нам как раз и
- 1:50понадобится входит тоже этого урока и
- 1:52так у меня тут пока происходит установка
- 1:54давайте я наверное еще открою один
- 1:56терминал здесь еще раз прописываю
- 1:58установку другой уже библиотеки ну и
- 2:01также помимо всех вот этих двух
- 2:03витёк я бы еще хотел установить такую
- 2:05библиотеку которая называется нет плод у
- 2:07рыб за счет этой библиотеке мы можем
- 2:09визуализировать различные данные ну и я
- 2:12просто за счет этой библиотеке буду
- 2:14выводить изображение на экран да можно
- 2:17изображение выводить при помощи up in
- 2:19seven но мы давайте просто чтобы как
- 2:22можно больше библиотека хватить там и
- 2:24давайте еще просто будем использовать
- 2:25matplotlib из 1
- 2:27рассмотрим каким именно образом можно за
- 2:29счет этой библиотеке уже что-либо будет
- 2:31выводить на экран
- 2:32поэтому также копируем строчку с
- 2:34установкой данной библиотеки и
- 2:36соответственно устанавливаем ее внутрь
- 2:38нашего проекта теперь давайте выполним
- 2:40все подключения пока давайте терминал
- 2:42даже скроем и так конечно же нам
- 2:44потребуется о пенсии библиотекам поэтому
- 2:46мы и здесь с вами
- 2:47импортировали дополнительно нам
- 2:49потребуется такая библиотека как нам ой
- 2:52мы давайте и здесь подключим и возможно
- 2:54даже дадим ей псевдоним н.п.
- 2:56обычно так все и прописывает также сюда
- 2:57мы импортируем еще библиотеку и мяч you
- 3:00tell us ну или просто а.м. ютел
- 3:03дополнительном и давайте еще сюда будем
- 3:05импортировать
- 3:06izeo.ru эту библиотеку ну и конечно же
- 3:10нам необходимо еще matplotlib
- 3:11импортировать но это не мультика
- 3:13научиться лишком огромная а мы по факту
- 3:15и будем использовать только для того
- 3:17чтобы вывести некое изображение на экран
- 3:20поэтому я давайте лучше укажу так что мы
- 3:22будем из библиотеки matplotlib мы из нее
- 3:25будем импортировать такую вещь как
- 3:27функция плод и за счет этой функции мы
- 3:31сможем что либо выводить
- 3:32но за счет вернее этого объекта мы
- 3:33сможем что либо выводить на экран
- 3:35например изображение здесь же можно
- 3:37указать некий
- 3:38псевдоним давайте я здесь укажу пел
- 3:41допустимо такое него будет все в доме
- 3:42теперь наконец приступаем к написанию
- 3:45нашей программы в первую очередь создаем
- 3:47некую переменам который будет ссылаться
- 3:49на изображение из нашей программке для
- 3:52того чтобы ссылаться на некое
- 3:54изображение обращаемся к пенсии
- 3:56обращаемся к методу
- 3:57и иметь рид и здесь мы просто говорим о
- 3:59том что я обращаюсь к папке и majeste и
- 4:02на данный момент у меня в этой папке нет
- 4:04нужного изображения
- 4:05сами изображение я уже подготовил
- 4:07несколько таких вот изображение ну и
- 4:10давайте мы эти все изображения как раз с
- 4:12вами сюда и добавим просто их помещаем
- 4:14сюда
- 4:15ри фактор в принципе не добавлены а
- 4:17также не мне открылись они мне на данный
- 4:19момент не нужны поэтому давайте вскроем
- 4:21ну и далее я просто говорю о том что я
- 4:23выбираю такое изображение как лайт 1 .
- 4:26и дальше мы будем еще и с другими тоже
- 4:28изображениями работать далее нам
- 4:31необходимо конечно же это изображение
- 4:33привести к серому формату чтобы опять
- 4:35таки у нас была не 3 слоем а всего лишь
- 4:37один слой мы давайте здесь будем
- 4:39использовать с вами некую новую же
- 4:41переменную в эту переменную мы будем с
- 4:43вами устанавливать следующие так конверт
- 4:44color здесь указываем что мы обращаемся
- 4:46к нашему первоначальному изображению и
- 4:49указан формат просто конвертирован в
- 4:51моем случае это бильярд угрей также
- 4:54здесь мы давайте выведем наши
- 4:56изображением вот только в этот раз мы
- 4:58уже будем использовать matplotlib
- 5:00мы конкретно там будем использовать
- 5:01объект ой плод соответственно обращаемся
- 5:03к ним о псевдониму обращаемся к методу
- 5:06и м шоу то есть и матч шоу и здесь же мы
- 5:09можем указать например чтобы вывести
- 5:11серое изображение или мы можем вывести
- 5:13наше первоначальное изображение но если
- 5:16вот мы сейчас будем выводить просто
- 5:17первоначально наше изображение то мы
- 5:19заметим что он будет выглядеть не совсем
- 5:21корректно давайте мы еще чтобы его
- 5:22полностью вывести нам еще нужно здесь
- 5:24был шелк прописать и если сейчас такое
- 5:27запустить то вот что мы с вами заметим
- 5:30сейчас будет будет фотография пока снова
- 5:31то мы замечаем что наше изображение но
- 5:33выглядит ну совершенно иначе дата здесь
- 5:36идут другие сконвертирован ее цвета так
- 5:39происходит по той причине что библиотека
- 5:41matplotlib
- 5:42она отображает изображение в формате art
- 5:45baby в тоже время мы сюда передаем
- 5:47изображение которое идет в формате pdf
- 5:49поэтому чтобы у нас все верно
- 5:51отображалась без конвертации цветов а
- 5:54нам здесь необходимо обратиться к
- 5:55up in seven дальше нам нужно обратиться
- 5:58к методу конверт color здесь мы
- 6:00обращаемся к нужному изображению и
- 6:02просто мы говорим о том что мы из такого
- 6:04формата как which are мы преобразовываем
- 6:07все вы формат art baby вот этот формат
- 6:09ну и дальше опять таки показывал просто
- 6:11изображение если сейчас такое запущу
- 6:14то мы заметим что вот видите у нас
- 6:15изображение абсолютно корректно была
- 6:17обработана да то есть верное изображение
- 6:20с верными цветами но здесь была выведена
- 6:22ну на данный момент возможно давайте мы
- 6:24пока такое закомментируем
- 6:25момент она мне попросту здесь не нужно
- 6:27теперь давайте выполним оптимизацию
- 6:30нашей фотографии мы конечно же выполнили
- 6:33ее приведение к серому форматом но
- 6:35следующее что нам необходимо сделать так
- 6:38это нам нужно наложить фильтр дабы
- 6:40уменьшить количество различных точек мы
- 6:43можем сюда наложить конечно в качестве
- 6:45фильтра просто размытие изображения но
- 6:48мы давайте вместо размытие воспользуемся
- 6:50функцией который позволяет уменьшить шум
- 6:53почему мы
- 6:54почему мы сейчас будем использовать
- 6:56именно эту функцию просто по той причине
- 6:57что нам необходимо все-таки иметь
- 6:59достаточно хорошую четкую картинку если
- 7:02мы размываем изображение то потом понять
- 7:05какие там написаны символы на
- 7:06изображение будет достаточно сложно
- 7:08поэтому мы лучше не будем размывать
- 7:10изображение а уменьшим шум изображение
- 7:13по факту мы уменьшим количество вот этих
- 7:15вот точек и тем самым и оптимизируем
- 7:18картинку и не ухудшение качества здесь
- 7:20мы давайте создадим некую переменную ну
- 7:22допустим это будет переменная фильтром
- 7:24ну и тут мы просто обращаемся к нашей
- 7:26библиотеке up in seven и обращаемся к
- 7:28такому методу которая называется
- 7:30bilateral фильтр сюда нужно передать
- 7:32несколько параметров во первых это наше
- 7:34изображение причем мы должны передать
- 7:36именно серая изображение поэтому передаю
- 7:39перемен играем дальше второй параметр
- 7:42это диаметр то есть это как бы насколько
- 7:44много пикселей будет охвачено который
- 7:46находится друг вот в игрушки и на данный
- 7:48момент давайте укажу здесь число 11 чуть
- 7:51позже по необходимости это число могу
- 7:54увеличить уменьшить но опять и в
- 7:55зависимости от того насколько мне
- 7:57понравился и результат на данный момент
- 7:58оставим как 11 следующий параметр он
- 8:01указывает цветовое пространство
- 8:03если мы здесь укажем больше число то
- 8:05соответственно это будет указывать на то
- 8:07насколько много пикселей с и примерно
- 8:10одинаковым цветом будут смешиваться ну и
- 8:13опять же давайте сейчас мы укажем ну
- 8:14допустим здесь число 15 также мы должны
- 8:17указать
- 8:18и третий параметр это уже координатное
- 8:20пространство работает по схожему
- 8:22принципу то есть насколько много у нас
- 8:24различных пикселей будут смешиваться
- 8:26друг с другом которые будут схожи по
- 8:28координатам и здесь мы также укажем
- 8:30например число 15 ну на данный момент
- 8:33особо можно не внедряться во все эти на
- 8:35самом-то деле параметры просто можете их
- 8:37записать если она
- 8:38если это значение нам по надо ну
- 8:39понравится там будем его использовать
- 8:42если нет тогда мы эти значения просто
- 8:44поменяю следующие после того как мы
- 8:47указали уменьшение шума на изображением
- 8:50нам необходимо найти еще контуры
- 8:52изображения для этого мы давайте
- 8:54создадим некую новую перемены пускай она
- 8:56будет называться как и джесс ну допустим
- 8:58да то есть углы вот эти вот контуры и
- 9:00далее мы обращаемся к нашей библиотеке
- 9:02обращаемся к методу с которым мы
- 9:04работали это метод ткани здесь мы просто
- 9:06указом с вами переменную фильтр и
- 9:08возможно давайте мы наверное укажи мне
- 9:11фильтр а допустим давайте так m&g фильтр
- 9:15вот такие называют у перемены просто
- 9:16потому что фильтр это зарезервированное
- 9:18слово и лучше мы будем называть как-то
- 9:20по-другому наши переменные ну допустим и
- 9:22эмчи фильтр и так вот здесь выкинем и
- 9:25просто указом с вами фильтр да сама это
- 9:28изображение с нужным примененным
- 9:30фильтром и тут же мы можем указать как
- 9:32бы порог начальный
- 9:34и максимальный и на самом-то деле мы
- 9:36можем указать здесь любые значения можем
- 9:38пятки указать здесь 3030 например как
- 9:41этом раньше указывать что порог 1 2 он
- 9:43совпадал но давайте мы лучше укажем с
- 9:45вами какой-то действительный диапазон
- 9:46например здесь будет 30 здесь будет 200
- 9:49но допустим что то в этом духе а также
- 9:51давайте мы опять же протестируем
- 9:53посмотрим что же у нас получилось и
- 9:55здесь я предлагаю уже выводить не наше
- 9:58стандартное изображение а давайте
- 9:59выведем
- 10:00изображением вот этими всеми краями
- 10:02опять-таки запускаем программу посмотрим
- 10:04что получилось и вот как выглядит на
- 10:06данный момент наши изображения и вот мы
- 10:08можем заметить что номер он здесь четко
- 10:10выделяется и по факту по этим контуром
- 10:12нам легко будет отследить какие же цифры
- 10:14какие же символы здесь написано поэтому
- 10:17давайте пока скроем это
- 10:18и двинемся далее следующее что нам
- 10:21необходимо сделать так это после того
- 10:23как мы обнаружили все вот эти вот краям
- 10:25нам необходимо обнаружить еще и контуры
- 10:27потому что именно за счет контуров мы
- 10:29можем уже понять где какие объекты
- 10:31находятся и а главное мы можем считать
- 10:34эти объекты
- 10:35а как за счет именно углов мы еще особо
- 10:37нечего читать не
- 10:38можем ну и давайте мы с вами создадим
- 10:41некую переменную пускай она будет
- 10:42называться как конт
- 10:44ну допустим что то в этом духе далее
- 10:46обращаемся к нашей библиотеке
- 10:48обращаемся к методу fine конкурс здесь
- 10:50нам необходимо сделать следующее мы
- 10:52обратимся к нашему к нашему поэтому вот
- 10:56изображению с углами и я предлагаю это
- 10:58изображение здесь скопировать то есть мы
- 11:01не будем на этом же изображение что-либо
- 11:03делать да а мы будем копировать это
- 11:05изображение и по факту это скопированное
- 11:07изображение будет устанавливаться нас
- 11:09вот сюда нашу новую перемены здесь же
- 11:12нам необходимо указать
- 11:13режим нахождение всех этих контуров и
- 11:15ранее мы использовали с вами такой режим
- 11:18как выезд он позволял нам найти
- 11:19абсолютно все контры но сейчас мы будем
- 11:23использовать такой режим как 3
- 11:24он позволяет нам тоже найти все контуры
- 11:26но не будут в иерархическом порядке
- 11:29проставлены поэтому давайте именно такой
- 11:31режим мы с вами здесь и будем
- 11:33использовать также конечно же нам нужно
- 11:35еще указать метод нахождения всех этих
- 11:37контуров и ранее мы опять же с вами
- 11:40использовали такой метод как chain
- 11:43approx на но также давайте мы лучше
- 11:46будем использовать chain approx simple
- 11:48я рассказывал что этот метод он более
- 11:50оптимизирован опять же он позволяет нам
- 11:53найти просто как бы первоначальную
- 11:54конечную точку они находить все еще
- 11:56дополнительные точки на этом промежутке
- 11:58соответственно это нет более
- 11:59оптимизированным и давайте именно его и
- 12:01будем использовать
- 12:02ну и далее мы давайте с вами сделаем
- 12:05следующее мы создадим ещё некую
- 12:07переменную ну или даже давать не будем
- 12:09создавать возможно новые переменам и
- 12:10давайте в ту же переменную мы будем
- 12:12устанавливать новые означает мы будем с
- 12:15вами сейчас как бы считывать все эти
- 12:17контуры и мы будем считывать за счет
- 12:20дополнительной библиотеки которая
- 12:22называется и мяч ютилась соответственно
- 12:24к ней мы обращаемся обращаемся к методу
- 12:26grub контур и сюда мы передаем с вами
- 12:28просто вот эти вот контуры которые в
- 12:30прошлый раз мы просто получили ибо троне
- 12:33мы например работали с контурами без
- 12:35дополнительной библиотеки сейчас мы
- 12:37работаем просто с этой библиотекой по
- 12:39этой причине что эта библиотека она
- 12:41предоставляет нам вот этот вот
- 12:42удобными
- 12:43что позволяет нам в удобном формате
- 12:45получить все эти контры и плюс мы их
- 12:48сможем идти и контуры отсортировать и
- 12:50найти только те контуры которые нас
- 12:52будут интересовать конкретным не будет
- 12:54интересовать только квадратные такие
- 12:56продолговатые контуры
- 12:57ну которые будут по факту описывать
- 12:59именно номерной знак на и вообще меня
- 13:01принципе интересует только контуры
- 13:02которую описывает какой-либо квадрат вот
- 13:04можно так это назвать и сейчас мы скоро
- 13:07с вами сделаем то что все наши контуры
- 13:09мы отсортируем чтобы их отсортировать мы
- 13:12используем встроенный метод которые
- 13:13существуют в питоне он называется sorted
- 13:16и сюда мы передаем с вами контуры и
- 13:18контуры я напомню это список мы его
- 13:20сортируем с вами
- 13:22также мы с вами сюда передаем еще ключ и
- 13:24указываем просто метод сортировки в
- 13:28качестве метода sandero сортировки мы
- 13:30указываем контур и рио то есть мы как бы
- 13:32говорим о том что мы ищем только
- 13:34квадратные какие-либо контуры также еще
- 13:38интересно указать то что все должно быть
- 13:41в обратном порядке потому что ж не какие
- 13:44объекты не будут удалены правильно
- 13:45поэтому мы просто делаем так что все эти
- 13:48объекты что будут похожий на нужные нам
- 13:51контур они должны находиться вверху и
- 13:53чтобы у нас вот этот был обратный
- 13:55порядок мы здесь указом рифе
- 13:56реверс труда все как бы нужны нам объект
- 14:00они будут находиться вверху и здесь же
- 14:02мы еще можем указать с вами то что мы
- 14:04будем выбирать ну допустим только
- 14:06последние восемь элементов из всего
- 14:08этого списка потому что ну опять же
- 14:10контуров их очень много там находится на
- 14:13самом изображение нам они все
- 14:14неинтересным и давайте найдем только
- 14:16последний 8 например контуров если что
- 14:18это значение чуть позже увеличим ну и
- 14:20именно эти контуры
- 14:22именно с этими контурами мы и будем
- 14:23работать то есть на данный момент мы с
- 14:26вами что сделали мы с вами открыли
- 14:27изображение немного его оптимизировали
- 14:30нашли различные вот здесь нашли
- 14:32различные вот эти вот края
- 14:33дальше мы по краям нашли контры и дальше
- 14:36мы эти контуры просто немного но не то
- 14:39что оптимизировали мы их просто
- 14:40отсортировали и как бы за счет вот этой
- 14:42вот сортировки мы указали что нас
- 14:44интересует
- 14:44это крупные контуры которые похожи на
- 14:47некую поглощать до то есть на некие
- 14:49квадрат и вот и
- 14:51по факту мы из этого всего списка
- 14:53контуров возьмем только последние восемь
- 14:55например
- 14:55элементов если нам это число будет не
- 14:57подходить возьмем чуть чуть попозже
- 14:59больше элементов
- 15:01теперь давайте переберём наши counter in
- 15:03и постараемся найти именно те контуры
- 15:05что отвечают за отображение номерного
- 15:08знака
- 15:08чтобы нам такое сделать мы давайте
- 15:10создадим некую новую переменную допустим
- 15:12она будет называться как ос то есть
- 15:14позишн а чуть позже в эту переменную мы
- 15:17запишем возможную позицию нашего
- 15:19номерного знака
- 15:21далее мы создаем просто с вами цикл
- 15:23здесь я давайте создам
- 15:25некую перемена пускай она просто будет
- 15:27называться у меня как си и дальше говорю
- 15:29что я ее что я буду перебирать такой
- 15:32список как конт да то есть это у меня
- 15:34список что состоит из всех контуров
- 15:36здесь же в этом цикле я создам новую
- 15:39переменную она называется она будет меня
- 15:42называться как approx вообще с
- 15:44английского и proxomitron это
- 15:46приблизительно примерно и соответственно
- 15:48мы сейчас будем стараться примерно найти
- 15:51номерной знак и чтобы нам такое сделать
- 15:54мы просто обращаемся к нашей библиотеке
- 15:56обращаемся к методу который называется и
- 15:58prox пол и т.п.
- 15:59здесь мы должны передать наш контур ну в
- 16:02моем случае это вот эта переменная сен
- 16:04соответственно я ее сюда передаю и
- 16:06следующий параметр который здесь мне
- 16:08необходимо указывать
- 16:10это по сути насколько сильно наши
- 16:14насколько сильно наш контур должен быть
- 16:17в форме именно квадрата что то в этом
- 16:19духе можем так это назвать
- 16:20например если здесь я укажу значение 1
- 16:23это будет означать то что наш наша форма
- 16:27она может быть даже примерно кругом и
- 16:29все равно мы как бы это засчитаем за
- 16:32квадрат если здесь укажу более точному
- 16:35более высокое значение например там 4 5
- 16:37и так далее то соответственно мы будем
- 16:39выбирать только те контуры которые все
- 16:42ближе и ближе будут подходить именно на
- 16:44форму квадрата но опять же я ищу именно
- 16:47номерной знак
- 16:48он меня форме квадрата поэтому здесь я
- 16:51давайте возможно укажу даже значение как
- 16:5310 а возможно мне потребуется и какой то
- 16:55большее значение и здесь же мы должны
- 16:57еще указать третий параметр и со
- 16:59значением true
- 17:00тем самым мы говорим что мы находим
- 17:02только те контуры чья форма является
- 17:04закрытой вот например если мы говорим
- 17:06про обычный
- 17:07обычную линию в таком случае у линии
- 17:10есть начало есть конец но не как эти две
- 17:12вещи они не соединены друг с другом если
- 17:15же мы ищем с вами именно некий квадрат
- 17:17нам важно чтобы
- 17:19начальная точка также конечная точка это
- 17:21была одна и та же самая координатам и
- 17:23соответственно именно такие формы мы и
- 17:25ищем
- 17:25то есть те формы которые имеют что
- 17:28начальную что конечную точку как бы вы 1
- 17:30координате ну и далее мы давайте
- 17:33пропишем здесь небольшую проверку
- 17:34мы с вами просто будем проверять длину
- 17:37полученного вот это полученный вот этой
- 17:39вот координаты полученного этого контура
- 17:41и если у нас длина
- 17:43оно будет состоять из четырёх элементов
- 17:45то в таком случае мы скорее всего найдем
- 17:48с вами именно номерной знак почему
- 17:51четыре элемента да просто по той причине
- 17:52что четыре элемента это по факту
- 17:54координаты всех вот эти вот 4 точек всех
- 17:59четырех углов нашего квадрата да именно
- 18:02такой нам и нужно поэтому мы и отслежен
- 18:05на значение 4 и здесь мы в таком случае
- 18:08давайте будем сами вы переменной повышен
- 18:11устанавливать с вами вот эту вот approx
- 18:12а также мы можем выходить из самого
- 18:15цикла по той причине что нам больше не
- 18:17нужно перебирать все эти контуры то бишь
- 18:19что мы с вами получили мы получили то
- 18:21что мы перебираем полностью все контуры
- 18:23дальше мы с вами как бы
- 18:25пытаемся приблизительно найти те контуры
- 18:28которые ну примерно будут похожи на
- 18:31квадрат опять же если что это значение
- 18:33чуть чуть позже увеличу
- 18:34также здесь же я говорю о том что мы
- 18:36находим только закрытые формы где
- 18:39. начала и . конца совпадает плюс мы с
- 18:42вами отслеживаем только те объекты
- 18:44только те элементы что содержит четыре в
- 18:47себе значение это как бы координаты
- 18:50каждого из углов нашего квадрата если мы
- 18:53такое находим там и
- 18:54предположительно думаем что это наша раз
- 18:57номерной знак моего записываем в нашу
- 18:59переменную позишн и в общем то дальше мы
- 19:01с этой переменной мы уже можем с вами
- 19:03работать теперь давайте немного
- 19:04протестируем программу для этого я
- 19:06просто позицию буду выводить в терминал
- 19:09и посмотрим что у нас получилось и на
- 19:12данный момент вы можете заметить что на
- 19:13сводится здесь значение на на это
- 19:15означает то что не было найдено
- 19:18не так у которых была длина 40 поскольку
- 19:21не было на один таких элементов то и вот
- 19:24эта переменная она осталась со значением
- 19:25на поэтому мы наверняка давайте с вами
- 19:28сейчас укажем то что мы будем выбирать
- 19:30полностью все возможные контуры и
- 19:33посмотрим вообще в таком случае
- 19:35находится ли у нас хоть что-либо
- 19:36еда в таком случае действительно стыда
- 19:38что-то находится если мы берем полностью
- 19:40все контуры а не только некоторые из них
- 19:42то в таком случае 10 на мы находим
- 19:45нужные координаты ну и давайте на данный
- 19:49момент я не буду здесь указывать
- 19:50какую-то ну какой то диапазон выборки
- 19:53давайте я укажу так что мы выбираем
- 19:54полностью все координаты
- 19:56вот чуть позже если что и я это изменю
- 19:59но пока будем выбирать полностью всех
- 20:01координаты теперь из общего фото нам
- 20:04необходимо выделить
- 20:05исключительно номерной знак и для этого
- 20:08мы будем использовать по битовые
- 20:09операции также маски который мы
- 20:11проходили в прошлых уроках
- 20:13итак создадим некую новую переменную
- 20:15пускай она будет называться как mask
- 20:17здесь мы обращаемся к библиотеке нам
- 20:20обращаемся к методу zeroes и тут нам
- 20:23необходимо указать то что наше новое
- 20:26полотно
- 20:26она будет именно с такими же размерами
- 20:28что и например наше серое
- 20:31изображение здесь здесь же можно было бы
- 20:33указать и обычное изображение
- 20:35но давайте будем уже сразу работать с и
- 20:37каким-либо более оптимизированным
- 20:38изображением также здесь нужно указать
- 20:41де type и на самом-то деле можно де type
- 20:44конечно же указывать как это мы всегда
- 20:46делали а еще можно указать здесь
- 20:48следующем может просто обратиться к
- 20:50н.п. нам ой и здесь мы можем просто
- 20:52указать и ю ин 8 соответственно что то
- 20:56вот в этом духе только не правильно
- 20:57начал писать это будет почти то же самое
- 20:59что и указание деталь так что можете в
- 21:02дальнейшем смотреть либо так указывать
- 21:03либо через один type следующее что нужно
- 21:06сделать так это нужно создать новое
- 21:08некое изображением его называем как new
- 21:10engine здесь мы обращаемся к up in seven
- 21:13далее мы давайте обратимся к методу друг
- 21:17counters за счет этого метода мы с вами
- 21:19рисовали контуры и сейчас он нам тоже
- 21:21понадобится и здесь я говорю что на вот
- 21:23этом новом полотне как раз и буду
- 21:25рисовать контуры причем мне
- 21:28нужно указать как бы сами вот эти вот
- 21:30контур мне нужно указать их локацию где
- 21:33я нарисую их и соответственно качестве
- 21:36локации я просто использую нашу вот эту
- 21:39вот позицию до
- 21:40наш вот этот вот список причем его важно
- 21:42передавать тоже именно в формате списка
- 21:45поэтому так я здесь и делаю далее здесь
- 21:47мы можем с вами указать принципе в
- 21:49качестве следующего параметра это просто
- 21:51ну в контур аиде мы можем сказать как 0
- 21:55цвет мы давайте укажем как 255 тыс это
- 21:58будет полностью белый также по желанию
- 22:00можете указывать здесь и кортеж
- 22:03состоящий из трех цветов
- 22:04обводку мы указываем -1 до бы вся
- 22:07поверхность была заполнена ну и теперь
- 22:10мы давайте выполним побитую операцию мы
- 22:13назовем некую новую переменную как вид
- 22:15вайс и м.д.
- 22:17и сюда мы устанавливаем следующее мы
- 22:19обращаемся к нашей библиотеке обращаемся
- 22:21к
- 22:21with white and здесь мы просто говорим
- 22:24что к нашему первому изображение мы как
- 22:26бы добавляем еще раз наше первое
- 22:28изображение
- 22:29такая здесь вот логика и также мы
- 22:31указываем здесь маску но в качестве
- 22:33маски мы уже используем вот эту вот нашу
- 22:36переменную маска теперь давайте
- 22:38попробуем вывести все это на экран для
- 22:40этого мы опять таки будем использовать
- 22:42matplotlib вот только в этот раз мы
- 22:44будем выводить уже такую перемену как
- 22:46битвой и m&g если мы это сейчас все с
- 22:49вами запустим то на самом-то деле мы
- 22:51замечаем что ну не все уж корректно
- 22:53как-то обработалось да если не сказать
- 22:55что вообще некорректная обработалось так
- 22:57происходит по той причине что на самом
- 22:59то деле я подобрал не лучшую фотографию
- 23:01здесь уж слишком есть много различных
- 23:04квадратов чего уж говорить даже вот про
- 23:06вот эти вот различные квадратики поэтому
- 23:08мы давайте сейчас с вами будем
- 23:10использовать ну допустим вот такое
- 23:11изображение то есть не будем
- 23:13использовать предыдущий да будем
- 23:14использовать например вот такой вот
- 23:16изображением и здесь отчетливо видно
- 23:18номерной знак и мы этот номерной знак
- 23:20как раз вами и
- 23:22считаем скачать такую же картинку вы
- 23:24сможете с сайта а эти прагер ссылку на
- 23:27урок оставляю в описании к этому видео
- 23:29так вот я давайте здесь просто поменяю я
- 23:31буду использовать именно plate 3 именно
- 23:33вот эту вот мою третью картинку как бы и
- 23:35если сейчас это все запущу
- 23:37то в таком случае в таком
- 23:40удивите номерной знак он корректно здесь
- 23:43выделяется вот мы его действительно
- 23:45выбрали из всего изображения дальше нам
- 23:48только останется его еще как бы
- 23:49прочитать ну то есть
- 23:51узнать что написано на этом номерном
- 23:53знаке и по факту потом еще обвести и
- 23:55показать это все пользователю это уже
- 23:57так сказать дело за малым и пару слов
- 24:00относительно того почему так тут все
- 24:01коряво у нас получилось дело в том что
- 24:03на данный момент мы не используем с вами
- 24:06никакую уже обученную модель а также мы
- 24:08с вами не обучаем самостоятельно
- 24:10нейронную сеть
- 24:11все что мы с вами делаем так это мы
- 24:13берем некое изображение и пытаемся
- 24:16приблизительно найти на этом изображении
- 24:18номерной знак то есть мы пытаемся найти
- 24:20как бы те контуры которые подходят под
- 24:23номерной знак
- 24:24конечно же такой подход он не идеален
- 24:26поэтому он иногда выдает вот такие вот
- 24:28результаты порой он выдает правильные
- 24:30результаты а порой конечно же
- 24:31неправильные результаты
- 24:33ну и в каких-то крупных уже проектах
- 24:36лучше не использовать именно подобный
- 24:37подход а лучше использовать либо уже
- 24:40готовую натренирован ую модель точно то
- 24:43же самое мы делали в прошлом уроке либо
- 24:45можно тренировать свою собственную
- 24:47модель если вы не нашли уже готовую
- 24:49модель
- 24:50вот мы же с вами сейчас рассматриваем
- 24:52просто дополнительный подход каким
- 24:54именно образом можно работать с этими
- 24:56всеми изображениями и также можно с них
- 24:58вытягивать нужную нам информацию вот
- 25:00например мы для номерных знаков пытаемся
- 25:02найти квадраты и пытаемся дальше уже
- 25:05распознать с них информацию и так мы
- 25:08давайте кое-что здесь по скрываем чтобы
- 25:10нас как-то меньше было текста и
- 25:12следующее что я предлагаю сделать так
- 25:14это из всего изображения вырезать только
- 25:17номерной знак потому что все остальное
- 25:18нам по факту не особо нужно поэтому
- 25:20здесь мы создаем две перемены пускай не
- 25:23будет x и y дальше мы обращаемся к нам
- 25:26пай и обращаемся к такому методу которая
- 25:28называется как в
- 25:29за счет этого метода мы можем с вами из
- 25:32определенной матрицы
- 25:34ну или другими словами из нашего
- 25:36изображения мы можем вытянуть только те
- 25:39ну когда только те
- 25:41пиксели которые будут подходить под
- 25:43определенное значение в нашем случае я
- 25:46здесь указываем маску и
- 25:48в качестве значения для этой маски
- 25:50указывает 255 то есть те цвета которые
- 25:53будут
- 25:53приближены к белому они как раз у нас и
- 25:56будут
- 25:57вытянутый и далее мы с вами просто
- 25:59должны найти как бы координаты первой
- 26:03нашей точки верхней левой а также
- 26:05координаты нижней правой точке и для
- 26:07этого я создаю ещё здесь две перемены
- 26:09это икс один и игрек один сюда мы
- 26:12поместим с вами следующее это мы давайте
- 26:14укажем здесь
- 26:15обращение к нам ой обращение к функции
- 26:18мин она позволяет нам найти минимальный
- 26:20элемент и мы находим минимальный элемент
- 26:22ну в наших координатах x а также
- 26:25дополнительно мы обращаемся к нам пай
- 26:28еще раз к той же самой функции и находим
- 26:31же только минимальный элемент для
- 26:33координаты y точно то же самое мы делаем
- 26:37и для нижних координат сейчас вот за
- 26:40счет
- 26:40x1 y1 мы как бы нашли верхнюю координату
- 26:42это верхняя левая координата
- 26:44нашего номера а также находим сейчас
- 26:46правую нижнюю координату нашего номера и
- 26:49здесь соответственно мы используем про
- 26:50другие функции там макс
- 26:52x и макс y вот и вот вещи мы тут
- 26:55прописываем далее нам нужно обрезать
- 26:57изображение для этого я давайте создан
- 26:59здесь новую переменную пускай она будет
- 27:01называться как роб и здесь мы
- 27:03прописываем следующее мы обращаемся к
- 27:05нашему серому изображение и здесь
- 27:07используем индексы из срезы
- 27:08то бишь здесь указывает что
- 27:10первоначальная . это у нас
- 27:12x1 далее мы все это срезаем до x2 и
- 27:16дальше здесь я указываю
- 27:17y1 и вплоть до и y2 вот такая здесь
- 27:20будет идти лойко ну и давайте мы это все
- 27:22выведем на экран посмотрим получилось ли
- 27:24у нас обрезать корректно изображение и
- 27:27соответственно запускаем программку и
- 27:30так видимо я где-то допустил ошибки ну
- 27:33давайте наверное мы сделаем так ну вот
- 27:34здесь повсюду добавляем вот эти вот
- 27:37круглые скобки я так делаю по той
- 27:39причине что я хочу все-таки кортеж
- 27:41создать да и возможно он просто жалуются
- 27:44на то что вот у меня нету здесь этих
- 27:46круглых скобок и поэтому не хочет все
- 27:48запускать давайте мы еще раз теперь
- 27:49попробуем запустить программу и ошибка у
- 27:52меня была в том что здесь мы не
- 27:53присваиваем значение а здесь мы как
- 27:56будто указываем проверку на то бишь мы
- 27:58находим только те элементы которые
- 28:00приближены к белому цвету вот
- 28:03соответственно здесь нужно прописать два
- 28:05знака равенства они
- 28:06один как это было у меня до этого ну и
- 28:09теперь давайте возможно еще раз мы
- 28:10попробуем это все запустить в таком
- 28:13случае все обработалось корректной и вот
- 28:15мы действительно нашли наш номерной знак
- 28:17он у нас открыт на весь экран просто
- 28:19замечательно теперь давайте это пожалуй
- 28:22вскроем и теперь нам нужно прочитать
- 28:24информацию с этого номерного знака для
- 28:26чтения информации с номерного знака мы
- 28:28будем использовать нашу библиотеку
- 28:29которая называется ezio оси она
- 28:32соответственно позволяет нам считывать
- 28:33информацию с и каких-либо изображений и
- 28:36чтобы нам сейчас не читать информацию мы
- 28:38давайте создадим некую новую переменную
- 28:40на свои и как текст дальше мы обращаемся
- 28:42к izeo.ru
- 28:44далее мы обращаемся к такому методу
- 28:46который называется как лидер и здесь мы
- 28:49просто должны передать с вами язык
- 28:51который мы отслеживаем давайте мы будем
- 28:53отслеживать
- 28:53английский язык так как он наиболее
- 28:56точно отслеживается там у меня все равно
- 28:58по сути используются латинские вот эти
- 29:00вот символы вот поэтому мне принципе
- 29:03подойдет здесь отслеживания именно
- 29:04английского языка но вообще можете
- 29:05указывать и другие языки например р.ю.
- 29:07это будет русский и так далее я именно
- 29:09пускай пока английский будет отслеживать
- 29:12далее мы давайте еще раз в эту же
- 29:14переменную будем что либо устанавливать
- 29:16здесь мы обращаемся с вами просто к и
- 29:18той же переменной да ну вот этой и здесь
- 29:22мы просто обращаемся к методу рид текст
- 29:24он позволяет нам рассчитать
- 29:26изображение и в качестве изображения мы
- 29:28сюда передаем изображение crop только
- 29:30давайте я один символ лишнее здесь
- 29:32повсюду поудаляю вот таким вот образом
- 29:34вот то бишь что мы говорим мы говорим то
- 29:37что мы будем считывать именно английские
- 29:39символы и будем считывать их из такого
- 29:41изображения которая называется у меня
- 29:42как краб и пересмотрите я уже запустил
- 29:45проект сделал я это неспроста дело в том
- 29:47что вот эта вот модель то есть модель
- 29:50распознавания английских символов она
- 29:52должна загрузиться это процесс не самый
- 29:54быстрый поэтому я запустил проект
- 29:56дождался пока у меня произошла загрузка
- 29:58но также мне это просто фото здесь
- 30:00отобразилось она мне на самом деле не
- 30:02нужно и если вдруг у вас сейчас при
- 30:04запуске проекта выдается ошибка
- 30:06особенно эта ошибка может быть если вы
- 30:08на компьютере mac то в таком случае вам
- 30:11необходимо зайти в папку программы здесь
- 30:13найти
- 30:15питон ваш установленной зайти в эту
- 30:17папку и здесь вам просто нужно два раза
- 30:19нажать на такой файл как in стол
- 30:21certificates . команд 2 раз нажимаете на
- 30:24этот файл соответственно сертификаты
- 30:25будут установлены и дальше у вас весь
- 30:27этот код будет обрабатываться корректно
- 30:29мы ж давайте вот здесь еще будем
- 30:31выводить просто полученные тексты
- 30:33давайте я еще раз запущу программу и
- 30:35посмотрим что же у нас по итогу
- 30:37получилось опять видите не самый быстрый
- 30:40процесс то есть происходит небольшое
- 30:42скачивание но после того как у нас
- 30:44произошло скачивание мы с вами можем
- 30:47заметить что вывелись некие результаты и
- 30:49один из результатов это по сути тот
- 30:52текст который был с читом смотрите здесь
- 30:54были считанные 0 258
- 30:57а в принципе все в работалось корректно
- 31:00ну понять что это ноль или это буква чко
- 31:02от достаточно сложно поэтому он допустим
- 31:05это считал именно как за 0 но это уже
- 31:08такая погрешность которую можно ему
- 31:09спокойно простить теперь мы давайте с
- 31:12вами сделаем вот что мы давайте будем
- 31:15вот этот вот полученный текст не просто
- 31:17отображать в консоли а будем выводить
- 31:19от номерным знаком на нашем основном
- 31:21фото чтобы такое сделать мы давайте
- 31:24создадим новую переменную и в нее я хочу
- 31:26поместить только текстовую надпись
- 31:28давайте вот я еще раз откроем консоль и
- 31:31что у нас получается вот у нас есть
- 31:33первый наш кортеж этот кортеж состоит из
- 31:36множества элементов но для начала нам
- 31:39нужно просто вытянуть как бы сам по себе
- 31:40весь этот кортеж поэтому мы открываем
- 31:42квадратные скобки указом что я вытягиваю
- 31:44ну любой элемент по индексу это будет
- 31:46наш вот этот кортеж далее мне необходимо
- 31:49вытащить и вот этот вот текст и чтобы
- 31:52его вытащить мне нужно просто обратиться
- 31:53к как бы предпоследнему элементу для
- 31:56этого я могу использовать отрицательные
- 31:58индексы например -2 таким образом вот
- 32:00этот элемент будет пропущен а именно
- 32:02этот
- 32:02он будет вытянут это нужно для меня
- 32:05текст
- 32:05именно этот текст я пик помещу в
- 32:07отдельную перемены далее мы давайте с
- 32:10вами создадим некую подпись ну нику
- 32:13вернее перемену который будет называться
- 32:14как подпись и это перемены она будет
- 32:17содержать такой метод как путь текст
- 32:19здесь мы указываем с вами во первых
- 32:22изображений на котором будем все
- 32:23рисовать в качестве изображения я
- 32:25использую наше основное первое
- 32:27изображение
- 32:28что еще было в самом начале далее сюда
- 32:31же мне необходимо передать текстовую
- 32:32надпись моем случае это раз вот это вот
- 32:35текстовая надпись далее нам необходимо
- 32:37указать координаты и в качестве
- 32:40координат я бы хотел указать
- 32:42левый нижний угол номерного знака и
- 32:44чтобы мне такой указать и указу здесь x1
- 32:47y2 x 1 это верхняя наша левая .
- 32:51а y2 это просто нижняя точка самого
- 32:55номерного знака но и по факту если их
- 32:57объединить ну если указать икс один и
- 32:59игрек 2 то соответственно это будет
- 33:01левая нижняя .
- 33:03а также я бы хотел чтобы надпись она
- 33:05была чуть ниже нежели номер поэтому
- 33:07давайте мы еще к y2 добавим ну допустим
- 33:1060 пикселей если что потом это поменяй а
- 33:12далее нам необходимо здесь указать шрифт
- 33:15в качестве шрифтом и давайте с вами
- 33:17будем использовать
- 33:18ну какой то обычный plain текст ну то
- 33:21есть это самый стандартный такой текст
- 33:22будет
- 33:23или глаз давайте мы его пожалуй и
- 33:26оставим также дополнительно здесь я бы
- 33:29хотел указать цвет в качестве ну вернее
- 33:32не цвет здесь нужно фон скилл указать
- 33:34вернее фон скиллами указом 1 то есть и
- 33:37никаких дополнительных увеличение мы не
- 33:38делаем дальше нам нужно указать цвет
- 33:40давайте у нас текст текст он будет
- 33:43выделяться например красным цветом
- 33:45поэтому здесь мы укажем 255 как третье
- 33:47значение здесь же еще стоит указать
- 33:50жирность мы укажем как один например
- 33:53если что это мы потом отправили ну пока
- 33:55дополнительные не буду дописывать также
- 33:57мы давайте с вами наверное сделаем вот
- 34:01что давайте я вообще вот это вот перемен
- 34:04на переменную как файл и матч допустим и
- 34:06так оно будет у меня называется
- 34:07и в ту же переменную вернее на и то же
- 34:10изображение я допишу еще и
- 34:12нарисую еще на этом всем еще квадратик
- 34:14здесь мы указом что мы обращаемся опять
- 34:17же к нашему основному
- 34:18изображению тут нам нужно обрисовать
- 34:21весь этот квадратик он рисуется
- 34:23во-первых первыми координатами 1 наши
- 34:25координаты это икс один и игрек 2 а
- 34:28также вторые координаты это x2 y2 дома
- 34:32задевать все координаты мы здесь их
- 34:35прорисовывая следующее что нам нужно
- 34:38было бы здесь сделать так это установить
- 34:40еще а цвет цвет мы наверное давайте
- 34:42узнаем уже как зеленый и плюс еще
- 34:45жирность обводки установим здесь как
- 34:47один вот в общем то и все теперь нам
- 34:51остается лишь вывести это все на экран
- 34:54выводим мы именно наше изображение файл
- 34:57и матч ну и наконец давайте мы запустим
- 34:59это все и посмотрим что же у нас по
- 35:02итогу получилось и получилась у нас не
- 35:06совсем то что нам нужно было видимо я
- 35:08что-то тут неправильно напутал
- 35:10относительно координат но зато мы видим
- 35:13что хотя бы текст правильно здесь
- 35:14водится также вот эта вот штучка
- 35:16выводится корректно давайте мы наверное
- 35:18кое-какие теперь моменты поменяем
- 35:20во-первых размер текста я бы увеличил
- 35:23как минимум в три раза да потому что уж
- 35:25слишком маленький и его не видно так
- 35:27жирность ему тоже бы добавил жирности
- 35:29для обводки тоже я пожалуй укажу чуть
- 35:32побольше далее я здесь что-то
- 35:35неправильно пан описывал и давайте мы
- 35:38возможно а до я неправильно пан описывал
- 35:41по причине того что здесь нужно x1 x2
- 35:43а здесь y1 и y2 давайте вот мы такое
- 35:47попробуем с вами еще раз запустить
- 35:48посмотрим что в этот раз у нас
- 35:50получилось
- 35:51дождемся момента запуска и да в таком
- 35:53случае видите у нас примерно все
- 35:55корректно обработалось вы видите просто
- 35:57номер он здесь не идеально как бы ровно
- 35:59по стандал немного с таким вращением
- 36:02поэтому обводка не супер идеально
- 36:04получилось но то же время в целом
- 36:06выглядит все это очень даже неплохо в
- 36:08общем не еще немного пришлось поиграться
- 36:10с вот этими вот настройками ну я в общем
- 36:12указал что от x1 я отнимаю 200 ну а от
- 36:16y2 я к нему добавляющего 160 таком
- 36:19случае текст отображается вполне себе
- 36:21неплохо мы все это выглядит достаточно
- 36:23здорово опять же данная программа она не
- 36:26является идеальной потому что здесь мы
- 36:29не создали какую-либо нейронную сеть
- 36:31которая именно обучается самостоятельно
- 36:34также мы не использовали уже готовую
- 36:36обученную нейронную сеть
- 36:37здесь мы лишь используем как бы activate
- 36:40приблизительные
- 36:41данные и стараемся найти верные номерные
- 36:44знаки например для этого для этого фото
- 36:46нам это удалось сделать ну что ж надеюсь
- 36:49урок вам понравился если так то не
- 36:52забывайте подписываться на канал и
- 36:54вступать в наши соцсети на этом же у
- 36:56меня все до скорых встреч пока
About this transcript
This page contains the full transcript of Изучение Python OpenCV / Урок #8 – Распознавание номерных знаков и чтение их by Гоша Дударь, generated from the public captions YouTube serves with the video. The transcript has 6,132 words across 1,019 segments, with the original timestamps preserved so you can click any line to jump to that moment in the embedded player.
What you can do with it
Use the transcript to take notes, quote the speaker, build a study guide, generate a summary with ChatGPT or Claude via the YouTube Summary tool, or export it as a timed subtitle file with YouTube to SRT. You can also re-open it in the transcriber to translate the transcript into 100+ languages.
Free YouTube transcript tool
YouTube2Text is a free YouTube transcript generator — no signup, no daily limit. Paste any YouTube link and get the full transcript instantly, with timestamps, click-to-jump, translation to 100+ languages, AI prompts for ChatGPT, Claude, and Gemini, and exports to TXT, SRT, VTT, or Markdown.