Изучение Python OpenCV / Урок #4 – Функции трансформации изображений — Transcript
Full transcript
- 0:00привет ходе этого урока мы с вами изучим
- 0:02различные функции что служит для
- 0:04трансформации изображений но перед
- 0:06началом я рекомендую вам сайт айти
- 0:08prodir . кому на этом сайте вы найдете
- 0:10код домашнее задание и много другой
- 0:12полезной информации ссылка на этот урок
- 0:14на сайте будет в описании к этому видео
- 0:16переходите не пожалеете во втором уроке
- 0:18мы с вами уже изучили некоторые функции
- 0:21по работе с изображениями тогда мы
- 0:23научились приводить изображение в другой
- 0:25формат также добавлять эффект размытия и
- 0:27находить просто различные углы в том же
- 0:30уроке я забыл рассказать о том что
- 0:31подобную технологию а подобные функции
- 0:34вы спокойно можете применять при работе
- 0:36с видео вы давайте мы возьмем код из 2
- 0:39видео урока из там когда мы использовали
- 0:41с вами эффекта размытия мы приводили в
- 0:43другой формат и так далее и давайте мы
- 0:45возьмем полностью весь этот код и
- 0:47применим этот код не к изображениям
- 0:49которое у нас здесь есть а к видео и
- 0:51чтобы мы просто не переписывали код
- 0:54повторно
- 0:54я предлагаю его немного скопировать с
- 0:57сайта айки прагер соответственно здесь
- 0:58есть просто весь готовый код но я
- 1:00давайте его немного отсюда скопируем и
- 1:03тут я просто укажу то что мы с вами
- 1:05будем получать
- 1:07открывать некая некий видеоролик он не
- 1:10находится в папке videos и называется он
- 1:13как рот .
- 1:14mp4 а далее давайте мы скопируем здесь
- 1:17циклом ну и соответственно за счет этого
- 1:20цикла мы будем проигрывать
- 1:21необходимую для нас картинку дан пусть
- 1:24каждую картинку из видео мы и будем
- 1:25проигрывать и что мы можем сделать мы
- 1:28можем сделать то что перед тем как мы с
- 1:30вами просто проиграем определенную
- 1:31картинку то есть перед тем как мы
- 1:33покажем определенную картинку
- 1:35пользователю мы можем с этой картинкой
- 1:37произвести любые манипуляции и вот
- 1:39например мы каждую картинку будем ну
- 1:41допустим уменьшать в размерах но на
- 1:44самом-то деле то можно даже не делать
- 1:45это в данный момент это будет лишним да
- 1:48но допустим мы к каждой картинке будем
- 1:50добавлять эффекты размытия далее мы
- 1:52будем преобразовывать вы другой формат в
- 1:55серый формат далее мы будем с вами
- 1:57получать углы этой картинке ну и
- 1:59соответственно дальше эти углы на ней
- 2:00немного будет будем уменьшать потом
- 2:02увеличиваете тем самым по сути будем
- 2:04каждую картинку в самом видео будем ее
- 2:06оптимизировать и только после того как
- 2:08мы полностью оптимизировали но и будем
- 2:10отображать пользователю
- 2:12если подобное сейчас запустить мы
- 2:14заметим что вот у нас все обработалось
- 2:16корректным у нас просто отображаются
- 2:17некоторые углы
- 2:18ну конечно же это все выглядит сейчас не
- 2:21особо здорово поэтому давайте наверное
- 2:23укажем здесь лучше точность то есть у
- 2:26меня было до этого там 200 на 200
- 2:27ну и соответственно 200 на 200 для
- 2:30прошлой картинки это было хорошее
- 2:32значение ну например для видео мы можем
- 2:33заметить что ну уж слишком мало каких-то
- 2:36углов была нарисована и вообще не
- 2:38понятно что происходит на видео поэтому
- 2:39мы давайте уменьшим допустим до сотен до
- 2:42сотни уменьшим еще раз запустим видео и
- 2:45в таком случае мы можем заметить что
- 2:46теперь я понимаю что здесь происходит
- 2:48меня тут прорисовываются дорога до мне
- 2:51прорисовывается некая машинка тесте
- 2:53форма здесь ее очертания немного мне
- 2:55понятно ну и конечно же если мне этого
- 2:57опять же будет не хватать это значение
- 3:00можно еще уменьшить в таком случае мы
- 3:01еще получим более четкое изображение на
- 3:04даже давайте наверно такой мы
- 3:05протестируем каждым здесь по 30 и если
- 3:07это запустить то вот у нас полностью
- 3:09детализированное видео причем удобство
- 3:12такого видео заключается в скорости
- 3:13обработки самого этого видео нам теперь
- 3:16очень легко будет найти нужные для нас
- 3:18объекты те же самые там линии квадраты
- 3:20кружки и все в таком духе нам это будет
- 3:22легко найти по причине того что в этом
- 3:24видео всего лишь есть два цвета черный и
- 3:26белый соответственно это нули и единицы
- 3:28ну и конечно же такое видео такую каждую
- 3:31картинку обработать очень легко по
- 3:33причине того что у нас нету теперь
- 3:34огромнейшего массива из различных чисел
- 3:36a и всего лишь два числа и вот в ходе
- 3:38этого урока мы с вами изучим еще кое
- 3:41какие функции для трансформации
- 3:43изображением и на самом-то деле в эти
- 3:45функции спокойно потом сможете применять
- 3:47и к видео так как видео оно состоит из
- 3:49различных картинок а соответственно с
- 3:51каждой из картинок можно будет работать
- 3:53как с одной отдельной картинкой на
- 3:55данный момент я предлагаю это все
- 3:57удалить просто по той причине что
- 3:58все-таки мы будем работать сейчас именно
- 4:00с изображениями с ними проще работать но
- 4:02принципы работы изображений и видео он
- 4:05один и тот же самый поэтому давайте мы
- 4:07на данный момент с вами сделаем
- 4:08следующее мы создадим некую переменным и
- 4:11здесь мы обратимся к оси битум и мы
- 4:14давайте с вами обратимся к методу image
- 4:16alt и просто прочитаем какое-либо
- 4:18изображение то есть мы давайте укажем
- 4:20что мы обращаемся к папке
- 4:21им ндс и из нее мы выбираем
- 4:23какую картинку которая в моем случае
- 4:26называется как up and save
- 4:27соответственно мы ее здесь открывая
- 4:29далее я перед тем как показать саму по
- 4:31себе эту картинку хотел бы ее просто
- 4:34отразить либо по вертикали либо по
- 4:36горизонтали чтобы мне отразить саму по
- 4:39себе картинку мы давайте сделаем
- 4:41следующее то есть я сохраняю в эту же
- 4:42перемену некое новое значение
- 4:44я просто обращаясь к нашей библиотеке
- 4:46обращаюсь к такому методу который
- 4:48называется как флип сюда я указываю
- 4:50картинку и плюс мне необходимо указать
- 4:52код трансформации
- 4:53если здесь указать число ноль то в таком
- 4:55случае наша картинка она будет
- 4:57отзеркаленная по вертикали если число 1
- 5:00то от зеркально по горизонтали и если -1
- 5:03то она будет отзеркаленной как по
- 5:04вертикали
- 5:05так и по горизонтали ну давайте возможно
- 5:07мы укажем здесь число 1 чтобы она по
- 5:09горизонтали просто было отзеркаленной
- 5:11далее конечно же нужно еще отобразить
- 5:13само по себе картинку здесь мы укажем
- 5:15некую подпись а также выведем сам по
- 5:17себе картинку
- 5:18ну и плюс не забываем о том что нужно
- 5:20вызывать метод вы идти после чего
- 5:22спокойно можем это все запустить и вот
- 5:24мы замечаем что наша картинка она просто
- 5:26отзеркаленная поверх январе по
- 5:28горизонтали все обработалось корректно
- 5:31также если допустим здесь укажу -1 то в
- 5:33таком случае оно будет
- 5:34и по вертикали и по горизонтали от
- 5:36зеркально вот это мы можем с вами заметь
- 5:38а то есть двойку нас как бы находится
- 5:39здесь плюс еще она находится внизу да то
- 5:42есть у нас получилось нужно от слегка
- 5:44ливане и картинки
- 5:45это если говорить именно про
- 5:47отзеркаливание надписи на происходит за
- 5:49счет метода флип мы давайте пока этот
- 5:52метод наверное с вами закомментируем
- 5:53чтобы он нам просто не мешал в будущем
- 5:55ну и теперь мы давайте с вами попробуем
- 5:58обращать картинку мы можем прописать все
- 6:01пункт сыну весь код гвинеи для вращения
- 6:03картинки вот здесь прямиком здесь но
- 6:06давайте мы лучше создадим некую
- 6:07отдельную функцию и просто эту функцию
- 6:10будет с вами вызывать это не является
- 6:12обязательным
- 6:13но так будет удобнее если мы создадим
- 6:15отдельную функцию и потом будем ее
- 6:16вызывать выдавать таки сделать здесь мы
- 6:19укажем что эта функция будет принимать
- 6:20несколько параметров во первых это само
- 6:22по себе картинкам а во вторых это просто
- 6:24угол вращения все больше эта функция у
- 6:28нас ничего дополнительно принимать не
- 6:29будет здесь же вы функции мы давайте
- 6:32будем создавать с вами две переменные и
- 6:34the height
- 6:35же вид и соответственно в эти переменные
- 6:38мы с вами установим следующие мы
- 6:39обратимся к их картинки и обратимся к
- 6:42шейке да то есть получается как размером
- 6:45с мой этой картинке плюс нам необходимо
- 6:48вытянуть ним три значения потому что там
- 6:50идет кортеж из трех значений это высота
- 6:52ширина а также дополнительно количество
- 6:54слоев нам нужно не три значения нам
- 6:56нужно только два значения поэтому здесь
- 6:58мы указываем срез и
- 6:59ну я указываю двоеточие и как бы два то
- 7:02есть говорю о том что то вплоть до
- 7:03второго элемента мы получим все значения
- 7:06нашем случае мы по факту как раз и
- 7:08получим значение это будет высота и
- 7:10ширина чуть позже мы с этими значений и
- 7:12как раз будем работать здесь мы давайте
- 7:15еще создадим некую переменам пускай она
- 7:17будет называться как point и это как бы
- 7:20.
- 7:21вращение нашей картинки . вращение может
- 7:24быть где угодно она может находиться
- 7:26например в нулевых координатах может
- 7:28находиться где-то в крайних координатах
- 7:29мы давайте сейчас укажем что точка
- 7:31вращения это по сути у нас будет
- 7:34середина самого изображения мы уже
- 7:37размеры изображения получили поэтому
- 7:39будем работать с этими переменами ну и
- 7:41здесь соответственно просто обращаемся к
- 7:43вид обращаемся к ширине и разделяемые
- 7:46пополам а также обращаемся к высоте это
- 7:48же разделяем ее пополам тем самым мы
- 7:50получим как бы как бы точку по середины
- 7:53посередине самого изображения именно в
- 7:56зависимости от его где-то . у нас и
- 7:57будет происходить вращение например
- 7:59сейчас
- 7:59относительно центра изображений у нас
- 8:02будет происходить вращение ну и далее мы
- 8:04давайте с вами создадим матрицу
- 8:07неделю наверно просто назову как мэтт и
- 8:09нам по сути необходимо всегда с вами
- 8:11создавать матрицу
- 8:13за счет которые мы как раз и будем
- 8:15выполнять само по себе вращение сама эта
- 8:18матрица создается через специальную
- 8:20функцию что доступно в библиотеке ну и
- 8:23чтобы нам а просто получить эту матрицу
- 8:24мы должны с вами обратиться к и такой
- 8:26функции которая называется get rotation
- 8:28metrics 2d здесь мы указываем с вами во
- 8:31первых точку вращения во вторых мы
- 8:33указываем угол угол напомним мы его
- 8:35берем с параметров самой функции и
- 8:38дополнительном необходимо указать
- 8:40насколько наше изображение увеличится
- 8:42превращением она мне никак не должна
- 8:44увеличиваться поэтому здесь я установлю
- 8:46единицу
- 8:46если хотите
- 8:47чтобы при вращении ваше изображение
- 8:49увеличилась например в два раза
- 8:50соответственно двойку можете прописать
- 8:52если в полтора можно тоже самое здесь
- 8:54прописать просто полтора я не хочу чтобы
- 8:56она увеличилась поэтому оставляем просто
- 8:58единицу ну и далее нам необходимо
- 9:01возвращать само по себе уже изображение
- 9:03для этому напитки обращаемся к нашей
- 9:05библиотеке далее мы обращаемся к такому
- 9:08методу который называется ифен или как
- 9:12она называется и что мы передаем
- 9:13несколько параметров во первых это
- 9:15изображение с которой мы в принципе
- 9:16изначально работали во вторых это наша
- 9:19матрица матрица вращение ну и в третьих
- 9:21это нам еще нужно передать размеры
- 9:24самого изображения
- 9:25размер изображения они у нас и вот здесь
- 9:27записаны мы давайте про сюда передадим
- 9:29это ширина а также высота вот мы эти
- 9:32данных и да как бы и передали ну и
- 9:34теперь мы наверное наверное давайте
- 9:37кстати еще мы сделаем так что это будет
- 9:39у нас называться не иметь возможно а
- 9:41и мяч парам просто потому что если он с
- 9:44одинаковое название то он это все
- 9:45подсвечивает а я не хочу чтобы он нам
- 9:47это все подсвечивал поэтому давайте
- 9:49просто разные названия укажи так вот все
- 9:51теперь у нас есть готовая функция и нам
- 9:54остается лишь вызвать саму по себе эту
- 9:56функцию для ее вызова мы с вами давайте
- 9:59в и ту же самую переменную m где будем
- 10:01устанавливать новое значение это по сути
- 10:02будет наша картинка что уже имеет некое
- 10:05вращение ну и здесь мы просто обращаемся
- 10:07к нашей функции rotate мы указываем
- 10:09какую картинку мы будем вращать и
- 10:11указываем угол допустим на 90 градусов я
- 10:13буду вращать нашу картинку чуть ниже эта
- 10:16картинка будет выводиться на экран на
- 10:18вернее вообще пользователю если мы
- 10:20сейчас такое запустим можем заметить что
- 10:22видите у нас картинка здесь это просто
- 10:23на 90 градусов она перевернулась если
- 10:26хотите чтобы она перевернулась другую
- 10:28сторону то соответственно можно указать
- 10:29здесь -90 давайте вот мы еще раз
- 10:31запустим и вот замечаем что картинка она
- 10:34перевернута в другую сторону то бишь для
- 10:36вращения картинки в принципе всегда
- 10:38можете прописывайте подобную функцию но
- 10:40еще раз хочу напомнить что обращать вы
- 10:42можете не только как одиночную картинку
- 10:44но так и вы можете вращать любую
- 10:46картинку что находится в самом видео
- 10:48потому что видео но и состоит из обычных
- 10:51картины теперь же мы наверное опять же
- 10:53давайте не будем с вами
- 10:55вызывать саму эту функцию rotate и
- 10:57вместо функции радует мы давайте создать
- 11:00им еще одну функцию которая позволит нам
- 11:03сместить изображение с и его
- 11:05первоначальных координат то есть на
- 11:07данный момент если вот запустить
- 11:08программу то наше изображение она
- 11:11естественно конечно же помещается в сам
- 11:14этот квадрат в принципе из за этого
- 11:16изображения создаётся само это ширина и
- 11:19высота этого окошка но также
- 11:21дополнительно мы можем указать
- 11:22некое смещение для картинки в таком
- 11:25случае по бокам будут просто черные
- 11:27полосы
- 11:27давайте это мы как раз тоже с вами
- 11:29попробуем сделать для этого мы конечно
- 11:31же опять можем прописать код просто без
- 11:33функции на удобно создавать некие
- 11:35функции поэтому давайте лучше и создадим
- 11:37некую функцию а мы давайте назовем так
- 11:39transform то есть передвижение или
- 11:42трансформация и это функций у нас будет
- 11:44принимать несколько параметров это им
- 11:46джим то есть это сама картинка причем
- 11:49давайте наверное название мы укажем
- 11:51другая то есть это пускай и им чапарам
- 11:53допустим какое у него будет название а
- 11:54также это смещение по иксу
- 11:57и смещение по игреку вот такие вот тут
- 11:59будут параметры далее нам необходимо
- 12:01здесь создать по сути тоже матрицу
- 12:03поэтому давайте создадим здесь некую
- 12:06переменную и чтобы нам создать здесь
- 12:08матрицу мы должны указать с вами
- 12:09следующее мы обращаемся к библиотеке нам
- 12:12пай опять-таки напомнить что за счет
- 12:14этой библиотеке мы очень быстро можем
- 12:16создавать различные матрицы здесь мы
- 12:18указываем с вами использовании такой
- 12:21функции как флот 32 по факту у нас будет
- 12:24создана матрица где каждый элемент это
- 12:26будет определенное число с точкой вот
- 12:29что-то в этом духе и здесь мы открываем
- 12:32круглые скобки в качестве значения мы
- 12:35сюда указываем список причем поскольку
- 12:38хочу создать матрицу то в этом списке
- 12:40создаю еще как бы два списка ну или
- 12:43другими словами это будет первый элемент
- 12:44это будет второй элемент по фактам не
- 12:46создали матрицу и вы первый элемент мы с
- 12:49вами устанавливать следующее что когда
- 12:51по иксу у нас будет единица по игреку 0
- 12:54а по z мы будем передавать с вами этот
- 12:56параметр x
- 12:57тем самым мы выполним смещение и здесь
- 13:00мы указываем с вами 01
- 13:03ну то есть соответственно здесь мы
- 13:04просто будем смещать подругой координате
- 13:06здесь мы указываем что по иксу у нас 0
- 13:08будет по игреку у нас один будет был
- 13:10опознать мы укажем так
- 13:12параметр который также принимаем в самой
- 13:14функции далее нам необходимо еще
- 13:17получить в принципе
- 13:19размеры картинки ну давайте это мы
- 13:21наверное будем делать чуть позже мы
- 13:22давайте просто сразу с вами будем
- 13:24возвращать уже нужную для нас картинку и
- 13:25для этого мы просто обращаемся к
- 13:27библиотеке
- 13:28обращаемся к методу work off or even a
- 13:31сюда мы передаем само изображение
- 13:33которым мы получили вы функцию дальше мы
- 13:36перейдем сюда матрицу и также мы должны
- 13:38сюда передать ширину и высоту ну и
- 13:41соответственно чтобы получить ширину и
- 13:42высоту мы просто обращаемся с вами к
- 13:45так немножко никому начал обращаться мы
- 13:47обращаемся к и матч парам дальше мы
- 13:49обращаемся к шейп здесь мы для получения
- 13:52высоты и ринга полученными ширины мы
- 13:54должны обратиться к элемент по индексу 1
- 13:56а для получения соответственно высоты мы
- 14:00обращаемся к элементу по индексу на льду
- 14:02потому что напомню вы шайб у нас взойдет
- 14:04все значение они как бы идут и наоборот
- 14:06но в общем то все вот это все что нужно
- 14:08было написать для
- 14:09ответ на этой функции и теперь мы можем
- 14:12ее вызвать для вызова мы давайте с вами
- 14:16пропишем следующая в ту же самую нашу
- 14:18переменную m чем мы будем устанавливать
- 14:20значение этой функции
- 14:22сюда мы будем передавать нашу картинку и
- 14:24плюс и производим указывать смещение
- 14:26например по иксу пуская наша картинка
- 14:28сместится на 30 пикселей а по игреку она
- 14:31пускай сместиться аж на 200 пикселей
- 14:33если мы такое сейчас с вами запустим то
- 14:36заметим что видите вот здесь у нас
- 14:37создается совершенно небольшой такой
- 14:39отступ но зато по y у нас создается
- 14:41достаточно большой отступ
- 14:43мы или другим с вами нас происходит как
- 14:45раз смещение картинки дан о ipsum а
- 14:48также по игреку то бишь за счет подобной
- 14:50функции вы спокойно можете смещать
- 14:52картинку вы какие-либо другие координаты
- 14:55теперь давайте научимся находить контуры
- 14:57изображения
- 14:58ранее мы уже научились находить края
- 15:01изображение но контуры и края это
- 15:03немного разные вещи дело в том что когда
- 15:06мы находим просто края изображения то
- 15:08что мы делали ранее то по факту мы с
- 15:10вами действительно просто находим нужные
- 15:11как бы углы нужные края и соответственно
- 15:14можем вывести линию можем ввести что-то
- 15:16в духе обводки по вот этим вот краям
- 15:19когда мы находим самыми контуры мы по
- 15:21сути делаем то же самое вот только мы
- 15:24и получаем как бы позиции всех вот этих
- 15:28вот
- 15:28контуров да и соответственно и когда мы
- 15:30получили позиции всех этих контуров под
- 15:32дальнейшем мы можем просто с этими
- 15:34позициями работать и мы сможем понимать
- 15:36где конкретно у нас будет находиться
- 15:38нужные нам объект и соответственно
- 15:41давайте сейчас попробуем с вами как раз
- 15:42и найти контуром а также попробуем
- 15:44вывести их на экран и так для начала
- 15:47чтобы нам найти контуры нам по сути
- 15:49необходимо само изображение привести вы
- 15:51серый формат дело в том что если мы с
- 15:54вами будем искать контуры
- 15:55сразу же ну вот с обычного изображения в
- 15:59таком случае у нас это изображение на
- 16:01достаточно долго будет обрабатываться
- 16:03нас будет слишком много контуров и
- 16:05чтобы нам просто активизировать
- 16:07программу чтобы нас прочие шел процесс
- 16:10поиска контуров и нам конечно же лучше
- 16:12приводить картинку к серому формату в
- 16:14таком случае мы хотя бы будем
- 16:15использовать не три слоя как это как это
- 16:17идет обычно в стандартной картинки
- 16:19архиве а мы будем использовать лишь один
- 16:21слой это серый
- 16:22слой соответственно давайте такое сейчас
- 16:24сделаем итак мы просто создаем некую
- 16:26наверняка ту же саму переменную мы с
- 16:28вами запишем следующее мы обращаемся к
- 16:30нашей библиотеке мы обращаемся с вами к
- 16:33методу который называется физики color и
- 16:35сюда мы просто указываем нужное
- 16:38изображение а также мы указываем формат
- 16:40приведение в нашем случае буду
- 16:42использовать тот же самый формат
- 16:44линии это не совсем тот же самый формат
- 16:45я буду использовать формат
- 16:47би джей ар туда то есть is art baby ну
- 16:51или другими словам пейджер мы
- 16:52конвертируем это все в их серый формат
- 16:54после того как мы сконвертировать это
- 16:56все в серый формат мы дополнительно
- 16:58лучше еще немного выполним размытие
- 17:01изображения так так лучше делать по той
- 17:04причине что если вы немного размывает
- 17:06изображение по соответственно вы немного
- 17:08сглаживайте углы и опять же когда вот мы
- 17:10будем искать контры то контуров будет
- 17:12меньше соответственно программа наша
- 17:14будет немного более оптимизированной ну
- 17:16и вообще в принципе поиск всех этих
- 17:18контуров он тоже будет немного более
- 17:19оптимизирован поэтому давайте здесь
- 17:21пропишем с вами еще то что мы обращаемся
- 17:23к такой функции который называется как
- 17:26gulsen blurr
- 17:27сюда мы передаем нужную картинку также
- 17:30мы указываем
- 17:32ну кормил сайта есть мы указываем
- 17:33насколько сильно у нас произойдет
- 17:35размытие здесь давайте мы укажем что-то
- 17:38не супер сильная здесь например 5 5
- 17:40укажем еще раз кстати напомнить что
- 17:42здесь можно указывать только нечетные
- 17:43числа чётные числа тут нельзя указывать
- 17:45ну и 7 x мы укажем просто как значение 0
- 17:50точно то же самое что у нас было ранее и
- 17:52следующее что нам нужно сделать так это
- 17:54по сути еще найти вот эти края и джесс
- 17:56который мы ранее с вами искали а уже
- 17:58когда мы найдем края мы только потом
- 18:00сможем найти еще и контры то есть
- 18:02действие нужно выполнить немало но это
- 18:05все нужно сделать если потому что если
- 18:08мы сразу будем искать контуры по
- 18:09соответственно во первых будет не совсем
- 18:11точный результат а во вторых это будет
- 18:13достаточно долго в плане обработки
- 18:15самого изображения но главное это будет
- 18:17просто не совсем точный результат вот
- 18:19это вот основная проблема так вот мы
- 18:21давайте с вами еще для поиска краев
- 18:23будем использовать соответственно такую
- 18:25функцию которая называется как они опять
- 18:27же мы уже с ней работали и здесь мы
- 18:29указываем просто изображением а также 2
- 18:31порога и давай и мы немного остановимся
- 18:33на вот этом вот моменте ранее мы с вами
- 18:36просто указывали например как 106 лежит
- 18:3930 30 но по факту
- 18:40когда вот мы указан своим 1 порог то это
- 18:43означает то что все те цвета которые
- 18:45будут ниже чем например 100 цвет они
- 18:48будут проигнорированы и у них будет
- 18:50значение уставлены как 0с черный цвет
- 18:52напомним что когда мы с вами используем
- 18:55допустим серая изображением то там идут
- 18:58цвета от 0 до 255
- 19:01об этом я говорил в во втором уроке то
- 19:04есть и существует бинарное изображение
- 19:06как раз пытаемся такое изображение и
- 19:08создать когда у нас будут просто черные
- 19:10и белые точки но существует также еще и
- 19:13серые фотографии серые форматы где у нас
- 19:16и цвета идут от 0 до 255
- 19:19соответственно ноль полностью черный 255
- 19:21это полностью белый так вот смотрите
- 19:23когда мы указываем 1 порог то мы как бы
- 19:25говорим что все эти цвета которые будут
- 19:28меньше чем например 100 они будут
- 19:30проигнорированы и они будут приведены к
- 19:32нулю то есть это будет черная .
- 19:34так же мы можем сказать здесь 2 порог и
- 19:36например сказать что пускай будет равен
- 19:39допустим 140 и это будет означать то что
- 19:42все те цвета которые будут
- 19:44больше чем 140 они также будут
- 19:46проигнорированы и они в свою очередь
- 19:49будут приведены к формату 255 не будут
- 19:52сделаны так но получается как белые
- 19:55точки все что будет находиться в этом же
- 19:58диапазоне это по сути тоже будет
- 20:00являться именно белой точкой или черной
- 20:02точкой ну в зависимости уже от контекста
- 20:04но по факту когда вы указываете вот эти
- 20:06вот 2 порога вы можете указать просто
- 20:08какие цвета будут
- 20:09изначально приведены к черному все что
- 20:11ниже сотни так черном будет приведено и
- 20:13все что выше 140 она будет приведено как
- 20:15белый лук делом
- 20:17делай как будто той точки также по
- 20:19желанию вы можете не указывать этот
- 20:21диапазон и можете просто указать 100 в
- 20:22том и это тоже будет окей ну мы для
- 20:25интереса давайте все-таки здесь что-то
- 20:27новенькое укажем например укажем некий
- 20:29диапазон далее мы наверное давайте
- 20:32попробуем сейчас вывести нашу картинку
- 20:34просто посмотрим что у нас получилось у
- 20:35нас получилось все абсолютно корректно
- 20:37виде вот я указал диапазон все
- 20:39обработалось без каких-либо проблем и
- 20:42теперь мы давайте попробуем найти
- 20:43контуры в этом изображении чтобы нам
- 20:47найти контр им нам необходимо
- 20:48использовать такой метод который
- 20:50называется как point конкурс данный
- 20:52метод он возвращает 2 как бы во как бы
- 20:55значения две переменные и соответственно
- 20:57мы давайте здесь создадим как раз две
- 21:00переменные 1 перемен опускаем будет
- 21:01называться как контур ну или просто
- 21:03конда а вторая переменная будет
- 21:05называться как иерархии или же просто
- 21:07here но пускай например у нее такой
- 21:08будет названием и смотрите в первую
- 21:10переменную в не будет установлен как бы
- 21:13список со всеми контурами
- 21:15ну как бы со всеми позициями контуров а
- 21:17во вторую переменную там будет
- 21:20установлена иерархия
- 21:22самих объектов вот предположим у вас
- 21:25например будет изображением где у вас
- 21:27просто будет например некий квадратик в
- 21:29квадратике будет линиям ну и и все
- 21:32например да и соответственно вы вот этот
- 21:34переменную киррахи в нее будет
- 21:36установлена днем будет установлен
- 21:39порядок приз там будет написано мол что
- 21:41изначально идет как бы квадратик а уже
- 21:44потом вы квадратики будет находиться там
- 21:46например линия то просто иерархия
- 21:48объектов ну на данный момент мы с
- 21:50иерархии объектов работать не будем но
- 21:52возможно чуть чуть позже в ходе этого
- 21:54курса мы с этим еще поработаем но теперь
- 21:56давайте вернем
- 21:57обратно к функции здесь в качестве
- 21:58первого параметра мы должны указать
- 22:00изображение с которым мы работаем в
- 22:02качестве изображения важно указать уже
- 22:04то изображение где у нас просто
- 22:06указанные определенные края мы это ранее
- 22:08уже с вами получили это изображение сюда
- 22:10и как раз и подставляем в качестве
- 22:12второго параметра мы указываем режим
- 22:14получения всех вот этих вот контуров и
- 22:17на данный момент мы давайте с вами
- 22:18обратимся к нашей библиотеке и укажем
- 22:22такой режим который называется как
- 22:23риттер лист он означает то что мы с вами
- 22:26будем получать полностью все доступные
- 22:28контуры можно получать частично контры
- 22:31но мы будем получать полностью все
- 22:32доступные контуры и так же здесь еще
- 22:35указан метод получения самих этих
- 22:38контуров на данный момент мы давайте с
- 22:40вами укажем такой метод который
- 22:42называется как chain и prox нам данный
- 22:45метод
- 22:46он означает то что у нас будут найдены
- 22:48абсолютно все координаты всех контуров
- 22:51но также мы можем указать какие либо
- 22:53другие методы вот например этот
- 22:55представим что у нас будет просто некая
- 22:57линия вот у нас изображение там просто
- 23:00есть одна линия и если мы используем
- 23:02метод chain approx нам то в таком случае
- 23:04мы найдем как бы контуры полностью всей
- 23:08этой линии и когда вот используется
- 23:10метод чей напрасно то мы найдем
- 23:12полностью все точки всей этой линии
- 23:15если же мы будем использовать например
- 23:17какой метод как chain approx импланта он
- 23:20является более оптимизированным так как
- 23:22он если опять таки рассматривать на
- 23:24примере этой же самой линии то он найдет
- 23:26только первоначальную точку а также
- 23:29конечную точку ну а соответственно все
- 23:31остальные точки уже не важен и по той
- 23:33причине что эта линия
- 23:34ну и нам по факту важны только как бы им
- 23:36начало этой линии и важен конец той
- 23:38линии поэтому соответственно approx
- 23:39simple он более оптимизирован но
- 23:41поначалу
- 23:42предлагаю использовать все таки
- 23:44предыдущий предыдущий метод который
- 23:46называется chain approx на теперь же мы
- 23:50давайте попробуем с вами сделать вот что
- 23:53мы давайте попробуем вывести и
- 23:54полученное изображение
- 23:56вернее даже не так мы давайте
- 23:58изображение то же самое будем выводить
- 24:00дан который у нас было до этого но
- 24:02давайте в терминал мы попробуем вывести
- 24:04с вами вот эти вот все контуры которые
- 24:06мы получили итак запускаем программу
- 24:09вечно же само по себе изображение нас
- 24:10никак не поменялось потому что мы как бы
- 24:12тоже самое изображение и выводим в то же
- 24:14время мы можем заметить что сводится в
- 24:16терминале просто гигантский список и
- 24:19этот гигантский и список он по сути
- 24:21состоит из различных точек из различных
- 24:24координат всех вот этих вот найденных
- 24:27контуров ну и на данный момент нам
- 24:29конечно же с этим достаточно сложно
- 24:30будет работать но в будущем за счет
- 24:33других специальных функций мы сможем
- 24:35просто
- 24:35ну как бы находить нужные для нас
- 24:37объекты мы будем знать их координаты и
- 24:39соответственные эти объекты сможем там
- 24:41обводить можем их сможем их подписывать
- 24:44и так далее например просто считывать
- 24:46информацию сможем с этих объектов
- 24:48дополнительном мы давайте наверное не
- 24:50только будем выводить все эти контуры
- 24:52просто в терминал но также давайте за
- 24:54счет этих контуров мы попробуем
- 24:56нарисовать новую картинку
- 24:57соответственно изначально нам необходимо
- 25:00создать эту новую картинку пускай она
- 25:02будет в самом верху и она будет
- 25:04называться как new image
- 25:05и здесь мы с вами делаем следующее то
- 25:08есть мы должны обратиться за вами
- 25:09библиотеки нам пайм здесь мы вращаемся к
- 25:12методу за errors который позволяет
- 25:14создать матрицу но при этом все элементы
- 25:15там будут со значением 0 и то мы можем
- 25:18указать просто с вами ну как бы значение
- 25:21элемент количество элементов но я
- 25:23предлагаю просто здесь обратиться к
- 25:25изображению и кстати говоря нам нужно
- 25:28тогда в таком случае вот так немножко
- 25:30переделать мы просто обратимся к
- 25:31изображению и обратимся к его размерам
- 25:34по сути это тоже нам как раз и нужно
- 25:36будет то есть то мы получим высоту
- 25:37получим ширину и плюс получим еще и
- 25:40количество слоев это значением как раз и
- 25:43можем подставить сюда вы метод износа но
- 25:45все абсолютно нормально обрабатывается
- 25:47дополнительном и давайте укажем здесь де
- 25:49type и укажем то что мы уже не раз
- 25:51указывали you and 8 тыс это будет
- 25:54значение которое больше за 0 и что мы
- 25:58еще давайте с вами сделаем так это вот
- 26:00чуть ниже вот здесь мы просто с вами
- 26:03попробуем на этом изображением на этом
- 26:05полотне которое мы создали на этом
- 26:07полотне мы попробуем нарисовать картинку
- 26:09за счет тех контуров что указано у нас
- 26:11вот в этом списке чтобы нам такое
- 26:13сделать мы обращаемся к методу counters
- 26:15здесь мы должны обратиться к нашему
- 26:18изображению к нашему полотну моем случае
- 26:21это new им
- 26:21далее мы указываем контуры в моем случае
- 26:24это переменная контур далее нам
- 26:27необходимо указать
- 26:28контуру ну как бы айди этих контуров но
- 26:31мы давайте сейчас просто укажем здесь
- 26:33например значения как -1 также мы должны
- 26:35указать цвет для самой этой ободки для
- 26:38самих этих контуров цвет может быть
- 26:40каким угодно он здесь идет в формате
- 26:41begin
- 26:43то есть соответственно это синий зеленый
- 26:45красный ну и допустим и давайте укажем
- 26:47здесь какие то возможны случайные
- 26:49значения я не знаю что конкретно заяц
- 26:51свет это будет но давайте я просто
- 26:53попробую вписать какие-то цифры какой-то
- 26:56это цвет по любому будет ну и так же
- 26:58здесь мы можем указать толщину еще
- 26:59обводки мы давайте укажем что наш ободка
- 27:02она будет всего лишь в один пиксель
- 27:04также чуть ниже мы не забываем что мы
- 27:07хотим вывести именно наше новое
- 27:09изображение теперь мы давайте это
- 27:11попробуем запустить и вот что мы с вами
- 27:13получили по факту мы получили то же
- 27:15самое ну ту же самую картинку что у нас
- 27:18было до этого но здесь есть одно
- 27:20небольшое отличие потому что когда мы с
- 27:23вами выводили картинку которая была
- 27:24просто создана за счет метода кении то
- 27:26это бы было картинка где просто были
- 27:28описаны все необходимые контуры но
- 27:31сейчас нас посуде выводится подобная
- 27:33картинка ну то есть такая же вернее даже
- 27:35картинка
- 27:36но дело в том что оно уже выводится за
- 27:38счет тех координат который мы с вами
- 27:40получили из предыдущей картинке то есть
- 27:43по факту мы полностью считали картинку у
- 27:45нас их была некая картинкам и и
- 27:46полностью с вами считали
- 27:48нашли все необходимые контуры нашли все
- 27:50необходимые краям и на основе той
- 27:53предыдущей картинке мы по сути создали
- 27:55новую картинку вот такая вот механика
- 27:57здесь сейчас произошла что достаточно
- 27:59неплохо ну что ж хоть этого урока мы
- 28:02изучали различные функции для
- 28:03трансформации изображения а также мы
- 28:05научились находить контуры и даже на
- 28:07основе этих контуров научились рисовать
- 28:09новые изображения надеюсь урок вам
- 28:11понравился если так то не забывайте
- 28:13подписываться на канал а так же вступай
- 28:15в наши соцсети все ссылки на них будут в
- 28:17описании к этому видео у меня ж на этом
- 28:19все до скорых встреч пока
About this transcript
This page contains the full transcript of Изучение Python OpenCV / Урок #4 – Функции трансформации изображений by Гоша Дударь, generated from the public captions YouTube serves with the video. The transcript has 4,909 words across 798 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.