Теги: искусственный интеллект  

ISBN: 978-5-9729-2346-5

Текст
                    Инфра-Инженерия

КОМПЬЮТЕРНОЕ ЗРЕНИЕ

ПРАКТИКА

А. В. Сацюк КОМПЬЮТЕРНОЕ ЗРЕНИЕ. ПРАКТИКА Учебное пособие Москва Вологда «Инфра-Инженерия» 2025
УДК 004.89 ББК 32.813 С22 Рецензенты: доктор технических наук, профессор, ректор ФГБОУ ВО «ДОНЕЦКИЙ ИНСТИТУТ ЖЕЛЕЗНОДОРОЖНОГО ТРАНСПОРТА» Чепцов Михаил Николаевич; доктор технических наук, профессор, заведующий кафедрой «Компьютерные технологии» ФГБОУ ВО «ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ УНИВЕРСИТЕТ» (ДонНУ) Толстых Виктор Константинович; доктор технических наук, профессор, заведующий кафедрой «Горная хтеюрогехникг! и автоматика им. Р. М. Лейбова» ФГБОУ ВО «ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» (ДонНТУ) Маренич Константин Николаевичу доктор технических наук, профессор ФГБОУ ВО «ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» (ДонНТУ) Малеев Виктор Борисович Сацюк, А. В. С22 Компьютерное зрение. Практика : учебное пособие / А. В. Сацюк. - Москва ; Вологда : Инфра-Инженерия. 2025. - 272 с. : ил., табл. ISBN 978-5-9729-2346-5 Содержит краткое теоретическое описание основных методов и принципов обла- сти компьютерного зрения, а также включает практические примеры: программы с при- менением функций библиотек компьютерного зрения на языке Python, начиная от при- меров работы с пикселями и заканчивая нейросетевыми задачами. Для студентов старших курсов очной и заочной форм обучения, инженеров и ас- пирантов, которые обучаются по специальности «Системы обеспечения движения поездов» и «Информационные системы и технологии», а также для обучающихся на дополнительных курсах по направлению «Искусственный интеллект», «Программиро- вание и робототехника», «Компьютерное зрение». УДК 004.89 ББК 32.813 ISBN 978-5-9729-2346-5 © Сацюк А. В., 2025 © Издательство «Инфра-Инженерия», 2025 © Оформление. Издательство «Инфра-Инженерия». 2025
ОГЛАВЛЕНИЕ ВВЕДЕНИЕ....................................................8 L ОСНОВЫ КОМПЬЮТЕРНОГО ЗРЕНИЯ..............................10 1.1. История развития компьютерного зрения................10 1.2. Аппаратные ресурсы ................................ 12 1.3. Библиотеки для работы с изображениями. OpenCV...... 20 ПРАКТИЧЕСКОЕ ЗАДАНИЕ.................................. 24 2. ИНТЕРАКТИВНОЕ УПРАВЛЕНИЕ В КОМПЬЮТЕРНОМ ЗРЕНИИ......................................25 2.1. Общие сведения об интерактивном управлении......... 25 2.2. Интерактивные окна и виджеты....................... 26 2.3. Слайдеры........................................... 28 2.4. События мыши................................. 29 ПРАКТИЧЕСКОЕ ЗАДАНИЕ.......................................31 3. ОСНОВЫ ИЗОБРАЖЕНИЙ И ВИДЕО..............................32 3.1. 11редставление изображений в OpenCV..................32 3.2. Загрузка, отображение и сохранение изображений.......33 3.3. Захват видео с камеры и из файла.....................35 3.4. Основные операции с изображениями....................37 3.4.1. Изменение размера изображения....................37 3.4.2. Обрезка изображения..............................40 3.4.3. Вращение изображения.............................42 3.4.4. Отражение изображения............................44 ПРАКТИЧЕСКОЕ ЗАДАНИЕ......................................45 4. ЦВЕТОВЫЕ ПРОСТРАНСТВА И ФИЛЫ РАЦИЯ......................47 4.1. Цвет и свет..........................................47 4.2. Пиксели и их предст авление..........................49 4.3. Цветовые пространства................................53 4.4. Операции над пикселями...............................57 4.5. Преобразование между цветовыми пространствами........61 4.6. Цветовая коррекция...................................64 4.7. Фильтрация цветов и цветовая сегментация.............66 ПРАКТИЧЕСКОЕ ЗАДАНИЕ................................ 70 5. МЕТОДЫ ОБРАБОТКИ ИЗОБРАЖЕНИЙ............................72 5.1. Инверсия изображения............................... 72 5.2. Линейное объединение двух изображений................74 5.3. Вычисления абсолютной разницы изображений............77 5.4. Преобразование изображения с использованием абсолютных значении и масштабирования........................................79 5.5. Бинаризация и пороговая обработка.............. ....81
5.6. Фильтрация..............................................84 5.6.1. Принцип цифровой фильтрации..................... 84 5.6.2. Ядро фильтра........................................90 5.6.3. Фильтрация и сглаживание изображений................92 5.6.4. Фильтрация Гаусса...................................95 5.6.5. Билатеральный фильтр................................98 5.6.6. Фильтры расширения и сужения.......................100 5.6.7. Медианный фильтр...................................103 5.6.8. Фильтр Лапласа.....................................104 5.6.9. Фильтр Собеля......................................107 5.7. Выделение контуров и краев на изображениях..............110 5.7.1. Обнаружения границ.................................110 5.7.2. Обнаружения контуров...............................112 5.8. Сегментация изображений.................................115 5.9. Гомография изображений.................................117 ПРАКТИЧЕСКОЕ ЗАДАНИЕ........................................122 6. ГРАФИЧЕСКИЕ ОТРИСОВКИ В КОМПЬЮТЕРНОМ ЗРЕНИИ................124 6.1. Графические отрисовки..................................124 6.2. Отрисовка геометрических фигур.........................125 6.2.1. Отрисовка линий.................................. 126 6.2.2. Отрисовка прямоугольника...........................128 6.2.3. Отрисовка кругов и эллипсов........................129 6.2.4. Отрисовка полигональных фигур......................131 6.2.5. Создание холста.................................. 133 6.3. Перемещение геометрических фигур.......................136 6.4. Динамическая отрисовка прямоугольной области...........138 6.5. Добавление текста к изображению........................141 6.6. Вычисление гистограммы изображения.....................142 ПРАКТИЧЕСКОЕ ЗАДАНИЕ........................................146 7. ОБРАБОТКА ДВИЖУЩИХСЯ ОББЕКТОВ.............................148 7.1. Основы обработки движущихся объектов................. 148 12. Предварительная обработка изображений..................149 7.3. Выбор области интереса.................................152 7.4. Отслеживание движущихся объектов.......................160 7.5. Анализ траекторий движущихся объектов..................167 ПРАКТИЧЕСКОЕ ЗАДАНИЕ........................................171 8. ГЛУБОКОЕ ОБУЧЕНИЕ И НЕЙРОННЫЕ СЕТИ........................174 8.1. Введение в глубокое обучение...........................174 8.2. Сверточная нейронная сеть..............................177 8.3. Рекуррентная нейронная сеть............................187 8.4. Распознавание объектов с использованием алгоритма каскадов Хаара.............................................188 8.5. Обнаружение объектов в реальном времени................194
8.5.1. Алгоритмы YOLO............................................194 8.5.2. Эволюция модели YOLO.................................... 196 8.5.2. Практическое применение YOLO..............................202 ПРАКТИЧЕСКОЕ ЗАДАНИЕ..............................................204 9. КОМПЬЮТЕРНОЕ ЗРЕНИЕ НА МИКРОКОМПЬЮТЕРАХ..........................205 9.1. Выбор микрокомпьютера........................................205 9.2. Установка и настройка окружения..............................210 9.3. Работа с камерой.............................................212 9.4. 11рограммно-аппаратная архитектура CUDA......................219 9.5. Настройка CUDA на микрокомпьютере Jetson Nano...............221 ПРАКТИЧЕСКОЕ ЗАДАНИЕ..............................................225 ЗАКЛЮЧЕНИЕ..........................................................226 СЛОВАРЬ ТЕРМИНОВ....................................................227 СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТРУРЫ....................................233 ПРИЛОЖЕНИЕ...................... ................................ 234 cv2.absdiff().....................................................234 cv2.addWeighted().................................................234 cv2 .bi I atcralFil ter().........................................235 cv2.bitwise_and().................................................235 cv2.bitwise_ not()................................................236 x —. x F11te r() .....................4— 3 6 cv2.boxPoints()...................................................236 cv2.calcHist().................................................. 237 cv2.Canny().......................................................237 cv2.CascadeClassifier()......................................... 238 cv2.circle()......................................................238 cv2.convertScaleAbs().............................................239 cv2.createTrackbar()..............................................239 cv2.cvtColor().................................................. 240 cv2.destroy AllWindows()..........................................241 cv2.dctectMultiScale()............................................241 cv2.dilate()................................................ 242 cv2.drawContours()............................................ 242 cv2.ellipse().....................................................243 cv2.erode()................................................... 244 cv2.filter2D()....................................................244 cv2.findContours()...................................... 245 cv2.flip()...................................................... 246 cv2.GaussianBlur()................................................246 cv2.gctRectSubPix()...............................................246 cv2.getRotationMatrix2D()....................................... 247 cv2.getTrackbarPos()..............................................247
cv2.imrcad().............................................................248 cv2.imshow()..................................................... 248 cv2. imwrite()....................................................... 248 cv2. inRange()...•.......................................................249 cv2.Laplacian()..........................................................249 cv2.line()...............................................................250 cv2.magnitude()..........................................................250 cv2.medianBlur().........................................................251 cv2.merge()..............................................................251 cv2.minAreaRect()........................................................251 cv2.moveWindow().........................................................252 cv2.MultiTracker().......................................................252 cv2.namedWindow()...................................................... 252 cv2.polylines()..........................................................253 cv2.putText()............................................................253 cv2.rectangle()..........................................................254 cv2.resize().............................................................255 cv2.selectR0I()...................................................... 255 cv2.setMouseCallback()...................................................256 cv2.setWindowProperty()..................................................257 cv2.Sobel()..............................................................257 cv2.split()............................................................ 258 cv2.threshold...................................................... 258 cv2.TrackerCSRT()........................................................259 cv2.TrackerKCF().........................................................259 cv2.TrackerMedianFlow()................................................ 259 cv2.TrackerMIL()....................................................... 260 cv2.TrackerMOSSE().......................................................260 cv2.VideoCapture().......................................................260 cv2. Video Writer()......................................................260 cv2.VideoWriter_fourcc().................................................261 cv2.waitKey()............................................................261 cv2.warpAffme()..........................................................262 numpy .array()...........................................................262 numpy.arangeQ............................................................263 numpy.emptyO.............................................................263 numpy. fl ip()...........................................................264 numpy. full().......................................................... 264 numpy .hstack()..........................................................265 numpy.mean().............................................................265 numpy. ones()............................................................265 numpy. reshape().........................................................266 numpy.std()............................................................ 266 numpy.vstack()......................................................... 267
numpy.zeros()......................................................................267 tracker. init()................................................................ 268 tracker.update()................................................................. 268 tracker.getQ.......................................................................269 tracker.release()..................................................................269
ВВЕДЕНИЕ Задача компьютерного зрения (КЗ) заключается в использовании фото- и видеокамер для анализа и понимания реальных сцен. Эта ветвь искусственного интеллекта (ИИ) изучает методологические и алгоритмические проблемы, а также вопросы, связанные с реализацией предложенных решений. В компьютерном зрении нас могут интересовать такие вопросы, как опре- деление расстояния до объектов, оценка положения автомобиля на дороге, обна- ружение людей на изображении, идентификация конкретных лиц и многое дру- гое. Все это требуется решать, имея в распоряжении лишь доступ к фотографиям или видео. Благодаря недавним достижениям область применимости компьютер- ного зрения значительно расширилась. Прогресс затронул как технологии изго- товления камер и методы вычислений, так и теоретические основы компьютер- ного зрения. За последние годы компьютерное зрение стало ключевой технологией во многих областях. Если речь идет о потребительской электронике, то достаточно упомянуть мобильные телефоны, системы помощи водителям или интерактив- ное взаимодействие пользователя с компьютерными играми. В промышленности компьютерное зрение широко применяется для конфоля качества продукции и оптимизации технологических процессов. Значительный вклад компьютерное зрение внесло в киноиндустрию, например, в создание спецэффектов или высо- кокачественных презентаций фильмов. И это лишь малая часть областей приме- нения, связанных с обработкой и анализом статических и динамических изобра- жений. Кроме того, компьютерное зрение активно используется и в других сферах, таких как автомобильное и железнодорожное транспортные средства. Например, автоматизированные системы помогают автомобилям и поездам безопасно пере- двигаться, обнаруживая и предотвращая аварии. В авиации компьютерное зре- ние играет важную роль в управлении беспилотными летательными аппаратами (БПЛА), обеспечивая им способность наблюдать за окружающей средой и при- нимать соответствующие решения. Автор предпринял попытку максимально простым языком объяснить мате- риал, чтобы обучающиеся могли легче его усвоить. При этом основной материал книги носит практический характер с большим количеством примеров и иллю- страций. В учебном пособии рассмотрены все этапы изучения компьютерного зрения, начиная с работы над отдельными пикселями и заканчивая написанием профамм на основе нейронных сетей. Каждый раздел завершается заданиями, что дает возможность обучающемуся закрепить материал и немного самостоя- тельно углуби 1ЬСЯ. Помимо этого, в учебное пособие включена библиотека терминов. В ней раскрыты понятия, которые помогут читателю, не отрываясь от изучения темы узнать значение того или иного термина в данной теме. Это поможет лучше по- нять ключевые понятия и термины, используемые в области компьютерного
зрения. Кроме того, в пособие включен перечень всех функций, применяемых в компьютерном зрении, рассматриваемых в книге. Это обеспечит как обу- чающимся, так и опытным инженерам быстрый доступ к необходимым инстру- ментам. Учебное пособие предназначено для студентов старших курсов технических специальностей по направлению «Информационные технологии и автоматика». Оно также может быть полезным для инженеров и аспирантов в качестве быст- рого доступа к инструментам компьютерного зрения. Кроме того, пособие при- годится всем желающим, кто планирует освоить эту область знаний.
1. ОСНОВЫ КОМПЬЮТЕРНОГО ЗРЕНИЯ 1.1. История развития компьютерного зрения История компьютерного зрения увлекательна, полна страстных усилий и фантастических прорывов. Углубимся в этот захватывающий рассказ, начиная с первых шагов в попытках придать машинам способность видеть мир. Первые шаги в области компьютерного зрения были подчеркнуты стремле- нием создать электронные мозги, способные анализировать и понимать окружа- ющий мир, так же, как это делает человек. В 1950 году Фрэнк Розенблатт, аме- риканский математик и пионер в области искусственного интеллекта, предложил уникальную идею, которая оказала значительное воздействие на дальнейшее раз- витие компьютерного зрения - персептрон. Эта модель была вдохновлена рабо- той научного физика Уоррена Мак-Каллока и логика Алена Ньюэлла. Розенблатт создал простую модель нейрона, которая могла обучаться и распознавать образы. Розенблаттовский персептрон этот простой!, но мощный алгоритм пред- ставлял собой искусственный нейрон, способный обучаться на основе входных данных и адаптироваться к изменяющейся информации. Он был способен разли- чать между двумя классами данных, что положило начало идеям классификации и распознавания образов. Таким образом, первые шаги в компьютерном зрении были пройдены бла- годаря амбициозным ученым, которые пытались воплотить в машинах способ- ность «видеть» и анализировать окружающую их среду. Идеи, заложенные в этот период, стали отправной точкой для более сложных и эффективных методов, ко- торые мы видим сегодня. Следующий этап развития (1960-1970-е гг.) компьютерного зрения оказался сложным и с вызовами, требовавшими преодоления технических и вычислитель- ных ограничений. С ограниченным разрешением изображений и огромным вычислительным объемом исследователи столкнулись с трудностями в обработке и анализе визу- альных данных. Одним из основных вызовов было ограничение доступности вы- числительных ресурсов, которые были необходимы для обучения более сложных моделей и обработки изображений высокого разрешения. В от вет иа эти вызовы, исследователи разработали детекторы краев и гра- ниц, позволяющие системам компьютерного зрения выделять важные детали и структуры на изображении. Это был способ обрабатывать изображения, учиты- вая ограниченные ресурсы. Несмотря на первоначальные успехи, прогресс в области компьютерного зрения был временно замедлен, и исследователи оказались перед сложными за- дачами, связанными с классификацией и распознаванием объектов. Однако эти вызовы также стали источником вдохновения для разработки новых методов и технологий, которые стали основой для будущих инноваций в этой области.
В 2000-х с приходом более мощных компьютеров и новых подходов, таких как глубокое обучение, компьютерное зрение вновь ожило. В 2012 году нейрон- ная сеть AlexNet, обученная на графических процессорах, выиграла соревнова- ние по распознаванию изображений ImageNet, заложив основы глубокого обуче- ния в этой области. Современные системы распознавания лиц, такие как Face ID от Apple, ис- пользуют глубокие нейронные сети для точного и безопасного определения лиц пользователя. История компьютерного зрения - это путешествие от ранних экспериментов к интеллектуальным системам, способным анализировать и понимать мир вокруг нас. Она продолжает развиваться, привнося в нашу жизнь умные системы, изме- няя облик технологий и открывая новые перспективы для будущих исследова- ний. Итак, что же это такое: компьютерное зрение? Компьютерное зрение - это область исследований и разработок, которая придает компьютерам способность видеть и интерпретировать визуальные дан- ные, аналогично человеческому зрению. Вместо того чтобы просто обрабатывать изображения, компьютеры с использованием технологий компьютерного зрения способны понимать содержание этих изображений. Важным аспектом компьютерного зрения является его широкое применение в различных областях. В медицине, например, системы компьютерного зрения могут автоматически анализировать медицинские изображения, помогая врачам выявлять заболевания. В автомобильной промышленности технологии компью- терного зрения используются для создания систем, которые позволяют автомо- билям «видеть» дорогу и избегать аварий. Технологии компьютерного зрения также не обошли и железнодорожный транспорт. 1 [рименение его принципов дает широкие возможности и все чаще яв- ляется объектом интереса при совершенствовании многих сфер ж. д. транспорта: • безопасность на железной дороге: системы компьютерного зрения могут быть установлены на переездах, станциях и вокзалах для обнаружения неправильного поведения пассажиров и опасных ситуаций, таких как пе- реход через пути в неположенных местах или нарушение правил на пере- ездах. Они также могут помогать в обнаружении несанкционированного доступа на железнодорожные объекты; • поддержка машинистов: компьютерное зрение может использоваться для создания систем поддержки водителей поездов и машинистов, обеспечи- вая их информацией о состоянии путей, сигналах, погодных условиях и наличии препятствий на пути; • обслуживание инфрасгруктуры: системы компьютерного зрения могут выполнять инспекции и мониторинг состояния железнодорожных путей, мостов, туннелей и другой инфраструктуры. Они способны обнаруживать дефекты и повреждения, помогая в управлении обслуживанием и ремон- том;
• управление движением и грузоперевозками: компьютерное зрение может использоваться для оптимизации управления движением поездов, кон- троля за грузами и распределения ресурсов, что способствует более эф- фективной и безопасной железнодорожной деятельности; • безопасность пассажиров и грузов: системы мониторинга и детектирова- ния внутри вагонов и контейнеров могут обнаруживать несанкциониро- ванный доступ, обеспечивая безопасность пассажиров и грузов. Сравнение с человеческим зрением помогает лучше понять суть компью- терного зрения. Как глаза человека позволяют нам воспринимать и анализиро- вать окружающий мир, компьютерное зрение предоставляет компьютерам ана- логичные возможности, что делает их более интеллектуальными в обработке ви- зуальных данных. Важность компьютерного зрения не может быть переоценена. Эта техноло- гия способствует развитию «умных» систем, от автомобилей, обеспечивающих безопасное вождение, до роботов, способных взаимодействовать с окружающей средой. Благодаря компьютерному зрению технологии становятся более адап- тивными к реальному миру, что открывает новые перспективы в множестве об- ластей. 1.2. Аппаратные ресурсы Этот раздел размещен в начале книги, потому что хочется подчеркнуть, насколько важны аппаратные ресурсы в области компьютерного зрения, и по- этому перед тем как погрузиться в разработку, важно понять, что эффективность алгоритмов тесно связана с вычислительными мощностями. В мире обработки изображений и анализа видео без адекватных аппаратных ресурсов сложно до- стичь успеха. Особенно в глубоком обучении, где используются большие объ- емы данных, мощные графические процессоры (GPU) становятся ключевым ин- струментом. Понимание роли аппаратуры помогает обучающимся эффективнее использовать свои знания при разработке алгоритмов компьютерного зрения. Как было сказано выше, алгоритмы обработки видеопотоков или больших наборов данных требуют значительных ресурсов для эффективной работы. Л многие современные алгоритмы используют глубокое обучение, что подразу- мевает использование глубоких нейронных сетей. Обучение и выполнение ин- ференса для таких сетей требуют высокой вычислительной мощности. Все усложняется, в случаях, когда требуется обработка в реальном времени. В этом случае алгоритмы должны быть спроектированы с учетом ограниченных временных рамок, что может повысить нагрузку на ресурсы. В целом, компромисс между точностью алгоритмов и доступностью ресур- сов является ключевым вопросом в разработке систем компьютерного зрения. Аппаратные ресурсы для алгоритмов компьютерного зрения зависят от кон- кретных задач и используемых методов обработки изображении.
Существует две основные платформы, на которых можно реализовать ком- пьютерное зрение - это персональный компьютер (ПК) и микрокомпьютер (МК). Причем последние имеют большую область применения. Рассмо1рим требова- ния для персональных компьютеров и микрокомпьютеров. Персональные компьютеры: Процессор (CPU). Мощный многозадачный процессор с высокой частотой яв- ляется основным компонентом для выполнения алгоритмов компьютерного зре- ния. Многоядерные процессоры обеспечивают параллельную обработку данных. Графический процессор (GPU). Использование 1рафического процессора для ускорения вычислений, особенно для алгоритмов глубокого обучения, может существенно повысить производительность. Оперативная память (RAM). Большой объем оперативной памяти необхо- дим для эффективной обработки данных, особенно при работе с высокоразре- шенными изображениями. Хранение данных (SSD). Для быстрого доступа к данным, таким как модели машинного обучения и кэшированные изображения, предпочтительно использо- вать твердотельные накопители. Микрокомпьютеры: Процессор. Микрокомпьютеры, такие как Raspberry Pi, обычно используют ARM-процессоры. Они обеспечивают эффективное энергоно1ребление и явля- ются приемлемым выбором для легких задач компьютерного зрения. Оперативная память (RAM). Ограниченные ресурсы оперативной памяти на микрокомпьютерах могут потребовать оптимизации алгоритмов для работы в ограниченных условиях. Хранение данных. Для микрокомпьютеров часто используется microSD- карта в качестве среды хранения данных. Если выделить причины, по которым все чаше применяют микрокомпью- теры для решения задач компьютерного зрения, то к ним относится: 1. Микрокомпьютеры часто более доступны с точки зрения цены по сравне- нию с более мощными ПК. Это особенно полезно, если необходимо создать мно- жество устройств или распределенную систему компьютерного зрения. 2. Микрокомпьютеры обычно компактнее и требуют меньше энергии, что делает их подходящими для встраиваемых или мобильных приложений. Напри- мер, они могут быть использованы в автономных роботах, умных камерах, дро- нах и других устройствах. 3. Микрокомпьютеры могут быть легко встроены в различные устройства и интегрированы с другими компонентами. Это позволяет создавать компактные и автономные системы компьютерного зрения для различных целей, таких как мониторинг, распознавание объектов, навигация и т. д. 4. Многие микрокомпьютеры предоставляют возможность настройки про- граммного обеспечения и аппаратной конфигурации под конкретные потребно- сти проекта. Это дает большую гибкость в разработке и настройке систем ком- пьютерного зрения.
Существует множество микрокомпьютеров, предназначенных для различ- ных целей и задач. Ниже приведен перечень некоторых известных микрокомпь- ютеров, упорядоченных от меньшей производительности к более мощным, с их основными техническими характеристиками: 7. Arduino Uno: • микроконтроллер: ATmega328P (ядро AVR 16 МГц); • оперативная память: 2 КБ SRAM: • входы-выходы: 14 цифровых, 6 аналоговых, USB; • производительность: 1 менее 0.001 GFLOPS; • применение: проекты электроники, В простые автоматизированные системы. " Не предназначен для обработки графических задач. Чаще применяют для обучения основам принципа систем автоматики. Не требуют глубокого знания ______электроники___________________________________________________________ 2. Raspberry Pi Zero*. • процессор: Broadcom ВСМ2835 (1 ядро, 1 П ц); • оперативная память: 512 МБ RAM; • входы-выходы: 1 х Мicro USB, GPIO 1 пины, Mini HDMI, lx MIPI; • производительность: - около 0.002 GFLOPS; Цф. • применение: проекты с ограниченными *" ресурсами и бюджетные задачи; V устройства автоматического управления ______и контроля____________________________________________________________ 3. Raspberry Pi 3 Model .4+: • процессор: Broadcom ВСМ2837 (4 ядра, 1,4 ГГц); • оперативная память: 512 МБ RAM; ± • входы-выходы: Ethernet, 1х HDMI, Л 4х USB, GP1O пины, lx MIPI; • производительность: . ЛрР около 0.1-0.2 GFLOPS; • применение: проекты средней сложности; мультимедийные центры; небольшие z _Jr серверы; системы, типа умный дом; очень ограниченные в производительности проекты на базе машинного зрения
4. Orange Pi One: • процессор: Allwinner H3 (4 ядра, 1,2 ГГц); ♦ оперативная память: 512 МБ RAM; • входы-выходы: Ethernet, HDMI. USB, GPIO пины; • производительность: около 0.2-0.3 GFLOPS; • применение: проекты интернета микросерверов; медиацентры; системы, ______типа умный дом________________________ 5. NanoPi М4: • процессор: Rockchip RK3399 (2 ядра Cortcx-A72, 4 ядра Cortex-A53) до 2.0 Г1 ц; • оперативная память: 4 ГБ LPDDR3 RAM; • входы-выходы: Ethernet, HDMI. 4х USB 3.0, GPIO пины, 2х MIPI; • производительность: около 0.4- 0.8 GFLOPS; • применение: проекты средней сложности; встраиваемые системы; мультимедийные центры; системы, типа умный дом ограниченные по производительности ___проекты компьютерного зрения 6. Raspberry Pi 4 Model В: • процессор: Broadcom ВСМ2711 (4 ядра. 1,5 ГГц. Arm Cortex-A72); • оперативная 11амять: 2,4 или 8 ГБ RAM; • входы-выходы: Ethernet, 2х HDMI, 2х USB 3.0, 2х USB 2.0. GPIO, 2х MIPI; • производительность: около 0.5-1 GFLOPS; • применение: мультимедийные центры, создание серверов для хранения данных и обмена ими; проект ы в области искусственного интеллекта, такие как разработка системы умного дома или автоматизированной аналитики данных; применение компьютерного зрения для создания систем видеонаблюдения или систем распознавания образов
7. NVIDIA Jetsoil Nano: • процессор: Quad-core ARM Cortex-A57 (1,43 ГГц) GPU: 128-core Maxwell GPU; • оперативная память: 4 ГБ RAM; • производительность: около 0.5-1 GFLOPS; • входы-выходы: Ethernet, HDMI, 4x USB 3.0, GPIO, 2x MIP1; • применение: мультимедийные центры, небольшие серверы; проекты в области искусственного интеллек т а и компью- терного зрения, обеспечивая высокую производительность и эффективность вычислений (с CUDA-процессором) 8. Raspberry Pi 5: • процессор: Broadcom ВСМ2712 (4 ядра, 2,4 ГГц, Arm Cortex-A76); • оперативная Память: 4 или 8 1 Б RAMx; • входы-выходы: Ethernet, 2х HDMI, 2х USB 3.0, 2х USB 2.0. GPIO, 2х MIP1, отдельный от GP1O интерфейс UAR Г; • производительность: около 0.8-1.8 GFLOPS; • применение: мультимедийные центры; небольшие серверы; проекты в области искусственного интеллекта, ______компьютерное зрение; робототехника 9. OdroidXU4: • процессор: Samsung Exynos 5422 (4 ядра Cortex-Al 5. 2 ГГц + 4 ядра Cortex-А7, 1,4 ГГц); • оперативная память: 2 ГБ RAM; • воды-выходы: Ethernet, HDMI, USB 3.0, GPIO пины; • производительность: около 1.4-2 GFLOPS; • применение: мультимедийные системы для потоковой передачи контента; небольшие серверы для храпения данных и выполнения вычислений; робототехника; проект ы автоматизации и управления системами в реальном времени
10. Orange Pi 5 • процессор: Rockchip RK3588S 8 ядер. (4x ядра Cortex-A76 2.4 I I ц, 4x ядра Cortex-A55 1,8 I Гц); • оперативная память: 8 ГБ LPDDR4 RAM: • входы-выходы: HDMI 2.0, USB 3.0, USB 2.0, Gigabit Ethernet, 2x USB 3.0, 2x USB 2.0, GPIO, 2x MIPI, отдельный от GPIO интерфейс UART; • upon зводительность: около 1 -2.2 GFLOPS в зависимости от нагрузки; • применение: мультимедийные центры с поддержкой 4К-видео, настройка небольших серверов для хранения данных и выполнения вычислений, реализация проектов в области искусственного интеллекта, компьютерного зрения ______и интернета вещей (1оТ)__________ II. NVIDIA Jetson Xavier NX: • процессор: 6-eore NVIDIA Carmel ARMv8.2 (6 ядер, 1,4 ГГц) GPU: 384-core Volta GPU, 48 Tensor Cores; • оперативная память: 8 ГБ RAM; • входы-выходы: HDMI, 4x USB 3.1, GPIO, 2xMIPI; • производительность: около 3 -4 GFLOPS; • применение: передовые проекты в области искусственного интеллекта и глубокого обучения, создавать автономные системы управления, реализовывать решения в области компьютерного зрения, а также развертывать высокопроизводительные мультимедийные центры и робототехнические платформы с вычислением в реальном масштабе времени (при условии включения CUDA-процессора) Хочется отдельно обратить внимание на семейство Je/scw и на его не совсем справедливое место в рейтинге, который приведен выше. Эти одноплатные ком-
пьютеры выделяются среди многих своим высокопроизводительным аппарат- ным обеспечением. Они оснащены мощными графическими процессорами, ко- торые обеспечивают быструю обработку данных, особенно в области машинного обучения и искусственного интеллекта. Jefson Nano оснащен графическим про- цессором NVIDIA Maxwell с архитектурой CUDA, который обладает 128 ядрами и способен обрабатывать параллельные вычисления с высокой эффективностью. Это делает его превосходным выбором для задач компьютерного зрения, обра- ботки видео и графики. Производительность этого микрокомпьютера составляет около 472 GFLOPS! А производительность NVIDIA Jetson Xavier NX с примене- нием графического процессора с 384 ядрами и вовсе достигает 21 TOPS. Работа с микрокомпьютером Jetson Nano в контексте компьютерного зрения будет рас- смотрена в главе 9 данного учебного пособия. В списке рейтинга представлены лишь несколько примеров на текущий пе- риод. При этом рынок микрокомпьютеров постоянно развивается, предоставляя различные опции для разработчиков, инженеров и ученых. При изучении компьютерного зрения нельзя обходить стороной видео- камеры. Ниже приведены наиболее распространенные камеры, применяемые в компьютерном зрении. USB-камеры (Universal Serial Bus): это камеры, подключаемые к компью- теру или другому устройству через интерфейс USB. Они могут использоваться для видеоконференций, потоковой передачи видео, фотографии и других целей. MIPI-камеры: эти камеры используют MIPI Alliance стандарты для передачи данных между камерой и процессором или другими устройствами. Они часто ис- пользуются в мобильных устройствах, таких как смартфоны и планшеты, а также в других приложениях, таких как автомобильные камеры и промышленные си- стемы видеонаблюдения. IP-камеры (Internet Protocol): эти камеры подключаются к сети, обычно к сети Интернет, и передают видео и аудио поток через IP-протоколы. Они широко используются для систем видеонаблюдения и безопасности, а также для удален- ного наблюдения и контроля. CCTV-камеры (Closed Circuit Television): это аналоговые или цифровые ка- меры, используемые в системах закрытого телевидения для видеонаблюдения. Тепловизионные камеры: они обнаруживают инфракрасное излучение, что позволяет видеть объекты и сцены в условиях низкой освещенности или темноте, а также обнаруживать тепловые аномалии. Акционные камеры: это компактные камеры, обычно с углом обзора шире, чем у обычных камер, предназначенные для съемки экстремальных условий, та- ких как спортивные мероприятия, вождение на автомобиле и др. ЗИ-камеры: они позволяют снимать изображения с глубиной, что полезно для трехмерной визуализации и анализа. Из всего перечня камеры отдельно хочется отмстить MIPI-камеры. MIPI-камеры (также известные как MIPI CS1-2 камеры) представляют собой вид камеры, которая использует Ml PI (Mobile Industry' Processor Interface) интер- фейс для передачи данных. MIPI CS1-2 (MIPI Camera Serial Interface 2) является
стандартным протоколом интерфейса камеры, разработанным MIPI Alliance для соединения камер и других устройств в мобильных и встраиваемых системах. Назначение MIPI-камеры: 1. Мобильная фотография и видеосъемка: широко используются в мобиль- ных устройствах, таких как смартфоны и планшеты, для захвата изобра- жений и видео высокого качества. 2. Встраиваемые системы: находят применение в различных встраиваемых системах, таких как медицинские устройства, автомобильные камеры, си- стемы безопасности и т. д. 3. Компьютерное зрение: используются в системах компьютерного зрения для распознавания объектов, навигации роботов, анализа изображений и других приложений. Интерфейс MIP1-камеры обычно включает в себя разъем для подключения к другому устройству, такому как процессор или контроллер обработки изобра- жений. Для передачи данных о изображении используется MIPI CS1-2 интер- фейс, который обеспечивает высокую скорость передачи данных и низкое энер- гопотребление. Пример MIPI-камеры, подключенной к микрокомпьютеру по интерфейсу CSI, приведен на рис. 1.1. Стоит заметить, что MIPI-камеры не универсальны: для каждого микроком- пьютера есть свой набор этих камер, подходящий для него. Поэтому прежде чем начать работу с микрокомпьютером и MIPI-камерой необходимо узнать совме- стимость этих устройств. Рисунок 1.1 - MIPI-камера подключенная к микрокомпьютеру Достоинства MIPI-камер включают в себя: I. Высокое качество изображения: Ml Pl-камеры обеспечивают высокое раз- решение и четкость изображения благодаря применению передовых оп- тических и датчиковых технологий.
2. Низкое энергопотребление: использование M1PI интерфейса позволяет снизить энергопотребление камеры, что особенно важно для мобильных устройст в. 3. Высокая скорость передачи данных: MIPI CSI-2 обеспечивает высокую скорость передачи данных, что позволяет захватывать видео высокого разрешения с высокой частотой кадров. 4. Низкая задержка: MIPI-камеры обеспечивают минимальную задержку при передаче изображений, что делает их идеальным выбором для прило- жений, требующих быстрой реакции, таких как системы безопасности и автомобильные камеры. В целом, MIPI-камеры являются важным компонентом в компьютерном зре- нии, обеспечивая высокое качество изображения, низкое энергопотребление и высокую производительность передачи данных. 1. 3. Библиотеки для работы с изображениями. OpenCV Библиотеки компьютерного зрения представляют собой программный ин- струментарий, обеспечивающий набор функций и алгоритмов для обработки и анализа изображений. Эти библиотеки предназначены для упрощения разра- ботки программ и приложений, связанных с компьютерным зрением, в том числе распознавание образов, обнаружение объектов, трекинг, сегментацию и другие задачи. В мире компьютерного зрения существует множество библиотек, предна- значенных для обработки, анализа и манипулирования изображениями. Каждая из них имеет свои особенности, предназначенные для различных задач. Вот не- которые из них. Библиотека Pillow, известный как PIL (Python Imaging Library), является библиотекой для обработки изображений, предоставляя инструменты для откры- тия, редактирования и сохранения различных форматов изображений. Основное использование Pillow - это базовая обработка изображений, такая как изменение размеров, обрезка, редактирование цветов и форматов (установка pip install pillow). Библиотека Seikit-image, построенная поверх библиотеки SciPy, предостав- ляющая инструменты для выполнения разнообразных операций с изображени- ями, таких как фильтрация, сегментация и измерение объектов. Scikit-image ча- сто используется в научных исследованиях и задачах обработки медицинских изображений (установка pip install scikit-image). Библиотека imageio предоставляет простой интерфейс для чтения и записи изображений в различных форматах. Она также обеспечивает интеграцию с ани- мацией и видео. Imageio удобна для обработки различных типов мультимедий- ных данных, и ее легко использовать в сочетании с другими библиотеками (уста- новка pip install scikit-image).
Библиотеки PyTorch и Tensor Flow, изначально разработанные для машин- ного обучения, также предоставляют функциональности для обработки изобра- жений. Они включают в себя модули для загрузки, преобразования и аугмента- ции изображений. PyTorch и TensorFlow позволяют интегрировать обработку изображений в пайплайн машинного обучения и глубокого обучения (установка pip install tensorflow и PyTorch: pip install torch). Библиотека Scipy для научных вычислений в Python, которая включает мо- дуль ndimage, предоставляющий функции для работы с изображениями, такие как фильтрация, сегментация и измерение объектов. Она часто используется в научных и инженерных исследованиях. Для установки необходимо выполнить команду pip install scipy. Кроме того, в мире компьютерного зрения широко распространены специа- лизированные библиотеки, такие как YOLO, предназначенные для обнаружения и классификации объектов на изображениях с использованием глубокого обуче- ния. Библиотека YOLO обеспечивает высокую скорость обработки изображений и точность распознавания объектов, что делает ее популярным выбором для ре- шения задач компьютерного зрения в реальном времени. Установка библиотеки YOLO может быть немного сложнее, чем установка обычной Python-библиотеки, потому что YOLO - это не просто библиотека Python, а целый алгоритм обнаружения обьектов, который может по требовать установки зависимостей и настройки перед использованием. Вам необходимо следовать инструкциям, предоставленным в главе 8 данного учебного пособия, чтобы установить его на вашей системе. Однако одной из самых популярных и широко используемых библиотек в области компьютерного зрения является OpenCV (Open Source Computer Vision). Она предоставляет множество функций для обработки изображений и видео, включая распознавание объектов, отслеживание движения, калибровку камер и многое другое. OpenCV широко используется в областях компьютерного зрения, машинною обучения и робототехники. Она поддерживает множество языков программирования, включая Python, C++, и Java. В данной книге мы сосредоточимся на работе с библиотекой OpenCV, рас- сматривая примеры и обучаясь с использованием модулей и функций именно этой библиотеки. OpenCV - это библиотека с открытым исходным кодом, специализирующа- яся на компьютерном зрении и обработке изображений. Она предоставляет об- ширный набор инструментов и алгоритмов, позволяющих разрабатывать прило- жения, связанные с распознаванием образов, анализом изображений, обработкой видео и другими задачами, связанными с визуальным восприятием. История создания OpenCV началась в 1999 году, когда Итсхак Гронер, из- раильский ученый, предложил создать открытую библиотеку для компьютер- ного зрения. В это время он работал в Интеллектуальной системе обработки ин- формации (IPL) в Университете Сан-Диего (UCSD). Позже, в 2000 году, Вадим
Писаревский, российский ученый, присоединился к проекту. Они объединили усилия и начали разрабатывать первую версию OpenCV. Основная цель проекта заключалась в создании инструмента, который по- может исследователям и инженерам в области компьютерного зрения легко рабо1ать с изображениями, выполнять различные операции обработки и анализа. Первая версия OpenCV была выпущена в 1999 году. С тех пор проект ак- тивно развивался благодаря усилиям множества разработчиков по всему миру. Он стал стандартом в области компьютерного зрения и используется в различ- ных областях, включая медицину, робототехнику, автоматизацию промышлен- ного производства, безопасность, анализ изображений и многое другое. GU OpenCV Рисунок 1.2 - Логотип OpenCV OpenCV стала популярной благодаря своей открытой лицензии (BSD) и под- держке множества языков программирования, таких как C++, Python, Java и дру- гих. Это позволяет использовать ее в различных проектах и на различных плат- формах. Для установки пакета OpenCV на персональный компьютер и в дальнейшем использовании его в программах на языке Python в командной строке введите pip install openev-python - эта команда установит основную версию OpenCV для Python. Стоит заметить, что выше описанная команда, устанавливает не все модули, предусмотренные текущей версии библиотеки. Например, позже мы можем столкнуться с тем, что для работы с трекерами в OpenCV отсутствует необходи- мый модуль. Для решения этой проблемы нужно установить полный пакет биб- лиотеки, введя команду pip install opencv-contrib-python. Здесь добавление contrib в название пакета обычно указывает на то, что это включает дополнитель- ные модули и функционал, который может быть полезен для различных прило- жений компьютерного зрения. Зачастую возникают проблемы с несовместимостью версий приложении или библиотек т. д. Проверка версии OpenCV - это просто способ убедиться, что у вас установлена нужная версия этой библиотеки для обработки изображений. Это полезно, потому что OpenCV часто обновляется, добавляя новые функции и улучшая старые. Проверка версии гарантирует, что вы используете актуальную версию с нужными возможностями. Также, разные версии могут иметь различия в функциях, и зная свою версию, вы сможете лучше использовать документацию и примеры. Важно также убедиться, что другие разработчики, возможно, ра-
ботающис с вашим кодом, используют совместимую версию OpenCV. Так что, проверка версии - это просто хорошая практика перед началом работы с OpenCV. После установки убедитесь, что OpenCV успешно установлена. Вы можете выполнить следующий код в вашей среде Python: import cv2 print(cv2. version ) Следует учесть еще одни важные рекомендации. Бывают случаи, когда вы подключаете какую-либо библиотеку, но обращаясь к функции, вы не получаете должного результата. Это связанно с тем, что в той версии библиотеки, не преду- смотрена функция или она имеет другое название. В этом случае рекомендуется проверить наличие интересующей функции следующим образом import cv2 print(cv2._version ) available trackers = //for fin dir(cv2) if'Tracker' inf/ printfavailable trackers) Здесь, в качестве примера, вы проверяете текущую версию OpenCV и ищете упоминание слова «Tracker». Таким образом программа выведет весь перечень трекеров, которые предусмотрены в библиотеке. Если в проекте планируется использовать видеопроцессор с поддерж- кой технологии CUDA, можно применить следующую строку кода: print(cv2.cuda.getCudaEnabledDeviceCount()). Эта команда полезна при работе с OpenCV и вычислениями на GPU. Если в результате выполнения команды, про- грамма возвращает 0, то нет активных видеопроцессоров с поддержкой CUDA. Это может быть связано с неудачной настройкой CUDA или отсутствием совме- стимого оборудования. В таком случае следует проверить наличие и коррект- ность установленных драйверов для видеокарты, а также совместимость исполь- зуем oii версии OpenCV с CUDA. Если программа возвращает 1 (или более), это означает, что у вас есть один (или несколько) активный видеопроцессор с поддержкой технологии CUDA. Это хороший знак, который указывает на то, что ваше оборудование и настройки пра- вильны. Вы можете продолжить использовать вычисления на GPU с помощью CUDA в вашем проекте, зная, что ваше оборудование готово к этому. Основные характеристики и возможности OpenCV: 1. Многозадачность: OpenCV поддерживает широкий спектр задач, начи- ная от базовых операций обработки изображений до более сложных, та- ких как распознавание объектов, отслеживание движения, сегментация и даже создание трехмерных моделей. 2. Поддержка различных языков: OpenCV написана на C++ и предостав- ляет интерфейсы для использования на других языках, включая Python, Java и MATLAB. Это делает библиотеку доступной для разработчиков с разным опытом и предпочтениями.
3. Широкий спектр платформ: OpenCV поддерживает множество операци- онных систем, включая Windows. Linux, MacOS, а также платформы мо- бильных устройств, что делает ее универсальной для различных прило- жений. 4. Поддержка графических процессоров (GPU): OpenCV может использо- вать вычислительные ресурсы графических процессоров для ускорения выполнения некоторых задач, что особенно важно при работе с боль- шими объемами данных. 5. Богатое сообщество и документация: OpenCV имеет активное сообще- ство разработчиков, что обеспечивает поддержку, обновления и обмен опытом. Документация OpenCV обширна и содержит множество приме- ров, что облегчает изучение библиотеки. В дальнейшем, в каждом практическом задании мы будем решать различ- ные задачи, связанные с компьютерным зрением, рассматривая различные функ- ции библиотеки OpenCV. По мере того, как мы будем двигаться от одной темы к другой, задания будут усложняться, вплоть до написания и анализа сложных программ на основе нейронных сетей с увязкой программы с внешними устрой- ствами и датчиками. ПРАКТИЧЕСКОЕ ЗАДАНИЕ Задание 1. Установите OpenCV и NuinPy. Задание 2. Проверьте версии библиотек и их совместимость. Задание 3. Выведите простые текстовое сообщения в терминал. Задание 4. Проверьте какие функции трекинга имеются в вашей текущей библиотеке. Используйте пример из раздела. Задание 5 . Проведите операции 1-3 на микрокомпьютере.
2. ИНТЕРАКТИВНОЕ УПРАВЛЕНИЕ В КОМПЬЮТЕРНОМ ЗРЕНИИ 2.1. Общие сведения об интерактивном управлении Интерактивное управление в компьютерном зрении представляет собой важный аспект в различных приложениях, основанных на анализе и обработке изображений. Оно позволяет пользователям взаимодействовать с данными изоб- ражениями, выполняя различные операции, анализ и принятие решений на ос- нове визуальной информации. Библиотека OpenCV. в этом контексте, предостав- ляет мощные инструменты для создания интерактивных приложений, работаю- щих с изображениями и видео. Интерактивное управление необходимо для улучшения пользовательского опыта и повышения эффективности работы с изображениями. Оно позволяет пользователю манипулировать и анализировать изображения в реальном вре- мени, что особенно полезно в таких областях, как компьютерное зрение, меди- цинская диагностика, видеонаблюдснис и многие другие. Основными элементами управления в приложениях компьютерного зрения на основе библиотеки OpenCV могут быть интерактивные окна и виджеты, слай- деры, кнопки, а также события клавиатуры и мыши. Использование этих элемен- тов позволяет пользователям настраивать параметры алгоритмов обработки изображений, выбирать области интереса, запускать и останавливать процессы анализа и многое другое. Особенностью интерактивного управления в контексте OpenCV является его гибкость и адаптивность. Пользователь может настраивать параметры обра- ботки в реальном времени, наблюдая за изменениями на экране. Это позволяет быстро оптимизировать работу алгоритмов под конкретные задачи и условия. Таким образом, интерактивное управление в компьютерном зрении с ис- пользованием библиотеки OpenCV является мощным инструментом для анализа и обработки изображений, позволяющим пользователям эффективно взаимодей- ствовать с визуальными данными и получать требуемые результаты. В библиотеке OpenCV используются различные элементы интерактивного управления для работы с изображениями и видео. К ним относятся интерактив- ные окна, слайдеры, кнопки, а также различные события клавиатуры и мыши. Интерактивные окна и виджеты позволяют отображать изображения и ви- део на экране компьютера, а также взаимодействовать с ними, например, изме- нять их размер, перемещать, масштабировать и т. д. Слайдеры используются для настройки параметров обработки изображений, таких как яркость, контрастность, пороговые значения и другие. Пользователь может перетаскивать ползунки слайдеров, чтобы изменять эти параметры и сразу же наблюдать результаты.
Кнопки предоставляют возможность запускать определенные действия или алгоритмы обработки изображений по нажатию кнопки. Например, кнопка «Применить фильтр» может запускать процесс применения выбранного пользо- вателем фильтра к изображению. События клавиатуры и мышки позволяют пользователю управлять прило- жением с помощью этих устройств. Например, пользователь может использовать стрелочные клавиши для перемещения по изображению или щелчок мыши для выделения областей интереса. Далее мы рассмотрим функции библиотеки OpenCV, коюрые реализуют интерактивное управление. 2.2. Интерактивные окна и виджеты Интерактивные окна и виджеты в библиотеке OpenCV представляют собой графические элементы пользовательского интерфейса (рис. 2.1), которые позво- ляют отображать изображения и видео на экране компьютера и взаимодейство- вать с ними. Рисунок 2.1 - Элемент интерфейса - окно В OpenCV для работы с интерактивными окнами и виджетами использу- ются следующие функции: cv2.unshow() - эта функция используется для отображения изображения в окне. Она принимает два параметра: имя окна и само изображение для отобра- жения. Функция позволяет отобразить несколько окон с разными изображени- ями. Практически в каждой рассмотренной далее программе мы будем приме- нять эту функцию. cv2.namedWindowQ- функция для создания окна. С помощью этой функции можно создать окно с определенным именем, в котором будет отображаться изображение. Это позволяет легко управлять и изменять параметры окна, т акие как его размеры и возможность масштабирования. cv2.moveWindowQ - функция, которая используется для перемещения окна с указанным именем, и закреплением его в указанных координатах.
cv2.waitKey() - функция ожидания нажатия кнопки. Данная функция ожи- дает нажатия клавиши пользователем. Она принимает время ожидания в милли- секундах в качестве параметра. Если время ожидания равно 0, функция ожидает нажатия клавиши бесконечно. Эта функция обычно используется вместе с cv2.imshow() для корректного отображения изображения в окне. Заметим, что данная функция позволяет «мягко» завершить нашу программу. cv2.destroyWindow() и cv2.destroyAllWuidows() - функции используются для закрытия определенного окна или всех окон, созданных с помощью OpenCV со- ответственно. Без этой функции также не обойдется ни одна рассмотренная нами программа. Более детальная информация всех описанных функций и их аргументов представлена в Приложении книги. Рассмо трим простой программный код, который демонстрирует работу всех четырех рассмотренных функций. # Подключение библиотеки OpenCV import cv2 # Загрузка изображения imagel = cv2.imread('catl.jpg ) image2 = cv2.imread(’cat2. ' ’) # Создание окна cv2 . namedwindow (’С : ’) cv2.namedwindow( ) # Отображение изображения cv2 . imshow (’ С wl ’ , imagel) cv2.imshow('Okm > ’, image2) cv2 .movewindow (' )knol’,0,0) cv2.moveWindow( Okr ’,300,0) # Ожидание нажатия клавиши для закрытия окон cv2.waitKey(0) # Закрытие всех окон cv2.destroyAllWindows( Результат работы этой программы представлен на рис. 2.2. Рисунок 2.2 - Результат работы программы функционирования интерактивных окон
В приведенной программе производится считывание двух изображений catl.jpg и cat2.jpg посредством функции cv2.imread(). После чего создаются два окна 'ОкпоГ и 'Окпо2', в которых размещаются изображения catl.jpg и cat2.jpg. Это реализуется с помощью функций cv2.namedWindow() и cv2.imshow(). Правый верхний угол каждого окна размещен в координатах (0;0) для окна 'ОкпоГ и (300;0) для 'Окпо2\ что позволяет точно позиционировать изображения в пространстве экрана. Функция cv2. waitKey(O) бесконечно ожидает нажатие лю- бой кнопки клавиатуры, прежде чем завершит программу и закроет окна. 2.3. Слайдеры Слайдеры в программировании представляют собой элементы интерфейса, которые позволяют пользователю выбирать значения из определенного диапа- зона, перемещая ползунок (рис. 2.3). В OpenCV слайдеры часто используются для настройки параметров обработки изображений в реальном времени, что поз- воляет пользователям мгновенно видеть изменения и подбирать оптимальные значения. Рисунок 2.3 - Элемент управления - слайдер Для работы со слайдерами в OpenCV используются следующие функции: cv2.createTrackbar () - эта функция создает слайдер на указанном окне. Она принимает несколько параметров, таких как имя слайдера, имя окна, где он будет расположен, минимальное и максимальное значения, а также функцию обрат- ного вызова, которая будет вызываться при изменении положения слайдера. cv2.getTrackbarPos() - эта функция возвращает текущее положение пол- зунка слайдера. Она принимает имя слайдера и имя окна, в котором он располо- жен. Ниже представлен простой пример программы применения слайдера. В этом примере создается окно с названием «Окно Slider» и слайдер с названием «Slider», который может принимать значения от 0 до 100. При изменении поло- жения слайдера вызывается функция updatecoeff, которая выводит текущее зна- чение коэффициента (coefficient} в терминал. import cv2 # Вывод коэффициента при изменении положения слайдера def update coeff(coefficient): print(«Текущее значение коэффициента:», coefficient) # Создание окна cv2.namedWindow(’Okno Slider') # Создание слайдера cv2 . createTrackbar (1 S i.ider ’ , ' Okno SI i ler 1 ,0,100, update_coef f)
# Получение значения ползунка coefficient = cv2.getTrackbarPos('SIi i’, *0-mo Slider") # Вызов функции обратного вызова update_coeff(coefficient) # Ожидания команды на закрытия программы cv2.waitKey(0) # Закрытие всех окон cv2.destroyAllWindows() Результат выполнения данной программы представлен на рис. 2.4. □ (И Кс»индн1я строкt • python ttud.py Текущее текущее 1екуцее Tvkysvv Текущее Текущее Текущее Текущее Текущее Текущее (екущее Юкущсс Текущее Текущее Текущее значение значение значение значение эничение значение значение значение значение значение Значение значение знамение значение значение значение значение коэффициента коэффициента коэффициента коэффмциентл коэффициент коэффициента коэффициент коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента 8 12 14 18 19 21 22 23 24 25 26 27 28 29 38 31 30 • Oknc Slider О X Slider: 3(i X Рисунок 2.4 - Результат работы программы функционирования слайдера Как видно на рисунке, перемещение ползунка слайдера влево или вправо, его текущее положения будет выводиться в терминал. Данный коэффициент мо- жет быть использован в дальнейшем для изменения яркости изображения, пере- мещения каких-либо графических объектов в окне и настройки других парамет- ров программы. Болес детальная информация рассмотренных функций! для работы с эле- ментом слайдер cv2.createTrackbar() и cv2.getTrackbarPos() представлена в При- ложении данной книги. 2.4. События мыши События мыши играют важную роль в создании интерактивных приложе- ний, в том числе и в области компьютерного зрения с использованием библио- теки OpenCV. Эти события позволяют взаимодействовать с npoiраммой и управ- лять ей. События мыши дают возможность пользователю взаимодействовать с изоб- ражением или объектами на экране. К событиям мыши относятся: клики мышью, перемещения и нажатия/отжатия кнопки мыши. События мыши могут быть ис- пользованы для выделения областей интереса на изображении, рисования, управления курсором и других действий. Например, события мыши часто
используются для выбора точек на изображении, обозначения объектов или кон- туров, а также для создания интерактивных элементов пользовательского интер- фейса. В общем, события мыши, как и события клавиатуры (cv2.waitKey(0)), позво- ляют создавать более удобные и интерактивные приложения, которые лучше со- ответствуют потребностям пользователей. В контексте компьютерного зрения они помогают пользователю легко взаимодействовать с изображениями, про- сматривать результаты обработки и принимать решения на основе визуальной информации. В OpenCV для обработки событий мыши используются функция: cv2.setMouseCallback(). Подробная структура данной функции рассмотрена в Приложении к книге. Эта функция устанавливает функцию обратного вызова для обработки со- бытий мыши в указанном окне. Она принимает имя окна и функцию обратного вызова в качестве параметров. Функция обратного вызова получает информацию о событии мыши, такую как тип события (например, нажатие кнопки или пере- мещение мыши), координаты точки нажатия и т. д. Функция обратного вызова должна быть определена пользователем и принимать определенные аргументы в зависимости от типа события. Рассмотрим пример применения функции cv2.setMouseCallback() в про- 1 раммс. Эта проз рамма позволяет отслеживать и выводить в терминал информа- цию о событиях мыши в окне с изображением, например, нажатия кнопок мыши или перемещения курсора. import cv2 # Функция отслеживания событий мыши def onMouse(event, х, у, flags, param): if event == cv2.EVENT_LBUTTONDOWN: print(f’Нажатие левой кнопки мыши ({х}, {у})’) elif event == cv2.EVENT_RBUTTONDOWN: print(f'Нажатие правой кнопки мыши <{х}, {у})’) elif event == cv2.EVENT_MOUSEMOVE: print( ' Перемещение мыши ({x}, у} ’) # Создание окна cv2.namedwindow(’ma s’) # Установка функции обратного вызова cv2.setMouseCallback(’£m ' r onMouse) # Ожидание нажатия клавиши для завершения программы cv2.waitKey(0) cv2.destroyAllwindows() В программе функция onMouse является функцией обратного вызова, кото- рая будет вызываться при каждом событии мыши в окне с изображением. Она принимает несколько параметров, включая тип события, координаты (х, у) точки, в которой произошло событие, а также дополнительные флаги и параметры.
В этой программе функция onMouse используется для отслеживания следу- ющих событий мыши: cv2.EVENT LBUTTONDOWN - нажатие левой кнопки мыши. При возник- новении этого события программа выводит сообщение о координатах точки, в которой произошло нажатие левой кнопки мыши. cv2.EVENT RBUTTONDOWN - нажатие правой кнопки мыши. При воз- никновении этого события программа выводит сообщение о координатах точки, в которой произошло нажатие правой кнопки мыши. cv2.EVENT_MOUSEMOVE - перемещение мыши. При каждом перемеще- нии мыши программа выводит сообщение о текущих координатах курсора. Стоит заметить, кроме этих событий данная функция поддерживает сле- дующие события мыши: отпущена левая кнопка мыши, отпущена правая кнопка мыши, нажата и отпущена средняя кнопка мыши (если она есть), прокрутка колеса мыши вперед и назад, горизонтальная прокрутка колеса мыши (если поддерживается), нажата клавиша Shift, нажата клавиша Ctrl, нажата кла- виша Ait. Полный синтаксис этих событий представлен в Приложении данной книги. После определения функции обратного вызова onMouse, программа создает окно с именем «Image» с помощью cv2. namedWindow!), а затем устанавливает эту функцию обратного вызова для обработки событий мыши с помощью cv2.setMouseCallback(). Наконец, программа ожидает нажатия клавиши, чтобы завершить свою ра- боту, с помощью cv2.wailKey(0), и после завершения закрывает все окна с помо- щью cv2. destroy А II Windows!), ПРАКТИЧЕСКОЕ ЗАДАНИЕ Задание /. Создайте окно с помощью cv2,namedWindow!) и загрузите изоб- ражение. Задайте функцию обратного вызова с помощью cv2.setMouseCallback!), которая будет реагировать на события мыши, например, передавать в терминал текущие координаты мыши. Задание 2. Создайте шесть окон с различными именами и разметите их упо- рядоченно по экрану путем указания их положения в программе. Задание 3. Создайте окно с изображением, которое размещено в координа- тах (0,0). Организуйте автоматическое перемещение окна в любом направлении. Задание 4. Создайте окно с помощью cv2, namedWindow!) и загрузите изоб- ражение. Создайте три ползунка с помощью cv2.createTrackbar!) для регули- ровки переменных. Выведите значения переменных в удобном формате в терми- нал.
3. ОСНОВЫ ИЗОБРАЖЕНИИ И ВИДЕО 3.1. Представление изображений в OpenCV Компьютерное зрение, как отрасль искусственного интеллекта, стремится смоделировать и понять способности человеческого зрения с использованием вычислительных методов. В этом контексте изображения и видео играют ключе- вую роль, предоставляя информацию для анализа и обработки. В рамках данной гемы мы рассмотрим особенности изображений и видео, выделяя их отличитель- ные черты и значения в области компьютерного зрения. Изображения представляют собой двумерные матрицы пикселей, где каж- дый пиксель содержит информацию о цвете или оттенке. Основными характери- стиками изображений являются разрешение (количество пикселей), формат (например, JPEG, PNG) и цветовая гамма. Понимание структуры изображений важно для разработки алгоритмов обработки изображений в компьютерном зре- нии. К наиболее распространенным форматам изображений относятся: JPEG (Joint Photographic Experts Group) - сжатый формат, эффективно ис- пользуемый для фотографий. Имеет хороший баланс между качеством изобра- жения и размером файла. Однако могут возникнуть артефакты при сильном сжа- тии. PNG (Portable Network Graphics) - без потерь формат, поддерживающий прозрачность и высокое качество изображений. В нем отсутствуют потеря каче- ства, поддержка альфа-канала для прозрачности. К недостаткам можно отнести файлы большого размера. BMP (Bitmap) - простой формат, хранящий изображение как набор пиксе- лей без сжатия. Простой, отсутствуют потери качества при сохранении. Однако файлы могут быть крупными без сжатия. TIFF (Tagged Image File Format) - формат с поддержкой многих парамет- ров, также может поддерживать без потерь. Кроме этого, может поддерживать много различных типов данных, включая без потерь. Однако имеет больший раз- мер файлов, чем у JPEG. GIF (Graphics Interchange Format) - формат с ограниченным цветовым пространс твом и поддержкой анимации. Несмотря на то, что формат поддержи- вает анимации, простые изображения с небольшим количеством цветов, он имеет ограниченное цветовое пространство, поэтому не подходит для фотогра- фий. RAW- необработанный формат, хранящий данные о пикселях без какой- либо обработки. Предоставляет максимальную информацию о изображении, не подвергается сжатию. Имеет больший размер файлов и требует дополнительной обработки. Что касательно цветового пространства изображений, то это объемная тема, заслуживающая детального рассмотрения и о ней мы поговорим в отдельном 32
разделе. Единственное отмстим, что цветовое пространство, это некоторая об- ласть представления цветов, в которой отображается графическая информа- ция. Также это можно понимать, как способ представления цветов на изобра- жении. Видео представляют собой последовательность изображений, называемых кадрами, которые образуют движущуюся картину. Каждый кадр сохраняет те же основные характеристики, что и статическое изображение, но также включает информацию о времени (кадры в секунду) и звуке в аудиодорожке. Понимание последовательности кадров позволяет системам компьютерного зрения эффек- тивно обрабатывать динамичные сцены. К основным параметрам видео относятся разрешение, частота кадров, фор- мат видео, битрейт. Разрешение (Resolution). Как и в статических изображениях, разрешение ви- део определяется количеством пикселей в каждом кадре. Высокое разрешение обеспечивает более четкое изображение, за счет высокой детализации, но при этом увеличивается объем данных. Частота кадров (Frame Rate). Част ота кадров измеряет количество кадров, отображаемых в секунду. Обычные стандарты частоты кадров включают 24, 30 или 60 кадров в секунду. Большая частота кадров обеспечивает более плав- ное воспроизведение движения, по также требует больше вычислительных ресурсов. Формат видео (Video Format). Формат видео определяет, как данные видео сохраняются и передаются. Распространенные форматы включают MPEG-4, AVI. MKV и другие. Каждый формат имеет свои особенности, включая степень сжатия, поддерживаемые кодеки и качество воспроизведения. Битрейт (Bitrate). Битрейт измеряет количество данных, передаваемых в секунду. Высокий битрейт обеспечивает лучшее качество изображения, но также требует больше пропускной способности для передачи. Аудиодорожка (Audio Track). В большинстве видео присутствует аудио- дорожка, добавляющая звуковую информацию к видео. Это может быть важным элементом в контексте анализа и понимания содержания. Но в компьютерном зрении аудиодорожка зачастую не имеет важного значения и ее в этом контексте не рассматривают. Длительность (Duration). Длительность видео измеряется в секундах, ми- нутах или часах и представляет собой общую продолжительность воспроизведе- ния. 3.2. Загрузка, отображение и сохранение изображений Любая программа, ориентированная на обработку статических изображений видеоматериала, обязательно содержит в себе операции считывания и отображе- ния видеоданных. Давайте начнем изучения алгоритмов компьютерного зрения именно с этого.
Основной список инструментов, который мы будем использовать, предоста- вит нам библиотека OpenCV. Итак. Ваш базовый программный код может выглядеть вот так import cv2 # Загрузка изображения image = cv2 . imread (' n n .. p-i ’) # Отображение изображения cv2.imshow(' ic j image) # Ожидание нажатия клавиши для закрытия окон cv2.waitKey(0) # Закрытие всех окон cv2 .destroyAHWindows () Под словом «базовый» понимается минимальный набор строк в программе, который решает вопросы компьютерного зрения. Например, открытие графиче- ского материала и его отображение. То есть, очередное написание новой про- граммы в компьютерном зрении целесообразно начинать именно с такой заго- товки. Давайте разберем этот код построчно: image = cv2.imreadCkartinka.jpg'): эта строка загружает изображение с име- нем ’kartinka.jpg’ из текущего рабочего каталога и сохраняет его в перемен- ной image. Функция imread() возвращает изображение в формате, который можно использовать в коде. Вместо 'kartinka.jpg' при необходимости нужно указать адрес, где находится файл вашего изображения. В данном случае изображения 'kartinka.jpg' находится в одной папке с исходным кодом про- граммы. cv2.imshow ('Image', image): эта строка отображает изображение в окне с за- головком 'Image'. Функция imshow принимает два параметра: заголовок окна и само изображение. cv2.wait Key (0): Эта строка ожидает нажатия любой клавиши. Параметр 0 означает, что программа будет ждать, пока не будет нажата клавиша. Если ука- зать вместо 0. например, 10, то программа закроет окно, не дождавшись нажатия клавиши. Таким образом число в скобках определяет задержку времени в мил- лисекундах, прежде чем программа завершится. cv2.destroy All Windows!): Эта строка закрывает все открытые окна. Функция destroy AU Windows используется для освобождения ресурсов, занятых откры- тыми окнами. Теперь, если нам по каким-либо причинам (например, после обработки материала) необходимо сохранить изображения, применим функцию cv2.imwrНеобработанное изображение]pg', image). Обратим внимание, что, сохраняя новый файл, мы можем присвоить ему любое название и любой адрес хранения.
import cv2 # Загрузка изображения image = cv2.imread( artinta-jp j’) # Отображение изображения cv2.imshow(' mage', image) # Ожидание нажатия клавиши для закрытия окон cv2.waitKey(0) # Сохранение обработанного изображения cv2.imwrite('kartinka.jpg', image) # Закрытие всех окон cv2.destroyAllwindows() Этот программный код открывает файл с изображением 'kartinka.jpg', затем после нажатия кнопки создает файл с таким же содержанием, присвоив ему имя 'kartinka2.jpg' и сохранив его в том же каталоге. 3.3. Захват видео с камеры и из файла Поскольку видео файл отличается от статического изображения лишь тем, что видеофайл - это множество статических изображений, которые называются кадрами, то программа отображения построена по принципу циклического отоб- ражения картинок (кадров). Этого мы добьемся при помощи организации цикла. В данном случае будем применять цикл While. import cv2 # Захватываем видео cap = cv2.VideoCapture(’video.mp4’) while True: # Читаем кадр с видеофайла ret, frame = cap.read() # Отображаем кадр на экране cv2.imshow('videol’, frame) # Ждем 1 миллисекунду и проверяем, была ли нажата клавиша *q' if cv2.waitKey(1) & OxFF == ord(’ ’): break # Освобождаем ресурсы после завершения работы cap.release() # Закрываем все окна cv2.destгoyAllWindows() import cv2: спрока импортирует библиотеку OpenCV. cap - cv2. VideoCapturefvideorec tmp.mp4'): создается объект cap, представ- ляющий видеопоток из файла 'videorec_tmp. mp4'. while True:: начало бесконечного цикла для отображения видеокадров. За- мети, что вместо True, мы можем указать любое не нулевое и положительное
число. Но хорошим тоном при написании на языке Python считается вот такое представление. ret. frame = cap.readff. чтение следующего кадра из видеонотока. Переменная ret указывает успешно ли было прочитано изображение, г frame содержит сам кадр. При необходимости переменную ret, мы можем использовать для проверки статуса считывания кадра: True - успешное считывание, False - неудачное считывание. cv2.imshow(,Video,) frame): создание окна и отображение текущего кадра в окне с заголовком 'Video’. if cv2.waitKey(l) & OxFF == ord('q)’.: проверка на нажатие клавиши 'q*. Если клавиша 'q' была нажата, то программа выходит из цикла. Заметим, что клави- ша остановки программы может быть любой, например, ’w', ’h’, *’2' и т. д. Зна- чение de OxFF используется для маскирования. Поскольку возвращаемое значе- ние cv2.waitKey() может быть больше 255 (обычно это 32-битное значение), при- менение операции побитового «И» с OxFF (255 в десятичной системе) позволяет оставить только младший байт, что соответствует коду нажатой клавиши. cap.releaseQ: освобождение ресурсов видеопотока после завершения работы. cv2.desrroyAHWindows(): закрытие всех окон после завершения работы про- граммы. Как известно, источником видеоматериала может быть либо файл, который был сохранен на диске, либо камера. Для того, чтобы использовать в качестве источника подготовленный видеофайл, в скобках функции cv2.VideoCapture() указываем адрес к материалу cap = cv2 AldeoCapturefD:\papka\video.avi). Если необходимо использовать материал с видеокамеры, то в строке с функцией cv2. VideoCapture() вместо адреса, по которому хранится видеофайл, необходимо указать порядковый номер камеры cap = cv2. VideoCapture(O). Если камера в системе одна, то порядковый номер равен 0, вторая камера имеет идентифи- катор 1 и т. д. В таком случае программа, которая работает с видео полученном от веб- камеры, будет иметь вид import cv2 # Захватываем видеопоток с веб-камеры cap = cv2.VideoCapcure(0) while True: # Читаем кадр с камеры ret, frame = cap.read() # Отображаем кадр на экране cv2 . imshow (’WebCarr ’ , frame) # 0жидание 1 миллисекунду на проверку, нажатия клавиши ’q’ if cv2.waitKey(1) & OxFF == ord(’q’): break # Освобождаем ресурсы после завершения работы cap.release() # Закрываем все окна cv2.destгоyAllWindows()
Теперь, если необходимо произвести запись видеокадра с камеры или пере- записать его с видеофайла с другим именем. Для этого применим стандартную функцию out.write(). Параллельно с этим в этой программе мы рассмотрим синтаксис описания других параметров видеоматериала: расширения и частоту кадров. import cv2 # Захватываем видеопоток с веб-камеры cap = cv2.VideoCapture(0) # Создание объекта VideoWriter для сохранения видео fourcc = cv2.VideoWriter_fourcc(*' ) # Формат видеофайла out = cv2 .VideoWriter (v .^г», fourcc, 20.0, 640,480) while True: ret, frame = cap. read ()# Чтение кадра из видеопотока # Изменение размера кадра cv2.imshow(«; ieo1», frame) # Запись измененного кадра frame2 в видеофайл out. write(frame) # Выход из цикла при нажатии клавиши 'q’ if cv2.waitKey(1)& OxFF == ord(’q’): break # Освобождение ресурсов cap.release() # Освобождение видеопотока out.release () # Закрытие объекта для записи видео cv2.destroyAliWindows() # Закрытие всех окон OpenCV Рассмотрим каждую новую функцию OpenCV. которые представлены в про- грамме: out.write (frame): эта функция записывает текущий кадр в видеофайл. Зара- нее был создан объект VideoWriter с параметрами, указывающими формат видео (XV1D), частоту кадров (20.0), и размер кадра (640*4X0). out.releasef): эта функция освобождает ресурсы, занятые объектом VideoWriter. Также важно освобождать ресурсы после завершения записи видео. 3.4. Основные операции с изображениями 3.4.1. Изменение размера изображения Изменение размера изображения относится к процессу изменения физиче- ских размеров изображения. Этот процесс может включать увеличение или уменьшение размеров изображения в пикселях без изменения его содержания. Изменение размера изображения часто применяется для адаптации изобра- жения под определенные требования или ограничения, такие как размеры экрана, требования социальных сетей, или оптимизации для веб-страниц.
Предположим, у вас есть изображение размером 1000x800 пикселей, и вы хотите его уменьшить до 500x400 пикселей. При этом вы можете использовать программы для графического дизайна, такие как Adobe Photoshop или библио- теки в языке программирования Python, чтобы выполнить операцию изменения размера. В результате изображение будет сохранять свою форму, но физически уменьшится до новых размеров. В библиотеке OpenCV эти задачи решает функция cv2.resize() как для ста- тических изображений, так и для видео. Ниже приведен пример программы, в которой организовано считывание изображения kartinka.jpg и сохранение его с новым разрешением под именем kartinka nov.jpg. import cv2 # Загрузка изображения image_path = «kartinka.jpg» original_image = cv2.imread(image_path) # Новый размер (ширина, высота) new_size = (500, 400) # Изменение размера изображения resized_image = cv2.resize(original_image, newsize) # Сохранение измененного изображения cv2.imwrite(«kartiгкj nov. jpg», resized_image) cv2.resize(original image, new size) — это функция библиотеки OpenCV в Python, используемая для изменения размера изображений. Функция прини- мает три основных параметра: исходное изображение (в данном примере пере- менная original image), желаемый размер выходного изображения new _size и не- обязательный метод интерполяции. Для изменения размера кадра видео рассмотрим усложненный вариант про- граммы. Будем использовать видео с веб-камеры {cap = cv2. VideoCapture(O)). В про- грамме создаем два выходных окна (cv2. imshow): в окне с названием Video 1 отобразим видео с разрешением 1280x720, в окне с названием Video 2 отобразим видео с разрешением 640x480. После чего сохраним видео файл второго окна с именем video.avi. import cv2 # Открываем видеопоток с веб-камеры (номер 0) cap = cv2.VideoCapture(0) sizel = (1280, 720) # Размер для первого видеопотока size2 = (640, 480) # Размер для второго видеопотока # Создание объекта VideoWriter для сохранения измененного видео fourcc = cv2.VideoWriter_fourcc(*’XVID') # Формат видеофайла out = cv2.VideoWriter(«vLdec. » », fourcc, 20.0, size2)
# Чтение и изменение размера каждого кадра while True: ret, frame = cap.read ()# Чтение кадра из видеопотока # Изменение размера кадра resized_framel = cv2.resize(frame, sizel) resized_frame2 = cv2.resize(frame, size2) # Отображение кадра cv2.imshow(« i », resized_framel) cv2.imshow(«Video resized_frame2) # Запись измененного кадра frame2 в видеофайл out.write(res i zed_frame2) key= cv2.waitKey(1) if key == ord( ') : # Выход из цикла при нажатии клавиши * q* break # Освобождение ресурсов cap.release() # Освобождение видеопотока out.release() # Закрытие объекта для записи видео cv2 .destroyAHWindows () # Закрытие всех окон OpenCV fourcc = cv2. VideoWriterJburcc(*'XVID) - эта строка устанавливает кодек для видеофайла. В данном случае используется кодек XV1D. который является популярным кодеком для сжатия видео с потерей качества. Другие существую- щие кодеки можно подобрать из приложения в конце книги. out = cv2. VideoWriter(«video.avi», fourcc, 20.0, size2) - здесь создается объект Video Writer, который предназначен для записи видео в файл. Аргументы: «video.avi» - имя файла, в который будет записываться видео. fourcc - кодек для видеофайла. 20.0 - количество кадров в секунду (FPS) для видео. size2 - размер кадров видео. Таким образом, fourcc и out работают вместе для установки парамег ров за- писи видео, включая формат файла, кодек и другие параметры. Результат выполнения программы изменения размера видеокадра представ- лен на рис. 3.1. Рисунок 3.1 - Результат выполнения программы изменения размера видеокадра
Следует обратить внимание, что при несоблюдении пропорциональности в из- менении размера изображения его объекты могут исказиться (как на рис. 3.1), что в дальнейшем может повлиять на качество и стабильность их обработки. Поэтому следует обращать внимание на симметрию в преобразованном изображении. 3.42. Обрезка изображения Обрезка изображения - это процесс выделения и сохранения только опреде- ленной части изображения, игнорируя остальные области. Эта операция в компьютерном зрении для обработки изображений служит для фокусировки на интересующей области (обрезка позволяет извлечь изобра- жение только с теми элементами, которые представляют интерес) и для умень- шения размера данных (если нужна только часть изображения, обрезка помогает сократить размер файла и улучшить эффективность обработки). Принцип обрезки изображения при помощи функций библиотеки OpenCV заключается в следующем: 1. Загружается исходное изображение с помощью функции cv2.imread(); 2. Определяется область для обрезки crop box; 3. Производится обрезка области изображения: 4. Сохранение обрезанною изображения cv2.imx\rite(). Рассмотрим пример программы, в которой осуществляется обрезка задан- ной области. import cv2 # Загрузка изображения image_path = «kartinka.jpg» original_image = cv2.imread(image_path) # Определение области для обрезки (левый верхний угол, правый нижний угол) crop_box = (500, 100, 600, 250) # Обрезка изображения cropped_image - original_image[crop_box[1]:crop_box[3], crop_box[0]:crop_box[2]] # Сохранение обрезанного изображения cv2.imwrite(«obr ra -Of :obr izh nie. . ,», cropped_image) image _path = «kartinka.jpg» - задаст переменную image_path с путем к файлу изображения «kartinka.jpg». Напомним, это путь к файлу, который вы хотите обрезать. original image - cv2.imread( image_path) - считывает изображение с помо- щью функции cv2.imread() из указанного пути (image path} и сохраняет его в пе- ременной original image. box = (500, 100, 600, 250) - определяет переменную crop box, которая пред- ставляет собой кортеж с четырьмя значениями: (х/, yl, х2, у2). Эти значения представляют собой координаты левого верхнего угла (х/, у Г) и правого нижнего угла (х2, у2) области для обрезки. В данном случае обрезаемая область начина- ется с (500, 100) и заканчивается в (600, 250).
cropped image=original image[box[l]:box[3], box[0]:box[2]] - используя срезы массива Num Ру. извлекает из оригинального изображения {original image) только ту область, которая соответствует определенному crop box. Здесь [box[l]:box[3], box [0]: box [2]] указывает на выбор части изображения в диапа- зоне от у! %оу2 по вертикали и отх/ дох2 по горизонтали. cv2.imwrite(«obrezannoe izobrazhenie.jpg», cropped image) - сохраняет об- резанное изображение {cropped image) в файл «obrezannoe izobrazhenie.jpg» с помощью функции cv2.im\vrite(). Если сравнивать процедуру обрезки видеокадра, то можно сказать, что от- личий нет. За исключением того, что для статического изображения мы исполь- зуем однократную процедуру, а для видео применяем многократную процедуру обрезки для каждого кадра (единичного статического изображения) в цикле. import cv2 # Открываем видеопоток с веб-камеры (номер 0) cap = cv2.VideoCapture(0) # определяем квадрат обрезки box = (500, 100, 600, 250) # Чтение и изменение размера каждого кадра while True: ret, frame = cap.read()# Чтение кадра из видеопстока #Обрезка изображения cropped_fгame = frame[box[1]:box[3], box [0] :box[2]] # Отображение кадра cv2.imshow(«Video », frame) cv2. imshow (« dec .. », cropped_f rame) key= cv2.waitKey(1) if key == ord('q’) : # Выход из цикла при нажатии клавиши *q‘ break cap.release() # Освобождение видеопотока cv2.destroyAlIWindows() # Закрытие всех окон OpenCV Результат выполнения программы обрезки фрагмента видеокадра представ- лен на рис. 3.2. Рисунок 3.2 - Результат выполнения программы обрезки фрагмента видеокадра
3.4.3. Вращение изображения Вращение изображения представляет собой процесс изменения угла поло- жения изображения относительно его начальной ориентации. Эта процедура зачастую служит для коррекции ориентации (используется для коррекции угла наклона или перевернутости изображения) или для аугмен- тации данных (для обучения моделей машинного обучения). В библиотеке OpenCV для реализации процедуру вращения изображения применяют функцию cv2 ,getRotationMatrix2D(). Данная функция выполняет вра- щения изображения с заданным масштабом вокруг заданной точки. Ниже представлен пример программы вращения статического изображения. import cv2 # Загрузка изображения image_path = «kartinka.jpg» original_image = cv2.imread(imagejpath) # Угол вращения (в градусах) angle = 25 # Получение размеров изображения height, width = original_image.shape[:2] # Определение матрицы преобразования (вращение вокруг центра) rotation_matrix = cv2.getRotationMatrix2D((width / 2, height / 2), angle, 1) # Вращение изображения rotated_image = cv2.warpAffine(original_image, rotation_matrix, (width, height)) # Сохранение преобразованного изображения cv2.imwrite(«vraschennoe_izobrazhenie.jpg», rotated_image) import cv2 - импортируют библиотеки OpenCV (cv2). image path - «kartinka.jpg» - задает переменную image path с путем к файлу изображения «kartinka.jpg». original image = cv2.imread( image path) - считывает изображение с помо- щью функции cv2.imread() из указанного пути (imagepath} и сохраняет его в пе- ременной original image. angle = 25 - задает переменную angle со значением 25 i радусов, которое представляет угол вращения. rotation matrix = cv2.getRotationMatrix2D((width / 2, height / 2), angle, 1) — используется функция cv2.getRotationMatrix2D для определения матрицы преоб- разования, которая будет использоваться для вращения изображения. Параметры включаю! центр вращения (width / 2, height / 2), угол angle и масштабный коэф- фициент / (без изменения масштаба). rotated image = cv2.warp Affine (original image, rotation matrix, (width, height)) - используется функция cv2.warp Affine для вращения изображения с ис- пользованием определенной матрицы преобразования. Результат сохраняется в переменной rotated image.
cv2amwrite(«vraschennoe izobrazhenie.jpg», rotated image) - сохраняет вра- щенное изображение в файл «vraschennoe izobrazhenie.jpg» с использованием фун кци и cv2. imwritef). Теперь перенесем эти операции для обработки видеокадра в потоковом ви- део. Как и раньше отличие состоит в том, что операции преобразования будем проводить в цикле, для каждого кадра в видео. import cv2 # Открываем видеспоток с веб-камеры (номер 0) cap = cv2.VideoCapture(0) # Угол вращения (в градусах) angle = 25 # Чтение и изменение размера каждого кадра while True: ret, frame = cap. read ()# Чтение кадра из видеопотока # Получение размеров изображения height, width = frame.shape[:2] Определение матрицы преобразования (вращение вокруг центра) rotation_matrix = cv2.getRotationMatrix2D((width / 2, height / 2), angle, 1) # Вращение изображения rotated_frame = cv2.warpAffine(frame, rotation_matrix, (width, height)) # Отображение окна с видео с v2.imshow(« id' о », frame) cv2 . imshow (< Vj 1 . », rotated_f rame) key= cv2.waitKey(1) if key == ord(' '): #Выход из цикла при нажатии клавиши ’д’ break cap.release() # Освобождение видеопотока cv2.destroyAllWindows() # Закрытие всех окон OpenCV Результат выполнения программы вращения видеокадра, полученного с веб-камеры, представлен на рис. 3.3. • -ОХ, Q х Рисунок 3.3 - Результат выполнения программы вращения видеокадра
Обратим внимание на то, что при вращении изображения часть информации в углах теряется (рис. 3.3). Для того, чтобы избежать этого, зачастую прибегают к масштабированию, то есть уменьшению изображения до тех пор, пока целост- ность всех его углов при развороте не будет восстановлена. Масштабирования осуществляется путем изменения коэффициента scale функции cv2.getRotation- Matrix2D(). При этом изображение уменьшается, но сохраняет свою структуру. Более детальный обзор функции cv2.getRotationMatrix2D() представлен в Приложении данной книги. 3.4.4. Отражение изображения Отражение изображения представляет собой процесс изменения порядка пикселей изображения по горизонтали или вертикали, что приводит к созданию зеркального отражения. В первую очередь этот инструмент применяют для коррекции ориентации изображения, а также аугментация данных, которое помогает увеличить разно- образие тренировочного набора данных в нейросетях. В примере, который приведен ниже, применена функция cv2.flip0, которая позволяет отзеркалить изображения файла по вертикали или горизонтали. import cv2 # Загрузка изображения image path = «karta.nka. pg» original_image = cv2.imread(image_path) # Отражение по горизонтали flipped_horizontal = cv2.f1 ip(original_image, 1) # Отражение по вертикали flipped_vertical = cv2.flip(original_image, 0) # Отражение по обеим осям (горизонтально и вертикально) flipped_both = cv2 . flip (original_image, -1) # Сохранение отраженных изображений cv2.imwrite (« zobi ienie_l i .zont al. p p>, flipped hor izontal) cv2 . imwrite (« _zobr« zhenie_vert ica . • jj. g» , flipped_vertical) cv2.imwrite(« .zobraz. ien.ie_both.; pg», flipped_both) Здесь функция flipped horizontal — cv2.flip( original image, 1), flipped hori- zontal = cv2.flip(original image, 0), flipped horizontal = cv2 JI ip(original image,-1) демонстрируют различные варианты отражения изображения вокруг горизон- тальной и вертикальной осей: горизонтальное отражение, вертикальное отраже- ние, горизонтальное и вертикальное отражение. Применим этот принцип на видео. import cv2 # Открываем видеопоток с веб-камеры (номер 0) cap = cv2.VideoCapture(0)
# Чтение и изменение размера каждого кадра while True: ret, frame = cap. read () # Чтение кадра из видеопотока # Горизонтальное отражение кадра flippedframe = cv2.flip(frame, 1) # Отображение оригинального и отраженного кадра cv2 . imshow («01 iginal ' ео», frame) cv2.imshow(« ippe< Ti d< о», flipped^ frame) key = cv2.waitKey(1) if key = ord(‘ '): # Выход из цикла при нажатии клавиши ’q' break cap.release() # Освобождение видеопотока cv2 .destroyAHWindows () ff Закрытие всех окон OpenCV Результат выполнения программы вращения фрагмента видеокадра пред- ставлен на рис. 3.4. - □ X * >"*«««< 4» -ОХ Рисунок 3.4 - Результат выполнения программы отражения видеокадра по горизонтали Более детальный обзор функции cv2.flip() представлен в Приложении дан- ной книги. ПРАКТИЧЕСКОЕ ЗАДАНИЕ Задание 1. Напишите программу, которая захватывает видеоизображение с веб-камеры и выводит это изображение на 4 окна «Video 1», «Video2», «Video3», « Video 4». Задание 2. Напишите программу, которая захватывает видеоизображение с веб-камеры и выводит это изображение в 2 окна: окно с оригинальным изоб- ражением и окно измененным размером изображения.
Задание 3. Напишите программу, которая захватывает видеоизображение с веб-камеры и выводит это изображение в 2 окна: окно с оригинальным изобра- жением и окно с обрезанным фрагментом изображения. Измените коэффици- енты или переменные в функции OpenCV и наблюдайте изменения. Задание 4. Напишите про1рамму, которая захватывает видеоизображение с веб-камеры и выводит это изображение в 2 окна: окно с оригинальным изобра- жением и окно с изображением, повернутым на 32° по часовой стрелке. Изме- ните коэффициенты или переменные в функции OpenCV и наблюдайте измене- ния. Задание 5. Напишите программу, которая захватывает видеоизображение с веб-камеры и выводит это изображение в 3 окна: окно с оригинальным изобра- жением. окно с отраженным по вертикали изображением и окно с отраженным по горизонтали изображением. Измените коэффициенты или переменные в функции OpenCV и наблюдайте изменения. Задание 6. Напишите программу, в которой захват видео осуществляется посредством веб-камсры. На экран выводится четыре окна с разным отображе- нием видеоматериала: оригинальное, обрезанное в районе центра кадра, с вра- щением на 90 градусов и отображенное по вертикали/горизонтали. При этом раз- решение видео установите 1280х720. Задание 7. Напишите программу, в которой захват видео осуществляется посредством веб-камсры. Па экран выводится одно окно с изображением, кото- рое вращается вокруг центра изображения. Задание 8*. Напишите программу для микрокомпьютера, в которой захват видео осуществляется посредством двух MIPI-камер. Выведите их изображения в два окна. Задание 9*. Перенесите задачу задание 6 на платформу микрокомпьютера с использованием MIPI-камеры.
4. ЦВЕТОВЫЕ ПРОСТРАНСТВА И ФИЛЬТРАЦИЯ 4.1. Цвет и свет Цвет - это физическая и воспринимаемая характеристика света, обуслов- ленная частотой его волны. Для человеческого восприятия цвет обычно описы- вается гремя основными характеристиками: оттенок (какой именно цвет), насы- щенность (чистота или интенсивность цвета) и яркость (светимость или темнота цвета). Человеческий глаз представляет собой сложный орган, состоящий из не- скольких основных структур (рис. 4.I). Внешняя часть глаза - роговица - играет роль защитного слоя и помогает преломлять свет. За роговицей располагается радужка с зрачком, которые контролируют количество попадающего в глаз света. Позади радужки находится хрусталик, который меняет свою форму для фокусировки света на сетчатке. Сетчатка является одной из самых важных частей глаза для восприятия цвета. Она содержит миллионы фоторецепторных клеток, включая колбочки и палочки. Колбочки делятся на три типа: реагирующие на красный, зеленый и синий цвета. Эти колбочки формируют основу для восприятия цвета, так как они генерируют электрические сигналы в ответ на световые стимулы. Рисунок 4.1 - Структура человеческого глаза Количество колбочек каждого типа может немного варьироваться у разных людей, но обычно примерно одинаковое количество. Однако, в среднем, пример- ное соотношение колбочек к цветам в человеческом глазу составляет: • колбочки, чувствительные к красному (длинноволновые): около 64 %; • колбочки, чувствительные к зеленому (средневолновые): около 32 %; • колбочки, чувствительные к синему (коротковолновые): около 2-6 %. Длинноволновые колбочки, чувствительные к красному цвету, составляют около 64 %. Это означает, что глаз обладает большей чувствительностью к крас- ному cncKipy и способен более точно различать оттенки этого цвета.
Средневолновые колбочки, чувствительные к зеленому цвету, составляют около 32 %. Зеленый цвет также будет хорошо восприниматься и отличаться бла- годаря этому процентному соотношению. Коротковолновые колбочки, чувствительные к синему цвету, составляют всего 2-6 %. Это означает, что глаз может быть менее чувствительным к синему цвету, и восприятие этого цвета может быть менее насыщенным или точным по сравнению с красным и зеленым. Такое разнообразие в процентном соотношении колбочек позволяет глазу лучше адаптироваться к различным условиям освещения и окружающей среды, а также обеспечивает более широкий спектр восприятия цвета. Кстати, здесь можно найти объяснение, почему запрещающий сигнал светофора имеет красное показание. Когда свет попадает на сетчатку, колбочки определенного типа активиру- ются, в зависимости от спектра цветов. Например, когда свет содержит красный цвет, активируются колбочки, специализирующиеся на этом цвете. Таким обра- зом, трехкомпонентная теория цвета объясняет, что восприятие цвета возникает за счет комбинации сигналов от трех типов колбочек. Электрические сигналы, созданные колбочками, передаются в мозг через зри- тельный нерв, где они анализируются и интерпретируются. Мозг обрабатывает эту информацию и формирует представление о цвете объектов, которые мы видим. Различные цвета воспринимаются глазом благодаря разнообразию спек- трального состава света. Свет, или электромагнитные волны, имеют раз- ные длины волн, и каждая длина волны соответствует определенному цвету (рис. 4.2). Например, в видимом диапазоне, короткие длины волн соответствуют синему и фиолетовому цветам, средние - зеленому и желтому, а длинные волны - оранжевому и красному. Цвета могут быть отражены, поглощены или преломлены объектами в окру- жающей среде. Когда свет падает на поверхность объекта, он может отразиться от нее и попасть в наш глаз, где затем его воспринимают колбочки. Таким обра- зом, мы видим цвет объекта в зависимости от того, какие длины волн света отра- жаются от него и доходят до наших глаз. 10 ЫЫРА 10* I ИАнОМГТРЛ ifrYi нАнСА«Г«а 1 UM 1 MFTP 1 КМПОМГТР Рисунок 4.2 - Спектр света
Некоторые цвета могут не попадать в наш глаз или восприниматься менее ярко из-за различных факторов, таких как спектральный состав освещения, аб- сорбция света объектом или физиологические особенности глаза. Например, но- чью. когда освещение ограничено, некоторые цвета могут быть менее видимыми из-за недостатка определенных длин волн в свете, который мы видим. Также не- которые объекты могут поглощать определенные цвета, что делает их менее яр- кими или изменяет их внешний вид. Как было отмечено выше, не все цвета могут быть одинаково хорошо вос- приняты человеческим глазом из-за oi раничений в спектральной чувствительно- сти колбочек. Например, ночное видение основано преимущественно на работе палочек, которые более чувствительны к синему и зеленому спектру, поэтому в темноте цвета могут быть менее яркими и отличимыми. Кроме того, некоторые животные, такие как пчелы или некоторые виды рыб, могут видеть цвета, которые для человека невидимы, так как их глаза содержат другие виды фоторецепторных клеток или обладают большей чувствительно- стью к определенным длинам волн света. Таким образом, хотя человеческий глаз способен воспринимать широкий диапазон цветов, его способность ограничена биологическими факторами и фи- зиологическими особенностями (рис. 4.3). Рисунок 4.3 - Фильтрация человеческого глаза В компьютерном представлении цвета используется система RGB (красный, зеленый, синий), которая аналогична способности человеческого глаза воспри- нимать цвета. Каждый пиксель на экране монитора состоит из трех основных цветов: красного, зеленого и синего. Каждый из этих цветов имеет свой собствен- ный канал, который может принимать значения от 0 до 255, обозначая таким об- разом яркость. 4.2, Пиксели и их представление Прежде чем продолжить рассматривать цветовые пространства, поговорим о компьютерном зрении, в котором изображение воспринимается как сложная сеть мельчайших строительных блоков, известных как пиксели. Пиксель, будучи наименьшим элементом изображения, траст ключевую роль в процессе обра- ботки графики, становясь основой всего визуального опыта (рис. 4.4).
Рисунок 4.4 - Увеличенный участок растрового изображения Пиксель (от англ, «picture element») - это минимальный элемент изобра- жения, обладающий определенной цветовой и яркостной характеристикой. Он является базовым строительным блоком для создания изображения. Совокупность пикселей образуют матрицу. Матрица пикселей математи- чески представляет собой простой набор чисел, расположенных в виде таблицы. В случае с изображением, каждое число в матрице представляет интенсивность или цвет соответствующего пикселя. Пример простой матрицы для черно-белого изображения размером 5*5: 255 0 255 255 56 О 255 0 66 255 255 0 255 38 255 255 0 37 255 255 255 0 255 255 255 Здесь каждое число представляет интенсивность (или яркость) пикселя. Значение 0 может означать черный цвет, а 255 - белый. Эти числа могут изме- няться для представления различных оттенков серого. Таким образом, представ- ленную матрицу 5*5 можно воспринимать как некоторое черно-белое изображе- ние (рис. 4.5) с разрешением 5 на 5, вместо привычного нам, например, 1280 на 720 или 2560 на 1440. Рисунок 4.5 - Изображения с разрешением 5x5
Когда мы говорим о том, что изображение представлено в виде матрицы пикселей, мы подразумеваем, что каждый элемент этой матрицы представляет цвет или интенсивность соответствующего пикселя на изображении. Весь про- цесс обработки изображений сводится к изменению значений в этой матрице, чтобы получить нужные эффекты, такие как изменение цветов, увеличение или уменьшение размера изображения и многое другое. Физически пиксель представляет собой мельчайший элемент на экране устройства, способный отображать свет. В грубом понимании этот элемент мо- жет быть представлен, например, светодиодом с возможностью включения в нем того или иного цвета из пространства RGB (рис. 4.6). Кстати, такие светодиоды образуют пространство пикселей в матрицах больших рекламных билбордов. ООО Рисунок 4.6 - Трехцветный светодиод RGB Если подвести электрическое напряжение на один из выводов такого эле- мента, это приводит к свечению кристалла того или иного цвета. Причем воз- можна одновременная подача напряжения на несколько выводов. В этом случае происходит смешение цветов и получение альтернативного оттенка. Уменьшен- ное напряжение снижает яркость, увеличенное усиливает яркость свечения вы- бранного цвета. Таким образом один такой элемент способен выдать любой от- тенок с любой яркостью. В отличие от билбордов, на экранах мониторов пиксель представляет со- бой физическую точку на поверхности дисплея, которая может быть подсвечена пли затемнена для создания определенного цвета. Пиксели объединяются в мат- рицу для формирования изображения. Физический пиксель монитора может быть представлен различными технологиями, такими как жидкокристаллические дисплеи (LCD), органические светодиоды (OLED) или другие аналогичные тех- нологии. Разрешение экрана определяется количеством пикселей вдоль горизон- тальных и вертикальных измерений, и чем выше разрешение, тем более детали- зированным может быть изображение. Разрешение изображения определяется количеством пикселей вдоль его ширины и высоты. Большее разрешение повышает точность, может содержать больше информации, но занимает больше вычислительных ресурсов. Вот неко- торые стандартные разрешения привычные для нас: низкое разрешение - 800x600 пикселей, среднее разрешение - 1920x1080 пикселей (также известно, как Full HD), высокое разрешение - 3840х2160 пикселей (известно, как 4К).
Для простоты понимания выше был представлен пример монохромной матрицы пикселей 5><5, где один пиксель определял тон всего одного цвета. Та- кое существует, но чаще для удобного восприятия и повышенной информатив- ности применяют пиксели, которые способны воссоздавать любой цвет из широ- кого цветового спектра. Существует множество способов представления цвета пикселем. Такие множества называют цветовыми пространствами. Одним из наиболее распространенных является RGB (красный!, зеленый, синий). В цвето- вом пространстве RGB каждый пиксель представляется комбинацией трех ос- новных цветов: красного, зеленого и синего. Каждый цвет может иметь интен- сивность от 0 до 255, и комбинация этих цветов создает полный спектр цветов (рис. 4.7). Матрица i...™» 3x3 пиксель ItfNtmi'INIBBIBIBIBHBBBBHhBBIBBBBhBBIB INJNUNM.RMBmillllllBIlBlDlllllllllllBIIIIIIIIIBB MiNinMHiiRiiiiiiiiiiimiiiimmmmmnmm i* Щ|Ц|ПВ11ПВВВВиВВВВНВВВВПВВВВВВ1) ।hi iRiNiNiNmiHiiiiiiinninininimiiimmiiniin im i мт» i minmm i mnimmii l* INININ i« * ininin iiniini i । nun iniiiiii i инти । iimmiiN nun iniinii шт в minm в«mm i mmm i iiiiihimi । ibibibib mmmmn м inimin M I IRININ innmirin 1111111)1111111111111 IIIBBII IIIHIIIINI iNiimmmninii niniui mmmii IBIHBBBBBIBB IIBBBB I BBIBBB ihibbbbibibibib) , mmmmn mm mm mm mm Чф -фффчф *ф*ф< <ф Рисунок 4.7 - Матрица ЖК-монитора Например, если пиксель имеет значение (255, 0, 0), это означает макси- мальную интенсивность красного цвета, а (0,255,0) представляет максимальную интенсивность зеленого. Таким образом матрица 3x3 в цветовом пространстве RGB будет иметь вид, показанный на рис. 4.7. Математическая запись этого фрагмента матрицы может иметь вид (255 255 255) (255 255 255) (255 255 255) (255 255 255) (255 255 255) (255 255 255) (255 255 255) ( 5 5 5 ) ( 5 5 5 ) На минуту задержитесь и подумайте о том. как сформирована эта запись. В черно-белом изображении каждый пиксель может быть только черным или белым. Здесь используется только один канал для представления яркости. С таким представлением яркости выступают бинарное изображение. Процесс бинаризации, или пороговой обработки, позволяет преобразовать цветное изоб- ражение в черно-белое, где пиксели с яркостью выше определенного порога счи- таются белыми, а ниже - черными.
Цветовая глубина определяет количество бит, используемых для пред- ставления цвета каждого пикселя. Например, цветовая глубина X бит позволяет использовать 256 различных цветов (28 = 256). В 24-битном цветовом простран- стве (RGB), каждый пиксель представлен X битами для красного, X битами для зеленого и X битами для синего, что обеспечивает богатую цветовую палитру. 4.3. Цветовые пространства На самом деле существует большое множество представления цветовых пространств. Ниже перечислены некоторые из наиболее распространенных: RGB (Red, Green, Blue) одно из самых широко используемых цветовых пространств в компьютерной графике и фотографии (рис. 4.8). Каждый цвет представлен комбинацией трех основных цветов: красного, зеленого и синего. Максимальные значения каждого цвета обычно равны 255. Прямой аналогией получения различных оттенков в этом цветовом про- С1ранстве является, например, смешивание масляных красок. Рисунок 4.8 - Модель цветового пространства RGB CMYK (Cyan, Magenta, Yellow, Key/Black) используется в печати и изобра- жении. Он основан на комбинации четырех основных цветов: голубого (cyan), пурпурного (magenta), желтого (yellow) и черного (key/black). Это цветовое про- странство позволяет точнее представлять цвета, которые можно воспроизвести на печатной машине. Рисунок 4.9 - Модель цветового пространства CMYK
HSV (Hue, Saturation, Value) представляет цвета с помощью трех компо- нентов: оттенок (hue), насыщенность (saturation) и значение (value) (рис. 4.10). Он предоставляет удобный способ управления цветом, особенно для графиче- ского дизайна. Рисунок 4.10 - Модель цветового пространства HSV Модель HSV стоит понимать следующим образом. По мере того, как вы перемещаетесь по окружности, вы пересекаете разные оттенки цветов от крас- ного до синего. Это и есть параметр hue. В отличии от ROB. здесь всего одно значение этою параметра определяет выбор цвета. Параметр насыщенность (saturation) стоит понимать так. Представьте, что вы взяли некоторый пигмент цвета и начали постепенно добавлять в него воду, то есть разбавлять. Таким образом вы перемещаетесь к центру нашего цилиндра. Если бы был возможен обратный процесс, тогда движение было противополож- ным к поверхности цилиндра, пока не достигните максимального уровня концен- трации цвета. Что касается третьего параметра value, то здесь снова пример с водой. Вот только вы погружаетесь в эту разбавленную краской водой все глубже и глубже, пока не достигните полной черноты. LAВ (CIELAB) - это цветовая модель, которая разработана для описания всего видимого спектра цветов. Она была разработана Международной комис- сией! по освещению (CIE) в 1976 году. Цветовое пространство LAB разделяет цвет на светлоту (L*) и две цветовые оси а* (зеленый-красный) и Ь* (синий-желтый) (рис. 4.11). Это пространство бо- лее пригодно для восприятия человеческим глазом и широко используется в при- ложениях, связанных с визуальным восприятием. LAB основано на принципах цветового восприятия человеческого глаза, что делает его более естественным для восприятия человеком. Он учитывает осо- бенности восприятия яркости, контраста и насыщенности, что делает его более соответствующим тому, как люди видят и воспринимают цвета.
I* l* Рисунок 4.11 - Модель цветового пространства LAB YUV (или YCbCr) - это цветовая модель, которая получила широкое при- менение в телевидении и видео-технологиях по ряду причин. Одно из ключевых преимуществ YUV заключается в том, что она представляет изображение в виде трех компонент: яркости (Y) и двух цветностей (U и V), что позволяет более эф- фективно кодировать и обрабатывать видеоданные. Её модель представлена на рис. 4.12. Рисунок 4.12 - Модель цветового пространства YUV Поскольку человеческий глаз более чувствителен к изменениям яркости, чем к изменениям цветности, раздельное представление этих компонент позво- ляет сосредоточиться на сохранении качества яркостной информации, что суще- ственно для восприятия изображения. Таким образом, YUV позволяет эффек- тивно сжимать видео, сохраняя при этом важные детали.
Более того, YUV совместима с различными типами оборудования, будь то аналоговые или цифровые системы. В аналоговых системах YUV может быть легко передано по аналоговым интерфейсам, а в цифровых - эффективно хра- ниться и передаваться с использованием различных форматов контейнеров и ко- деков. Еще одно преимущество YUVзаключается в простоте обработки и измене- ния данных. Благодаря разделению компонент, их можно обрабатывать незави- симо, что упрощает реализацию различных эффектов и фильтров в обработке видео. Кроме того, УUVучитывает особенности человеческого восприятия цвета, чго делает изображения более естественными и комфортными для просмотра. Цветовое пространство BGR (Blue, Green, Red) используется в компьютер- ной 1 рафике и обработке изображений. Оно представляет собой способ органи- зации цветовой информации, где каждый пиксель изображения определяется тремя компонентами: синим (Blue), зеленым (Green) и красным (Red). В цветовом пространстве BGR цвет каждого пикселя формируется комби- нацией грех основных цветов: синего, зеленого и красного. Каждая из этих ком- понент имеет свою интенсивность, которая определяет яркость данного цвета. Например, если все три компонента имеют максимальную интенсивность, то цвет будет белым, а если все три компонента имеют минимальную интенсив- ность, то цвет будет черным. BGR преимущественно используется в компьютерной графике и обработке изображений, особенно в программировании и разработке графических прило- жений. Это цветовое пространство часто встречается в работе с изображениями в формате BGR, который является одним из стандартных форматов хранения изображений в компьютерных системах. Он также широко применяется в биб- лиотеках и инструментах для обработки изображений, таких как OpenCV к языке программирования Python. Если сравнивать цветовое пространство BGR и цветовое пространство RGB, то очевидно, что они представляют собой два различных способа органи- зации цветовой информации. Основное отличие между ними заключается в по- рядке следования компонент цвета. В цветовом пространстве BGR компоненты упорядочены как синий, зеленый и красный, в то время как в цветовом простран- стве RGB порядок компонент обратный: красный, зеленый, синий. Эю различие в порядке компонент имеет значение при работе с изображе- ниями и обработке цвета. Например, при визуализации изображений в формате RGB, программное обеспечение, использующее эту модель, ожидает, что компо- ненты будут представлены в определенном порядке (RGB), и, если входные дан- ные будут представлены в формате BGR, это может привести к неправильному отображению цветов. Это лишь несколько примеров цветовых моделей, и существует много дру- гих пространств цветов, каждое из которых предназначено для определенных приложений и требований. Выбор цветового пространства зависит от конкрет- ной задачи и того, как будет использоваться изображение.
Важно отметит, что в OpenCV, как и во многих других библиотеках ком- пьютерного зрения, применяется порядок BGR вместо стандартного RGB. Этот выбор связан с историческими и техническими соображениями. Исторический фактор связан с тем, что в начальные периоды развития цветной фотографии и видеозаписи использовались 1ри отдельные пластинки для регистрации синего, зеленого и красного цветов соответственно. Первым снимался синий, затем зеленый, и, наконец, красный. В процессе развития тех- нологий, такой порядок цветов стал устойчивым и был унаследован в компью- терном зрении. Технический аспект заключается в том, что многие камеры и библиотеки обработки изображений в настоящее время продолжают использовать BGR, чтобы сохранять совместимость со старым программным обеспечением и фор- матами данных. В OpenCV BGR также используется но умолчанию при чтении изображений с помощью функций библиотеки. Важно помнить о порядке цветов (BGR), когда вы работаете с изображе- ниями в OpenCV, чтобы избежать недопонимания при обработке и отображении цветовых данных. 4.4. Операции над пикселями Когда стоит задача работать с отдельными пикселями, в первую очередь мы должны иметь доступ ко всей матрице. К примеру, если производится захват видео с веб-камеры cap = cv2. VideoCapture(O), а далее считывание первого кадра ret,frame=cap.read(f то нужно понимать, что переменная frame не что иное как матрица пикселей. Следовательно, если указать значения индексов в нашем кадре, например, frame [20,30], мы обратимся к пикселю, расположенному по ад- ресу (20;30). А если есть необходимость обратиться сразу к нескольким пиксе- лем, выделяем фрагмент матрицы frame[20:40,30:63]. И уже дальнейшие опера- ции можно проводить с прямоугольным фрагментом на кадре размером 20*33. Операции с пикселями представляют собой различные манипуляции, вы- полняемые над отдельными точками изображения. Эти операции важны в обла- сти компьютерного зрения и обработки изображений. К основным типам опера- ций с пикселями относятся: /. Извлечение значений пикселей: получение информации о цвете или ин- тенсивности пикселя. Например, для изображения в формате RGB. каж- дый пиксель представлен тройкой значений (R, G, В). 2. Изменение значений пикселей: прямое присвоение новых значений для изменения цвета или яркости пикселя. Это может использоваться для коррекции цветов, фильтрации и других манипуляций с изображением. 3. Арифметические операции: применение математических операций (сложение, вычитание, умножение, деление) к значениям пикселей. Это может быть полезно для регулировки контраста, яркости и других харак- теристик изображения.
4, Логические операции: использование логических операции (AND, OR, NOT) для создания масок или выделения определенных областей изоб- ражения. Например, бинаризация изображения путем установки порога. 5. Фильтрация*. применение различных фильтров к пикселям для размы- тия, усиления контраста, обнаружения краев и других эффектов. Напри- мер. применение фильтра 1 аусса или медианного фильтра. 6. Интерполяция: вычисление значений пикселей между существую- щими пикселями. Это используется при изменении размеров изображе- ния или повышении его разрешения. 7. Морфологические операции: применение операций эрозии, дилатации, открытия и закрытия для изменения формы и структуры объектов на изображении. 8. Цветовые преобразования: преобразование цветовых пространств, например, из RGB в оттенки серого (grayscale) или другие цветовые про- странства. Эти операции обеспечивают различные способы манипуляции изображе- ниями, позволяя анализировать, улучшать и адаптировать статические и видео- изображения под нужды конкретных задач в компьютерном зрении. Доступ к пикселям (извлечение) и их модификация в компьютерном зрении относится к процессу получения доступа к отдельным элементам изображения (пикселям) и изменения их значений. Это важная операция при обработке изоб- ражений, позволяющая анализировать и воздействовать на конкретные части изображения: включая фильтрацию, улучшение контрастности, выделение объ- ектов, а также для точной настройки и адаптации изображений в соответствии с конкретными требованиями задачи. Когда мы говорим о изображении как о матрице, представление пикселя в этой матрице можно рассматривать как элемент с определенными координа- тами. Предположим, у нас есть матрица изображения, где каждый элемент мат- рицы — это пиксель, и мы хотим получить значение пикселя в определенной по- зиции. Что для этого нужно сделать? Представьте изображение как двумерную матрицу. Каждый элемент мат- рицы содержит информацию о цвете соответствующего пикселя (рис. 4.13). На рисунке для простоты понимания приведен пример фрагмента изображения в оттенках серого цвета (один цветовой канал). Выберите позицию в матрице с помощью двух координат: х - горизонталь- ной (столбец) и у - вертикальной (строка). Эти координаты указывают, где нахо- дится пиксель в матрице. Значение пикселя в выбранной позиции определяется значением элемента матрицы в этой точке. Это значение может представлять собой информацию о цвете (например, интенсивность красного, зеленого и синего для цветных изоб- ражений) или яркость (для оттенков серою). Если нужно изменить изображение, мы можем изменить значение элемента матрицы в соответствующей позиции. Например, мы можем увеличить яркост ь, изменить цвет или выполнить другие операции обработки изображений.
Таким образом, доступ к пикселю из матрицы изображения просто озна- чает обращение к элементу матрицы, который представляет собой конкретный пиксель в изображении, и работу с его значением для выполнения нужных опе- раций. Рисунок 4.13 - Графический пример доступа к пикселю и его информации на изображении Ниже представлен пример программы работы с пикселями. В приведенном примере на языке Python с использованием библиотеки OpenCV, доступ к пик- селю осуществляется через индексы строки (у) и столбца (х) изображения. Пик- сель представлен в виде массива, где каждый элемент массива представляет со- бой значение цветовой компоненты (В, G, R) для изображений в формате BGR (Blue, Green, Red). import cv2 # Загрузка изображения image = cv2.imread(’kartinka. ) # Получение значения пикселя в координатах (у, х) у = 100 х = 150 pixel_value = image[у, х] # Вывод значения пикселя print(f’Новое значение пикселя в’ ’координатах ({х}, {у}): {image[у, х]}•> После запуска этот код выведет в терминал три значения цветовых компо- нент (В, G, R) для пикселя в указанных координатах (х, у) изображения 'kartinka.jpg'. Папомним, что индексы начинаются со значения 0, и порядок ком- понент может зависеть от используемого формата изображения (например, BGR или RGB).
Мы получили информацию о интересующем нас пикселе, давайте перей- дем к его модификации (изменению). Если есть необходимость заменить выбранный пиксель другим цветом, можно добавить строку image[y, х] = [О, 0, 250] и затем вывести изображение на экран, чтобы увидеть изменения. import cv2 # Загрузка изображения image = cv2.imread('kai inka. ipg’) # Получение значения пикселя в координатах (у, х) у = 100 х = 150 pixel_value = image[у, х] # Замена значения пикселя в матрице изображения image[y, х] = [0, 0, 250] # Вывод значения пикселя print(f’Новое значение пикселя в’ ’координатах ({х}, {у}): {image[у, х]}’) # Отображение измененного изображения сv2 . imshow (' Modi fie<• Lma.ie’, image) cv2.waitKey(0) cv2 . destroyAHWindows () Модификация пикселей в данном случае означает изменение значений цве- товых компонент пикселей с целью достижения определенных эффектов. Напри- мер. в предложенном примере ниже используется простая техника модификации, а именно инверсия цветов. Инверсия цветов заключается в том, что каждая цветовая компонента (красная, зеленая, синяя) каждого пикселя заменяется на её дополнение относи- тельно максимального значения. Например, если у нас есть пиксель с цветом (100, 150. 200), то после инверсии его значения станут (155, 105, 55), где 255 - это максимальное значение для каждой компоненты. Эта операция проста, но она дает наглядный эффект изменения цветов в изображении. В реальных приложениях модификация пикселей может включать в себя более сложные трансформации, такие как коррекция яркости, контрастно- сти. насыщенности, а также фильтрацию, размытие и другие методы обработки изображений в зависимост и от конкретной задачи. В данном примере изображение загружается, и для каждого пикселя происходит инверсия цветов. Это простой способ модификации пикселей, который может быть использован в более сложных алгоритмах обработки изоб- ражений.
import cv2 # Загрузка изображения image = cv2 . imread (' kart inka . pg ') # Получение размеров изображения height, width, channels = image.shape # Доступ к пикселю и модификация (инверсия цветов) for у in range(height): for x in range(width): pixel = image[y, x] inverted_pixel = 255 - pixel image[y, x] = inverted pixel # Отображение измененного изображения cv2 . imshow ('Mod i ! ;.ed Image’, image) cv2.waitKey(0) cv2 . destroyAHWindows () Отметим, что задачу модификации пикселей через инверсию цветов, кото- рая применяется ко всей матрице, можно и решить одной функцией cv2.bitwise not(). Данная функция выполняет побитовое отрицание для каждого пикселя изображения. Ее мы рассмотрим дальше. 4.5. Преобразование между цветовыми пространствами Преобразование между цветовыми пространствами в компьютерном зре- нии - это изменение представления цветов из одной системы в другую. Преобразование между цветовыми пространствами может быть необхо- димо по различным причинам, таким как адаптация изображений для особенно- стей восприятия человеческого глаза, улучшение сегментации объектов на изоб- ражении, а также совместимость с требованиями конкретных алгоритмов обра- ботки изображений. OpenCV предоставляет функцию cv2.cvtColor(), которая используется для преобразования цветового пространства изображения. Основным аргументом данной функции является код цветового пространства, который может выглядеть по-разному в зависимости от необходимости преобразования в то или ионное цветовое пространство. Вот некоторые примеры, которые применяются наибо- лее часто в компьютерном зрении; cv2.COLOR BGR2GRAY: преобразование из BGR в оттенки серого. cv2.COLOR BGR2RGB: преобразование из BGR в RGB. cv2.COLOR BGR2HSV: преобразование из BGR в HSV. cv2.COLOR BGR2LAB: преобразование из BGR в LAB. cv2.COLOR BGR2YUV: преобразование из BGR в YUV. cv2.COLOR BGR2HLS: преобразование из BGR в HLS. cv2.COLOR BGR2XYZ'. преобразование из BGR в XYZ.
cv2.COLOR BGR2LUV: преобразование из BGR в LUV. cv2.COLOR BGR2YCrCb: преобразование из BGR в YCrCb. cv2.COLOR BGR2HSV FULL’, полная версия преобразования из BGR в HSV. cv2.COLOR BGR2HLS FULL: полная версия преобразования из BGR в HLS. cv2.COLOR BGR2YUV 1420: преобразование из BGR в YUV 1420. cv2.COLOR BGR2YUV_ YV12: преобразование из BGR в YUV YV12. Заметим, что здесь дополнение FULL означает, что в отличие от стандарт- ного преобразования, которое иногда может урезать диапазоны или нормализо- вывагь значения компонентов, полная версия сохраняет все значения без изме- нений. Рассмотрим простую программу, в которой над исходным изображением kartinka.jpg происходит преобразование из BGR в оттенки серого. После чего изображение выводится на экран и сохраняется в файл с названием kartinka Gray.jpg. import cv2 # Загрузка изображения image — cv2.imread('kartinca. pg’) # Преобразование изображения BGR в пространство серого gr_image = cv2.cvtColor(imagef cv2.COLOR_BGR2GRAY) # Отображение изображения в новом цветовом пространстве cv2.imshow('Gray Image’, gr_image) # Сохранение изображения в новом цветовом пространстве cv2. imwrite (1kartinka_Gray. pg’,gr_image) # Ожидание нажатия клавиши для закрытия окон if cv2.waitKey(0) & OxFF == ord(’q’): cv2 . destroyAHWindows () Как и другие рассматриваемые функции библиотеки OpenCV, функция cv2.cvtColor 0 также работает для видеокадров. Рассмотрим iipoi раммный код ниже. import cv2 # Открываем видеопоток с веб-камеры (номер 0) cap - cv2.VideoCapture(0) # Чтение и изменение размера каждого кадра while True: ret, frame = cap. read ()# Чтение кадра из видеопотока # Преобразование изображения BGR в пространство серого gr_frame = cv2.cvtColor(frame, cv2.COLOR BGR2GRAY) hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lab_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB) cv2.imshow(«Or icinal», frame) cv2 . imshow («-Gray» , gr_frame) cv2.imshow(«HS\ », hsv_frame) cv2.imshow(«LAB», lab_frame)
key= cv2.waitKey(1) if key == ord(' '): # Выход из цикла при нажатии клавиши ’q' break cap.release() # Освобождение видеопотока cv2 . destroyAHWindows () я Закрытие всех окон OpenCV Данный код открывает видсопогок с веб-камеры (номер 0), считывает каж- дый кадр (framed преобразует его в различные цветовые пространства (с ориги- нального в оттенки серого (GRAY), HSV и LAB) с использованием функции cv2.cvtColor(), а затем отображает четыре окна: видео с оригинальным изображе- нием и его версиями в разных цветовых пространствах (рис. 4.14). Рисунок 4,14 - Результат выполнения программы преобразования цветового пространства в еидеопотоке Важно отметить несколько рекомендаций, на которые необходимо обра- тить внимание при преобразовании цветовых пространств: 1. Преобразования между некоторыми цветовыми пространствами могут привести к потере информации. Например, при переходе из цветового пространства RGB в оттенки серого (градации серого) теряется цветовая информация.
2. Выбор подходящего цветового проетранства зависит от конкретной за- дачи. Например, пространство HSV часто используется для работы с цветом, а пространство LAB может быть полезным для выделения объ- ектов на изображении. 3. Некоторые пространства цветов имеют ограниченны]'! диапазон значе- ний для каждого канала. При преобразовании может произойти обрезка значений, что может вызвать артефакты в изображении. 4. Иногда требуется нормализовать значения цветовых компонентов в со- ответствии с требованиями конкретного ал торизма или обработки. 5. При многократных преобразованиях между различными цветовыми пространствами может возникнуть накопление ошибок, что может ска- заться на точности и качестве изображения. 6. При преобразовании в различные цветовые пространства важно выби- рать правильные каналы, которые соответствуют конкретным потребно- стям задачи. 4.6. Цветовая коррекция Цветовая коррекция изображений - это процесс изменения цветовой палитры фото! рафии или видео с целью улучшения се визуального восприя- тия. Она позволяет скорректировать баланс цветов, насыщенность и яркость для достижения более естественного или желаемого визуального эффекта. 1 (ветовая коррекция необходима по нескольким причинам. Во-первых, фотоаппараты и камеры могут зафиксировать цвета не так. как мы видим их в реальной жизни. Во-вторых, различные источники освещения (дневной свет, лампы, вспышки) могут влиять на цветовую гамму снимка. Цветовая коррекция помогает привести цвета к более естественному виду или создать специфический эффект. Принцип цветовой коррекции основан на том, что цвета на изображении представлены комбинацией трех основных цветов: красного, зеленого и синего (RGB). Изменяя интенсивность каждого из этих цветов, мы можем воздейство- вать на окончательный цвет воспринимаемого изображения. Например, фотография сделана иод разными источниками света, и цвета выглядят нереально. Используя принципы цветовой коррекции, можно подо- гнать баланс цветов и сделать цветопередачу более естественной. Или, ваше фото кажется блеклым и не насыщенным. Увеличивая насыщенность, можно сделать цвета более яркими и насыщенными. Вот еще один пример. Вы используете изображение слишком темное или, наоборот, пересечённое. Благодаря коррекции яркости и контраста, вы можете подогнать общую яркость изображения. Также можно поступить с изображени- ями, тона которых или слишком холодные, или слишком теплые. Балансировка красного и синего цветов может исправить эту ггроблему. Рассмотрим простой пример, который демонстрирует увеличение насы- щенности в изображении с использованием цветового пространства HSV.
import cv2 # Захват видеопотока с камеры cap = cv2.VideoCapture(0) while True: # Считывание кадра из видеопотока ret, frame = cap.read() # Пример цветовой коррекции: увел/умен насыщенности framel = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # Уменьшаем насыщенность framel[:, : , 1] = framel[:, 1] * 0.3 # Возвращаемся в BGR framel = cv2.cvtColor(framel, cv2.COLOR_HSV2BGR) # Отображение оригинального кадра cv2.imshow('Ori-inal Frame’, frame) # Отображение измененного© кадра cv2.imshow(’Izmenen Frame’, framel) # Проверка на нажатие клавиши 'q' для выхода из цикла if cv2.waitKey(1) & OxFF == ord(’ f: break # Освобождение ресурсов cap.release() cv2.destroyAllWindows() Выражение framel [:, 1] = framel [:, / / * 0.3 относится к цветовой кор- рекции изображения, конкретно к изменению насыщенности. Это часть массиьъ. framel, который представляет собой изображение в цвето- вом пространстве IISV. В данном случае, [:, // выбирает все пиксели в изображе- нии, но только из второго канала, который отвечает за насыщенность цветов. frame[:,// * 0.3-значения пикселей в выбранном канале насыщенности умно- жаются на 0.3. Это уменьшает интенсивность цветов в этом канале. Соответственно, если этот коэффициент будет равен /,5, то насыщенность увеличится на 50 %. Если значение пикселя было, например, 100. после умножения оно станет 150. frame[:, 1] = ...- значения, которые мы получили после умножения, затем присваиваются обратно в исходный массив в гот же самый канал насыщенности. Таким образом, мы изменяем исходное изображение, уменьшая/увеличивая насыщенность второго канала. Результат выполнения такой программы представлен на рис. 4.15. • 'tyiii । - О X 9 -ОХ Рисунок 4.15 - Пример применения коррекции света 65
Давайте рассмотрим, что представляют собой различные цветовые каналы в пространстве цветов BGR и HSV, которые могут быть вами использованы. В цветовом пространстве BGR: Канал 0 (Blue): framelf,/9/содержит интенсивность синего цвета для каж- дого пикселя. Высокие значения в этом канале делают пиксели более синими. Канал 1 (Green): frame If, 1 / содержит интенсивность зеленого цвета для каждого пикселя. Зеленый цвет влияет на яркость и зеленоватость изображения. Канал 2 (Red): frame Ц:, 2] содержит интенсивность красного цвета для каждого пикселя. Высокие значения в этом канале делают пиксели более крас- ными. В цветовом пространстве HSV: Канал О Н (Hue) представляетотгенок цвета (0-360 градусов), т. е., к какому цвету принадлежит пиксель. Канал 1 S (Saturation) представляет насыщенность цвета (0-100 %), т. е., насколько цвет яркий. Канал 2 V (Value) представляет яркость (0-100 %), т. е., насколько светлым или темным является цвет. В данном случае цветовое пространство HSV обеспечивает интуитивно по- нятную манипуляцию цветом, позволяя проводить точную коррекцию цвета, сег- ментировать объекты и оставаться устойчивым к изменениям яркости. Отметим, что изменение значений в этих каналах позволяет манипулиро- вать цветовым балансом изображения и проводить цветокоррекцию. 4.7, Фильтрация цветов и цветовая сегментация Фильтрация цветов и цветовая сегментация являются важными этапами об- работки изображений в области компьютерного зрения. Эти техники позволяют выделять объекты и структуры на изображении, основываясь на их цветовых ха- рактеристиках. В данном разделе рассмотрим основные принципы фильтрации цветов и методы цветовой сегментации. Фильтрация цветов направлена на выделение или подавление определенных цветов на изображении. Это может быть полезным, когда интересующие нас объ- екты обладают характерными цветовыми свойствами. Фильтрация цветов и цветовая сегментация играют важную роль в различ- ных отраслях компьютерного зрения. В автотранспорте они используются для распознавания дорожных знаков и светофоров, что помогает автомобилям при- нимать решения на дороге. В медицине эти техники помогают анализировать ме- дицинские изображения, такие как рентгеновские снимки или снимки с меди- цинских сканеров, для выявления патологий и диагностики заболеваний. В же- лезнодорожной отрасли фильтрация цветов и цветовая cei ментация использу- ются для мониторинга и анализа состояния рельсов, детекции дефектов и обес- печения безопасности на железнодорожных путях. В беспилотной авиации эти методы помогают дронам анализировать окружающую среду, идентифициро- вать объекты на земле и принимать решения в реальном времени для безопасного
и эффективного выполнения задач. Вес эти примеры демонстрируют широкий спектр применения фильтрации цветов и цветовой сегментации в различных об- ластях. от управления транспортом до медицинских исследований и обеспечения безопасности. Наиболее распространенными методами фильтрации цветов являются: фильтрация по порогу и морфологические операции. Фильтрация по порогу (Thresholding). Этот метод заключается в установке порогового значения для каждого цветового канала. Пиксели, чьи значения цве- тов находятся выше порога, считаются интересующими, тогда как остальные по- давляются. Морфологические операции. Применение операций, таких как расширение и сужение, для выделения или уменьшения объектов на основе их цветовых характе- ристик. Это помогает улучшить контуры объектов и убрать нежелательные дезали. Ниже рассмотрен пример программы, которая выполняет выделение объек- тов зеленого цвета из видеопотока. Это достигается путем применения фу ик- ни й cv2.inRangeQ и cv2.bitwise_and(). import cv2 import numpy as np cap = cv2.VideoCapture(0) # Определение диапазона зеленого цвета в пространстве HSV lower_green = пр.array([40, 4С, 40]) upper_green = пр.array([0, 255, 255]) while True: ret, frame = cap. read ()# Чтение кадра из видеопотока #Преобразование кадра в пространство цветов HSV hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) #Маска для выделения объектов в заданном диапазоне цветов mask = cv2.inRange(hsv_frame, lcwer_green, upper_green) #Применение маски к оригинальному кадру result = cv2.bitwise_and(frame, frame, mask=mask) ^Отображение оригинального кадра cv2.imshow('Original', frame) ^Отображение обработанного кадра cv2.imshow('Green’, result) if cv2.waitKey(1) & OxFF ord(’q’): break cap.release() cv2.destroyAllWindows() cap = cv2. VideoCapture(O) - эта строка открывает видеопоток с веб-камеры (номер 0). lower green = np.array([40, 40, 40]), upper green = np.array([80, 255, 255]) эти строки задают диапазон зеленого цвета в пространстве HSV. Значения ниж- ней и верхней границ определены в массивах, созданных с помощью функ- ции пр.аггауО библиотеки NumPy (см. Приложение).
ret, frame - cap.readQ - эта строка считывает кадр из видеопотока, ret- флаг успешного считывания, frame - считанный кадр. hsvjrame - cv2. cvtColor (frame, cv2.COLOR BGR2HSV) - преобразует цве- товое пространство кадра из BGR в HSV. mask = cv2.inRange(hsvframe, lower green, upper green) - создает маску, в которой значения в пределах заданного диапазона остаются белыми, а вне диа- пазона становятся черными. result = cv2.bitwise and(frame, frame, mask-mask) - применяет маску к ори- гинальному кадру, выделяя только объекты зеленого цвета. В этой строке cv2. bitwise and выполняет побитовое «И» между двумя изоб- ражениями (frame и frame) с применением маски (mask). Дважды указанное изоб- ражение frame обозначает исходный кадр, который в конечном итоге будет ис- пользоваться для создания обработанного кадра result. Это сделано для того, чтобы сохранить цветовую информацию только там, где маска равна 1 (белый пиксель), и обнулить цвет в местах, где маска равна О (черный пиксель). Таким образом, cv2.bitwise andfframe, frame, mask=mask) при- меняет маску к оригинальному кадру, сохраняя только те пиксели, которые со- ответствуют зеленому цвету в оригинальном кадре. Когда мы указываем mask=mask, мы говорим функции, что маску для опе- рации «И» нужно брать из переменной mask. Это означает, что для каждого пик- селя в исходном изображении и изображении, с которым выполняется операция «И», применяется соответствующий пиксель из маски. Если значение пикселя в маске равно 1 (белый), то соответствующий пиксель из source 1 и source 2 сохра- няется в результате, иначе (если значение пикселя в маске равно 0 - черный), результат будет равен 0. Иными словами, mask-mask гарантирует, что маска, созданная ранее в коде (mask = cv2.inRange(hsv frame, lower green, upper green)), используется при вы- полнении побитового «И» с оригинальным кадром (frame). Это позволяет выде- лить только те области изображения, которые соответствуют заданному диапа- зону зеленого цвета. В данной программе ключевыми функциями является cv2.inRange() и cv2.bitwise and(). Более детально они описаны в Приложении в конце данной книги. Результат работы рассмотренной программы представлен на рис. 4.16 в двух вариантах: выделения зеленого и красного цветов на изображении. Если цветовая фильтрация направлена на выделение или подавление опре- деленных цветов на изображении, используя пороги или другие техники, то цве- товая сегментация разделяет изображение на различные цветовые области (ис- пользуя ту же цветовую фильтрацию), выделяя группы пикселей со схожими цветовыми характеристиками. Она помогает выделить объекты различных цве- тов на основе их цветовых свойств.
Рисунок 4.16 - Пример извлечения цветового признака Цветовая сегментация - это процесс разделения изображения на различ- ные цветовые области или сегменты. Этот метод позволяет выделять объекты различных цветов на изображении (рис. 4.17). Некоторые популярные методы цветовой сегментации включают: кластеризацию цветов и использование цвето- вых пространств. Рисунок 4.17 - Примеры применения сегментации а разных отраслях Фильтрация цветов и цветовая сегментация представляют собой важные инструменты в обработке изображений для компьютерного зрения. Их примене-
ние позволяет эффективно выделять объекты, основываясь на цветовых характе- ристиках, и является ключевым этапом в решении различных задач в сфере ком- пьютерного зрения. ПРАКТИЧЕСКОЕ ЗАДАНИЕ Задание /. Напишите программу, которая изменяет цвет пикселей в задан- ной прямоугольной области изображения на зеленый (RGB: 0, 255,0), используя прямой доступ к пикселям. Задание 2. Попробуйте понять, какой функционал заложен в программу. Затем повторите программу на компьютере, изменяя коэффициет ы. Сделайте вывод. import cv2 cap = cv2.VideoCapture(0) while True: x=200 y=200 ret tframe=cap.read () for x in range(400): for у in range(400): if frame[x,у,1]>200: frame[x,y]=(0,0,255) cv2.imshow(‘Video', frame) if cv2.waitKey(1) & OxFF == ord(’4’): break cap.release() cv2.destroyAllWindows() Задание 3. Напишите программу, которая преобразует изображение в от- тенки серого без использования встроенной функции преобразования цветового пространства, используя прямой доступ к пикселям изображения. Задание 4. Напишите программу для динамического смешения одного или нескольких пикселей в пространстве изображения. Задание 5. Напишите программу, которая загружает изображение и преоб- разует его из цветного в опенки серого с использованием функции cv2.cvtCalor(). Выведите два окна: оригинальное и измененное изображения. Задание 6. Создайте программу, которая за1ружает цветное изображение и преобразует его в изображение в формате HSV (оттенок, насыщенность, зна- чение) с использованием функции cv2.cvtColor(). Попробуйте изменить значения каналов в этой области и проанализировать их влияние. Выведите два окна: ори- гинальное и измененное изображения. Задание 7. Создайте программу, которая загружает цветное изображение и изменяет насыщенности в изображении с использованием цветового простран- ства HSV. Для управления насыщенностью используйте слайдер. Повторите эту операцию с другими каналами (создайте 3 слайдера).
Задание 8. Повторите программу из учебника (раздел о цветовой фильтра- ции) и задайте динамический искомый цвет посредством слайдера. Задание 9*. На платформе микрокомпьютера с использованием двух MI Pl- камер напишите код, который использует алгоритм цветовой фильтрации. Для изображения первой камеры используйте один цвет, для изображения с другой камеры используйте другой цвет. Напишите сравнительный отчет о работе на персональном компьютере и микрокомпьютере.
5. МЕТОДЫ ОБРАБОТКИ ИЗОБРАЖЕНИИ 5. 1. Инверсия изображения Инверсия изображения — это процесс изменения цветовых значений пик- селей изображения на противоположные. То есть, если изначально цвет пикселя был черным, после инверсии он станет белым, и наоборот. Процесс инвер- сии визуально приводит к тому, что темные области становятся светлыми, а свет- лые - темными. Инверсия часто используется для создания интересных визуальных эффек- тов и дизайнерских решений. Опа может придать изображению необычный вид и выделить определенные детали. В области медицинской диагностики инверсия изображений может быть использована для лучшего выделения и анализа определенных структур в меди- цинских изображениях, таких как рентгеновские снимки. Инверсия может быть применена в процессе редактирования фотографий для создания специфических эффектов или коррекции изображений. Как мы указывали выше, принцип инверсии основан на изменении цвето- вых значений каждого пикселя. Если изначально цвет задан в формате RGB (красный, зеленый, синий), то после инверсии значения каждого канала инвер- тируются. Например, если у пикселя было значение RGB (50. 100. 150), после инвер- сии оно станет (205, 155, 105). Если вы обратили внимание, то логика вычисле- ния инверсного изображения простая: значения выходного пикселя получаются путем вычитания исходного значения пикселя из 255. Примеры применения: ]. Фотофильтры: многие приложения для редактирования фотографий предлагают фильтры, включающие инверсию. Это может придать фото- графии необычный и запоминающийся вид. 2. Тематические дизайны: в веб-дизайне или создании постеров инверсия используется для создания тематических эффектов, подчеркивания определенных элементов и привлечения внимания к деталям. 3. Медицинская обработка изображений: в медицинской сфере инверсия может быть полезна для выделения конкретных областей ткани или структур в рамках диагностических процедур. 4. Термальное видение в автомобилях: инверсия может быть применена к изображениям с телевизионных камер. В автомобилях такие камеры ис- пользуются для обнаружения тепловых источников, таких как транс- портные средства или люди, особенно в условиях низкой видимости, например, в ночное время или в условиях тумана. Инверсия может по- мочь выделить и подчеркнуть тепловые образы, улучшая обнаружение объектов на дороге.
5. Обратное видсонаблюдсние: в системах видеонаблюдения на транспорт- ных средствах или на территории автостанций инверсия .может быть ис- пользована для лучшего выделения объектов и обнаружения необычных событий. Например, при обратном видеонаблюдении темные объекты, такие как пешеходы, могут быть более заметными на светлом фоне. 6. Аварийные ситуации: инверсия может быть применена к изображениям из камер наблюдения для выделения аварийных ситуаций или подозри- тельных обстоятельств. Это может помочь операторам транспортных си- стем быстрее реагировать на потенциально опасные ситуации. Как мы видим, инверсия изображения представляет собой важный инстру- мент в обработке и редактировании изображений, широко используемый в раз- личных областях, от дизайна до медицинской диагностики. Рассмотрим ее применение на примере для статического изображения и видеокадра, принятого с веб-камеры. В данном примере ключевой функцией для реализации инверсии является функция OpenCV cv2, bitwise not(). import cv2 # Чтение изображения img = cv2.imread('kartinka.jpg') # Инверсия цветов всех пикселей в кадре inverted img = cv2.bitwise not(img) # Отображение оригинального изображения cv2.imshow ('Original', img) # Отображение измененного изображения cv2.imshow('Modi ied’, inverted img) cv2.waitKey(0) # Освобождение ресурсов cap.release() cv2.destroyAllWindows() Ниже представлен пример, который демонстрирует применение инверсии для видсопогока. принятого с веб-камеры. import cv2 # Захват видеопотока с камеры) cap = cv2.VideoCapture(0) while True: # Считывание кадра из видеопотока ret, frame = cap.read() # Инверсия цветов всех пикселей в кадре inverted_frame = cv2.bitwise_not(frame) # Отображение оригинального кадра cv2.imshow(’Original Frame', frame) # Отображение измененного кадра cv2.imshow('Modi led Frame', inverted_frame)
# Проверка на нажатие клавиши ’q’ для выхода из цикла if cv2.waitKey(1) & OxFF == ord(’ break. # Освобождение ресурсов cap.release() cv2.destroyAllWindows() В данном примере функция cv2. bitwise not() имеет только один аргумент - имя изображения, который необходимо преобразовать. Более подробно с функ- цией можно ознакомиться в приложении. Результат выполнения такой программы представлен на рисунке 5.1. • •'*** -ОХ» Me4MFu>«« -ОХ Рисунок 5.1 - Результат программы «инверсия цвета» 5.2. Линейное объединение двух изображений Линейное объединение двух изображений - это процесс создания нового изображения путем комбинирования пикселей двух входных изображений с ис- пользованием линейной комбинации. Это позволяет контролировать яркость и конт раст обоих изображений, создавая таким образом новое изображение. Линейное объединение изображений полезно, когда необходимо сочетать информацию из двух изображений или корректировать яркость и контраст. Это может применяться для улучшения визуальной информации, а также в медицин- ских, научных и технических приложениях. В основе этого принципа лежит идея создания нового изображения на ос- нове взвешенной суммы интенсивностей соответствующих пикселей на исход- ных изображениях. Эти веса (коэффициенты) определяют влияние каждого изоб- ражения на конечный результат. Как правило, сумма коэффициентов равна еди- нице, что обеспечивает сохранение общей яркости в результате объединения. Таким образом, принцип линейного объединения изображений заключа- ется в том, чтобы создать новое изображение, объединяя информацию из не- скольких исходных изображений с использованием весовых коэффициентов, чтобы достичь желаемых визуальных эффектов.
Примеры применения: 1. Улучшение кон траста: линейное объединение может использоваться для улучшения кон траста изображения, особенно при слиянии изображен им с различными уровнями яркости. 2. Коррекция изображений: при наличии нескольких снимков с различ- ными экспозициями линейное объединение позволяет создать одно изображение с улучшенной яркостью и детализацией. 3. Медицинская диагностика: в медицинской сфере линейное объединение изображений может быть использовано для создания композитных изоб- ражений, объединяя информацию с различных типов оборудования (например, рентгеновских и СТ-изображений). 4. Транспорт и видеонаблюдение: в области транспорта линейное объединение может применяться для комбинирования изображений с различных источни- ков, таких как видеокамеры с разными уровнями освещенности, что позво- ляет получить более полную информацию об окружающей обстановке. Линейное объединение изображений предоставляет гибкий инструмент для управления контрастом и яркостью, что делает его полезным в различных областях, включая обработку изображений, медицину и транспорт. Применение на линейные объединения для статического изображе- ния или видеокадра, принятого с веб-камеры, осуществляется функцией cv2.addWeighted(). Ниже рассмотрен пример программы с применением этой функции и результат ее работы. import cv2 # Захват видеопотока с камеры) cap = cv2.VideoCapture(0) while True: # Считывание кадра из видеопотока ret, frame = cap.read() # отразим видеокадр по горизонтали framel = cv2.flip(frame, 1) # Инверсия цветов всех пикселей в кадре f rame2= cv2.addWeighted(frame, 0. , framel, 0. ,0) # Отображение оригинального кадра cv2 . imshow ('Or j ?ina '. Frame’, frame) # Отображение отраженного кадра cv2 . imshow ('Ori Hnal FlipFrame', framel) # Отображение модифицированного кадра cv2.imshow('Modified Frame’, frame2) # Проверка на нажатие клавиши 1q' для выхода из цикла if cv2.waitKey(1) & OxFF == ord(’q’): break # Освобождение ресурсов cap.release() cv2. destroyAHWindows ()
Функция cv2.addWeighted предназначена для создания взвешенной суммы двух изображений и имеет шесть аргументов, пять из которых обязательные. Более подробное описание функции смотри в Приложении. Рассмотрим влияния коэффициентов в строке программы frame3 = cv2.addWeighted(frame, 0.7, framel, 0.7, 0). В выражении коэффициенты 0.7,0.7, и 0 используются для линейного объ- единения (смешивания) двух изображений: frame (оригинальное изображение) и framel (отраженное изображение). Здесь функция отражения изображения рас- сматривается в качестве примера, отличного от исходного изображения. Оче- видно, вместо второго изображения может быть любое изображения с любого источника. IТсрвый коэффициент (alpha=0,7) для frame. Этот коэффициент изменяется в пределах от 0 до 1 и определяет вес оригинального изображения в итоговом смешанном изображении. Чем выше коэффициент, тем больше вклад оригиналь- ного изображения в конечный результат. Здесь 0.7 означает, что оригинальное изображение вносит больший вклад в смешанное изображение. Второй коэффициент (beta=0,7) для framel. Этот коэффициент изменяется в пределах от 0 до 1 и определяет вес отраженного изображения в итоговом сме- шанном изображении. Также, чем выше коэффициент, тем больше вклад отра- женного изображения в конечный результат. Здесь также 0.7, что означает, что oiраженное изображение вносит существенный вклад в смешанное изобра- жение. Коэффициент сдвига (gamma-О): Этот коэффициент может представ- ляться любым вещественным числом и представляет собой сдвиг яркости. Он добавляется к взвешенной сумме интенсивностей пикселей. В данном случае, по- скольку коэффициент равен 0, сдвига яркости не происходит. Результат выполнения такой программы представлен на рисунке 5.2. Рисунок 5.2 - Результат выполнения программы «линейное объединение двух изображений» Таким образом, в данном случае, результат (frame3) представляет собой линейное объединение оригинального и отраженного изображений с весами 0.7 и 0.7 соответственно. Это позволяет сохранять контраст и яркость обоих изобра- жений в конечном результате, приводя к комбинированному изображению, где оба входных изображения вносят свой вклад.
5.3. Вычисления абсолютной разницы изображений Когда мы говорим о работе с изображениями в компьютерном зрении, мы часто сталкиваемся с необходимостью сравнивать два изображения или вычис- лять разницу между ними. Это может быть полезно, например, при обнаружении движения, отслеживании изменений в видеопотоке или просто для анализа изоб- ражений. Одним из способов сравнения изображений является вычисление абсолют- ной разности между ними. Абсолютная разность между двумя значениями - это просто разница между ними без учета знака. В контексте изображений каждый пиксель представлен числовым значением, которое обычно находится в диапазоне от 0 до 255 для изображений в формате 8-битных целых чисел (для черно-белых изображений) или от 0 до 1 для изображений в формате чисел с плавающей запятой (для изображений в оттенках серого или цветных изобра- жен nil). Таким образом, когда мы вычисляем абсолютную разность между двумя изображениями, мы вычисляем разницу между соответствующими пикселями каждого изображения. Например, если у нас есть два пикселя со значениями 100 и 150, то абсолютная разность между ними будет 50. Мы делаем это для каж- дой пары пикселей из двух изображений. В библиотеке OpenCV для реализации абсолютной разности двух изобра- жений применяется функция cv2.absdiff(). Она принимает два изображения в ка- честве входных данных и возвращает новое изображение, в котором каждый пик- сель представляет абсолютную разницу между соответствующими пикселями входных изображений. Представим, у нас есть два кадра видео, и мы хотим определить, где произошли изменения между ними. Мы можем использовать cv2.absdiff() для вычисления разницы между этими двумя кадрами. Результат будет изобра- жением, на котором выделены области, где значения пикселей отличаются между кадрами. Рассмотрим два примера. В первом примере функция cv2.absdiff() приме- нена к одинаковым изображениям, во втором примере на одном из изображений имеются небольшие изменения. Когда мы применяем cv2.absdiff() к двум одинаковым изображениям, ожи- дается, что алгоритм не найдет никаких различий между ними. Это происходит потому, что каждый пиксель в одном изображении имеет такое же значение, как и соответствующий пиксель в другом изображении. Когда мы вычисляем абсо- лютную разницу между ними, результатом для каждой пары пикселей будет ноль. Таким образом, в конечном итоге мы получим черное изображение без каких-либо выделенных областей, что говорит о том, что между изображениями нет различий.
В случае, когда у нас есть два похожих, но не совсем одинаковых изобра- жения, мы ожидаем, что cv2.absdiff0 выделит области, где произошли измене- ния. Например, если одно изображение было сдвинуто относительно другого на несколько пикселей, разница будет выявлена как яркая область па результате. Это происходит потому, что пиксели в смежных областях этих изображений бу- дут иметь разные значения после сдвига, и когда мы вычисляем абсолютную раз- ницу, эта разница будет не равна нулю. Таким образом, на выходе мы увидим выделенные области, которые указывают на места, где произошли изменения между изображениями. Рассмотрим простой пример программы import cv2 # Открываем видеопоток с веб-камеры (номер 0) cap = cv2.VideoCapture(0) # Чтение 1-ого кадра из видеопотока ret, framel = cap.readO while True: H Чтение последующих кадров из видеопотока ret, frame2 = cap.readO # Применение абсолютной разницы двух изображений diff — cv2.absdiff( framel,frame2) cv2 . imshow («Т кЛ IE 1», framel) cv2.imshow(« R.AME2», frame2) cv2 . imshow («DIF1’», diff) if cv2.waitKey(1) == ord(’q’): break cap.release() # Освобождение видеопотока cv2 . destroyAHWindows О # Закрытие всех окон OpenCV Эта программа использует библиотеку OpenCV для работы с видсопото- ком с веб-камеры. Она отображает текущий и предыдущий кадры из видеопо- тока, а также абсолютную разницу между ними. Основную функцию в программе выполняет строка diff = cv2.absdiff(frame 1. frame2f Эта строка кода используется для вычисления абсолютной разницы между двумя изображениями framel wframe2. Каждый пиксель в результирую- щем изображении diff представляет собой абсолютную разницу между соответ- ствующими пикселями в framel и frume2. Если значения пикселей в framel w frame2 одинаковы, то соответствующий пиксель в diff будет иметь значение 0. В этом случае результирующий кадр останется без изменений. Если значения пикселей отличаются, то значение соот ветствующего пикселя в diff будет равно абсолютной разнице между этими значениями. Это позволяет обнаруживать раз- личия и изменения между двумя изображениями. На кадре отобразятся места смещения в виде четких контуров. Результат выполнения рассмотренной программы представлен на рис. 5.3.
Рисунок 53 - Результат выполнения программы (нет смещения объектов) Как видно, смещения на обоих изображениях отсутствуют, что подтвер- ждает результат абсолютной разности двух изображений. В идеальных условиях третье изображение должно быть черным, но поскольку заметна разница в осве- щенности в кадрах, то эта разница все же фиксируется функцией cv2.absdiff(). На следующем рисунке (рис. 5.4) уже произошло небольшое смещение объекта. Рисунок 5.4 - Результат выполнения программы (смещение объекта) В результате этого на третьем изображении контуры цветка стали более заметны. Это говорит о том, что объект двигается. Причем, анализируя, можно точно установить направления смешения. 5.4. Преобразование изображения с использованием абсолютных значений и масштабирования Преобразование изображения с использованием абсолютных значении и масштабирован ня - это метод изменения яркост и и контраста на изображе- нии. Он позволяет более гибко управлять восприятием изображения, делая его ярче и контрастнее. Этот метод применяется для коррекции яркости и контраста на изобра- жении, что полезно, например, при улучшении визуальных характеристик фотографии или видео. Также он может использоваться для выделения опреде- ленных деталей и улучшения визуального восприятия сцен.
Принцип преобразования заключается в том, что каждый пиксель на изоб- ражении изменяется с учетом масштабного коэффициента и сдвига. Это позво- ляет контролировать, насколько сильно изменяются яркость и контраст на изоб- ражении. Примеры применения: 1. Коррекция визуальных параметров: преобразование используется для коррекции яркости и контраста, что делает изображение более привле- кательным и четким. 2. Улучшение сценариев на транспорте: в транспортной отрасли, такое преобразование может применяться для улучшения изображений, полу- чаемых с видеокамер транспортных средств, особенно в различных условиях освещенности. 3. Анализ изображений: в медицинской обработке изображений или при компьютерном зрении, преобразование может использоваться для под- черкивания важных деталей и улучшения общего качества изображения. Преобразование изображения с использованием абсолютных значений и масштабирования предоставляет удобный инструмент для подгонки визуальных характеристик изображений под конкретные потребности и требования. Применение метода абсолютного масштабирования и преобразования типа данных для каждого пикселя статического изображения или видеокадра, приня- того с веб-камеры, осуществляется функцией cv2.convertScaleAbs(). Данная функция библиотеки OpenCV выполняет абсолютное масштабиро- вание и преобразование типа данных для каждого пикселя изображения и со- стоит из четырех аргументов из них только первый является обязательным. По сути данная функций управляет яркостью изображения и не более. Рассмотрим пример программы с использованием этой функции. import cv2 # Захват видеопотока с камеры cap = cv2.VideoCapture(0) while True: # Считывание кадра из видеопотока ret, frame = cap.read() # Модификация изображения в кадре framel = cv2.convertScaleAbs(frame, 2.0, 10) # Отображение оригинального кадра cv2.imshow( )ri r F ame ’ , frame) # Отображение модифицированного кадра cv2.imshow(’ loditLed Frame', framel) # Проверка на нажатие клавиши 'q’ для выхода из цикла if cv2.waitKey(1) & OxFF == ord( q'): break # Освобождение ресурсов cap. release () cv2 . destroyAHWindows ()
Данная программу повышает яркость изображения, принятого с веб-камеры и выводит два окна с оригинальным и преобразованным видео. Результат работы описанной программы представлен на рисунке 5.5. Рисунок 5.5 - Результат выполнения программы с функцией преобразования изображения с использованием абсолютных значений и масштабирования Влияние коэффициентов в функции framel = cv2.convertScaleAbs(framet 2.0, 10) на результат программы. Первый коэффициент-масштабный коэффициент (alpha), Если значение больше 1.0 увеличит яркость изображения, делая его более светлым. Значение меньше 1.0 уменьшит яркость, делая изображение темнее. Если alpha равен 1.0, то яркость остается неизменной. В данном примере alpha =2. Второй коэффициент сдвига (beta). Положительные значения данного ко- эффициента увеличат общую яркость изображения. Отрицательные значения уменьшат общую яркость изображения. Сдвиг не влияет на контраст, а только на яркость. В примере выше beta -2. Более подробный обзор функции cv2.convertScaleAbs() рассмотрен в При- ложении данной книги. 5.5. Бинаризация и пороговая обработка Бинаризация - это техника обработки изображений, при которой каждый пиксель изображения преобразуется в белый или черный на основе заданного порога. Пороговая обработка используется для преобразования изображения в бинарное (двухцветное) изображение. Бинаризация полезна при выделении объектов или областей интереса на изображении, а также при упрощении дальнейшего анализа изображений. Она позволяет превратить сложные изображения в бинарные, где объекты выделены контуром.
Принцип бинаризации основан на установлении порога интенсивности для каждого пикселя. Если значение пикселя превышает порог, то он становится бе- лым. в противном случае - черным. Таким образом, изображение разделяется на две категории: объекты интереса (белые) и фон (черный). Не следует путать бинаризацию с преобразованием в оттенки серого, бинаризованное (чёрно-белое изображение) с изображением в оттенках серого. В первом случае применяется только два цвета, во втором - множество оттенков от 0 до 255 значений. Примеры применения: I. Выделение объектов на медицинских изображениях: бинаризация при- меняется для выделения тканей или определения контуров на медицин- ских снимках, что может быть важным для диагностики. 2. Распознавание текста на изображениях: в области компьютерного зре- ния бинаризация часто используется для выделения текста на изображе- ниях, что упрощает его распознавание. 3. Обработка изображений в системах безопасности: па транспортных средствах бинаризация может применяться для выделения объектов ин- тереса. таких как номера автомобилей, на изображениях с видеокамер наблюдения. 4. Распознавание номерных знаков: бинаризация может быть применена для выделения номерных знаков на изображениях с камер видеонаблю- дения на дорогах. Это упрощает последующий процесс распознавания номеров транспортных средств. Применение метода бинаризации статического изображения или видео- кадра, принятого с веб-камеры, осуществляется функцией cv2.threshold(). Данная функция библиотеки OpenCV используется для преобразования изображения в изображение с бинарными (двоичными) значениями (черно-белое изображение), основываясь на пороговом значении. import cv2 # Захват видеопотока с камеры) cap = cv2.VideoCapture(0) while True: # Считывание кадра из видеопотока ret, frame = cap.read() # Бинаризация изображения в кадре gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) framel = cv2.threshold(gray_frame, 127, 255, cv2.THRESH_BINARY) # Отображение оригинального кадра cv2 . imshow ('Origina.. Frame', frame) # Отображение модифицированного кадра cv2.imshow('Modified Frame', framel)
# Проверка на нажатие клавиши ’q' для выхода из цикла if cv2.waitKey(1) & OxFF == ord(’ break. # Освобождение ресурсов cap.release() cv2.destroyAllWindows() Результат выполнения рассмш ренной программы представлен на рис. 5.6. В программном коде строка gray frame - cv2.cvtColor (frame, cv2.COLOR BGR2GRAY) преобразовывает цветовое пространство из области BGR в область GRAY и только потом происходит непосредственно бинаризация изображения строкой frame 5= cv2.threshold)gray frame, J27, 255, cv2. THRESH BINAR. В случае с бинаризацией, эти две строки всегда должны ра- ботать вместе. Рассмотрим коэффициенты этих функций. gray frame = cv2.cvtColor (frame, cv2.COLOR BGR2GRAY) - эту функцию мы ранее рассматривали и здесь мы лишь напомним, что она служит для полу- чения промежуточного изображения в пространстве серых цветов. Поскольку функция cv2.threshold)) использует в качестве аргумента изображение в тонах серого цвета. frame 5 = cv2.threshold)gray frame, 127, 255, cv2.THRESH BINARY): Здесь мы используем функцию cv2.threshold() для бинаризации изображения в опенках серого {gray f rame). Функция принимает несколько параметров: gray frame - исходное изображение в оттенках серого. Рисунок 5.6 - Результат выполнения программы с использованием функции бинаризации Важно заметить, в OpenCV функция cv2.threshold)) возвращает два значе- ния в кортеже: первый элемент - возвращаемое значение (обычно не использу- ется и обозначается символом подчеркивания « _»), а второй элемент - результат применения порога. Такой подход позволяет вам получить как пороговое значе- ние, так и результат одновременно. Символ подчеркивания можно заменить на любое другое имя латиницей.
thresh-127 - пороговое значение, которое используется для классифика- ции пикселей. Если интенсивность пикселя выше порогового значения, он будет установлен в максимальное значение (в данном случае, 255); в противном случае, он будет установлен в минимальное значение (в данном случае, 0). maxval=255 - максимальное значение пикселя, которое будет установлено для пикселей с интенсивностью выше порогового значения. typec=cv2.THRESH BINARY - этот флаг указывает на тип бинаризации. В данном случае, если интенсивность пикселя больше порогового значения, то она будет установлена в максимальное значение (255), в противном случае - в мини- мальное значение (0). Другие значения этого флага, а также полный обзор функ- ции cv2.threshold() рассмотрен в Приложении данной книги. 5,6. Фильтрация 5.6.1. Принцип цифровой фильтрации Под фильтрацией шума на изображении подразумевается процесс очистки изображения от нежелательных мелких дефектов, которые могут возникнуть при его отображении. Это позволяет сделать изображение более четким и приятным для восприятия, устраняя мелкие точки или помехи, которые могут исказить его качество. Для понимания работы фильтров рассмотрим пример. На рис. 5.7 мы ви- дим увеличенный фрагмент некоторого изображения, например, вершина горы. Горизонтальная и вертикальная оси образуют координатную плоскость H:W. на которой размещены пиксели изображения. Таким образом фрагмент горы имеет математическое представление в виде координат отдельных пикселей. н Рисунок 5.7 - Фрагмент изображения (контур горы)
Теперь внесем умышленно помеху в виде смещения координат пикселей по оси ординат. То есть сложим текущие координаты наших пикселей по оси Н со случайной последовательностью: -20. 6, -4. 15. 12. 9, -22, 14. 8. -21, 12, 23, 2.-12. 4.-14, 16, -7. 17. 9. 8, 10, 4, -6, -6, 14, 15.7. Например, для пикселя с координатой (9; 24), его обновленное значение пространственного положения с учетом помехи будет равно (9;24+(-21)) = (9;3). А искажения помехой пространственного положения пикселя (22; 10) будет ((22:10+4) = (22; 14). Полученный разброс пикселей (рис. 5.8) в реальности может быть вызван смещением или неправильным расположением пикселей на дисплее или сенсоре. Чаще всего такой шум возникает при съемке, при сжатии изображения, при ошибке передачи данных, неисправности экрана и т. д. 11 и t Рисунок 5.8 - Фрагмент изображения в шуме (отсутствие контура горы) Л теперь приступим к фильтрации. Возьмём пятый пиксель /Л с координа- той (4:41) и пересчитаем его положение в пространстве путем сложения значения его Н со значениями 11 четырех предыдущих пикселей и поделим на их количе- ство, то есть 5. Если присмотреться, то это ни что иное, как нахождение среднего арифметического. Математически это выглядит так Н4= (Но+ Н,+ Н2+ Н3+ Н4)/5 = (3+31+23+43+41)/5 = 28,2. Значений координат с плавающей запятой не бывает. Поэтому просто от- брасываем десятичную часть. Тогда новая координата пятого пикселя будет иметь значение (4:28). Если сравнить полученный результат с эталонным зна-
чением пятого пикселя изображения (рис. 5.7), мы увидим, что значение этого пикселя стало ближе к требуемому. 11овторим эту процедуру для шестого пикселя: Н5= (Hi+ Н2+ Нз+ Н4+ Hs)/5=(31+23+43+41+39)75=35,4. Новые координаты шестого пикселя (5:35). Для седьмого пикселя: Н6= (Н2+ Нз+ /Л+ Я>+ Н6)/5=(23+43+41+39+7)75=30,6. Новые координаты седьмого пикселя (6:30). Для восьмого пикселя: /Л= (Нз+ Н4+ /М Нб+ Н7)/5=(43+41+39+ 7+42)/5=34,4. Новые координаты восьмого пикселя (7:34). Так необходимо провести расчет для каждого пикселя, пока все пиксели не обновятся, и последний результат не окажется равным нулю. Результат обновленного изображения со скорректированными значения- ми координат всех пикселей показан на рис. 5.9. Конечно, это изображение более похоже на эталонное: становится узнава- емым контур горы, но этого недостаточно. Необходимо что-то изменить в нашем фильтре. Рисунок 5.9 - Фрагмент изображения в шуме после фильтрации (делитель 5) Первый вариант фильтра начинал расчет с пятого пикселя и его смешение составляло 5. А что изменится, если мы сместим на 10 пикселей? Очевидно, что
будут просуммированы первые десять пикселей и их сумма будет поделена на 10. Например, запись для десятого пикселя будет иметь вид Яр= (77о+ Hi + //? + /Л +Hj+ №+ Нб+ Н7+ /А+ Н9)/10— =(3 + 31+23+43 +41 +39+7+42+34+3)710=26.6. То есть новая координата десятого пикселя будет (9:26). Если пересчитать все координаты пикселей с делителем 10, то получится результат, который пока- зан на рис. 5.10. Сравним результаты обоих фильтров и сделаем вывод. Очевидно, что чем больше смещение, тем лучше работа фильтра. Однако вычислений становится больше, что дополнительно нагружает аппаратные ресурсы. Размер данного сме- щения в цифровых фильтрах называется длиной фильтра. Рисунок 5.10 - Фрагмент изображения в шуме после фильтрации (делитель 10) В нашем примере мы сумму значений делили на 10. Также можно сказать, что мы умножали полученную сумму 1/10. Избавимся от дроби, используя деся- тичное значение нашего коэффициента 1/10 = 0.1. Н9— 0,1 (Но+ Hi + Н2 + Нз +Hj+ Н5+ Нв+ Н7+ Hs+ Ну). Л теперь раскроем скобки Н9=0,1Но+0,1Н1 + 0,1Н2+0,1Нз+0,1Н4+0,1Н5+ 0,1Н6+ +0, 1Н7+0,1' Нз+0,/• Ну). Обратим внимание, коэффициенты при каждом значении одинаковые. Эти значения называются весовыми коэффициентами фильтра. И если построить
график из этих коэффициентов по всей длине фильтра, то он будет иметь прямо- угольный вид (рис. 5.1 1). Рисунок 5.11 - Весовые коэффициенты фильтра Оказывается, что если выбрать весовые коэффициенты таким образом, чтобы j рафик имел не прямоугольную форму, а, например, треугольную, экспо- ненциальную и так далее, то можно значительно улучшить работу фильтра. 1 [риведем примеры некоторых видов графиков весовых коэффициентов: 1. Треугольный график весовых коэффициентов: 0.1, 0.2, 0.3, 0.4, 0.5, 0.4, 0.3, 0.2, 0.1 В этом случае веса постепенно увеличиваются до максимального значения и затем снова уменьшаются обратно. 2. Гауссовский график весовых коэффициентов: 0.05, 0.1, 0.2, 0.4, 0.6, 0.8, 0.6, 0.4, 0.2, 0.1, 0.05 В этом случае веса распределены по форме Гауссова распределения, что создает более гладкое и непрерывное воздействие. 3. Экспоненциальный график весовых коэффициентов: 0.05, 0.1, 0.2, 0.4, 0.8, 0.4, 0.2, 0.1, 0.05 В этом случае веса уменьшаются экспоненциально по мере удаления от центрального значения. 4. Косинусоидальный график весовых коэффициентов: 0.1, 0.3, 0.5, 0.7, 0.9, 0.7, 0.5, 0.3, 0.1 В этом случае веса представляют собой косинусоидальную форму, что со- здает осциллирующий характер воздействия. Л теперь с учетом этого знания рассмотрим выражение для фильтра с длинной 9 и весовыми коэффициентами, образующий i рафик треугольной формы О,1Но+О,2- Hi + 0,ЗН2 +0,4- Нз +0,5Н4+0,4- Н5+ 0,3 Н6+ +0,2Н7+0,1Н8).
Длина весовых коэффициентов (длина фильтра) выбрана 9, а нс 10, по той причине, что некоторые функции требуют нечетное число коэффициентов для построения окна. К ним относятся в том числе функция 1 аусса и треугольная функция. Результат такого применения весовых коэффициентов приведен на рис. 5.12. Рисунок 5.12 - Весовые коэффициенты фильтра и результат фильтрации изображения Как видно на рисунке, качество работы фильтра значительно улучшилось: контур горы стал более выразительный. Однако первые значения пикселей были потеряны вследствие смещения. Для этого необходимо применят ь дополнительные меры: уменьшать длину фильтра и подбират ь график весовых коэффициентов. Зачастую в этом случае вносят дополнительные пиксели, обрамляющие изображение. Которыми жертвуют при таком смещении в пользу сохранении основного изображения. Стоит заметить это лишь общий принцип и пример работы наиболее попу- лярного алгоритма пространственной фильтрации. Такой принцип может быть полезен при создании филыров для выделения границ на изображении. Важно отметить, что весовые коэффициенты заданной длины и формы называются окном фильтра или ядром фильтра. Они являются основной харак- теристикой любого цифрового фильтра. В примере для простоты понимания рассматривалось окно одномерное (только по оси И), в реальном случае пространственное положение пикселя опре- деляется двумя координатами, и каждая из координатных точек может иметь ошибочное смещение. Поэтому необходимо применять фильтры, учитывающие смешение в пространстве по двум осям и даже по цветовому отклонению в ярко- сти.
Далее рассмотрим конкретные фильтры, которые предлагает библиотека OpenCV. 5.6.2. Ядро фильтра В предыдущем разделе весовые коэффициенты фильтра были рассмотрены только относительно вертикальной координаты. Для полноценной фильтрации изображений по двум осям применяют весовые коэффициенты фильтра в виде матрицы. Напомним, что такая матрица весовых коэффициентов называется яд- ром фильтра. Рассмотрим наиболее часто применяемые ядра. Ядро резкости (sharpening kernel) для усиления резкости изображения. То самое ядро, которое применено в примере выше: О -1 0 ' -1 5 -1 . О -1 0. Это ядро помогает выделить контуры и детали в изображении, улучшая его резкость. Применение этого ядра к изображению усиливает различия в яркости между пикселями, что делает изображение более четким. Ядро Прюитта (Prewitt's kernel) используется для обнаружения горизон- тальных и вертикальных границ на изображении. Оно имеет следующий вид: -1 О Г -10 1. .-1 0 1. Это ядро применяется в операции свертки к изображению. Когда оно про- ходит через изображение, оно выделяет различия в яркости между соседними пикселями вдоль горизонтальных и вертикальных направлений. Это помогает выявить резкие изменения яркости, что часто соответствует границам объектов на изображении. Ядро Робертса (Robert's kernel) используется для обнаружения границ на изображении. Оно состоит из двух матриц: 0 0 горизонтального ядра — 1 и вертикального ядра 0 0 J 1о о 1 -1 О' о 0. 0 1 Эти ядра применяются к изображению с помощью операции свертки. Го- ризонтальное ядро выделяет горизонтальные границы, а вертикальное - верти- кальные. Обычно результаты свертки с этими ядрами объединяются для получе- ния более точного обнаружения границ в разных направлениях. Ядро Собеля (Sobel's kernel) также используется для обнаружения границ на изображении. Оно состоит из двух матриц:
-1 0 11 Г-1 -2 -Г горизонтального ядра 2 0 2 и вертикального ядра ООО .10 1] 112 1. Как и в случае с ядром Робертса, эти ядра применяются к изображению с помощью операции свертки. Горизонтальное ядро выделяет горизонтальные границы, а вертикальное - вертикальные. Обычно результаты свертки с этими ядрами также объединяются для получения более точного обнаружения границ в разных направлениях. Ядро Собеля часто используется в алгоритмах обработки изображений благодаря своей эффективности и простоте применения. Ядро Щарра (Scharr's kernel) также используется для обнаружения 1раниц на изображении и является альтернативой ядру Собеля. Оно состоит из двух мат- риц: 3 0 3 ' горизонтального ядра 10 0 -10 .3 0 -3 . г 3 10 3 -1 и вертикального ядра 0 0 0 -3 -10 -3 Как и другие ядра, оно применяется к изображению с помощью операции свертки. I оризонтальное ядро выделяет горизонтальные границы, а вертикаль- ное- вертикальные. Ядро Щарра часто используется благодаря своей способно- сти обнаруживать границы с высокой чувствительностью и меньшими искаже- ниями по сравнению с ядром Собеля. Ядро усреднения (Average kernel) используется для размытия изображения или сглаживания его деталей. Оно состоит из матрицы: V, % V, 1/ 1/ 1/ /9 /9 /9 V, v9 %. Это ядро представляет собой простое среднее значение всех пикселей вокруг центрального пикселя. Применение этого ядра к изображению приводит к сниже- нию резкости границ и сглаживанию текстур, что может быть полезно, например, для уменьшения шума на изображении или создания эффекта размытия. Ядро Гаусса (Gaussian kernel) также используется для размытия изображе- ния или сглаживания его деталей, но оно обладает более плавным и естествен- ным характером размытия. Оно представляет собой двумерное распределение Гаусса, которое выглядит следующим образом: 1 2 Г 2 4 2 .1 2 1J
Это ядро представляет собой весовую матрицу, в которой значения убы- вают по мере удаления от центрального пикселя. Применение этого ядра к изоб- ражению создает эффект более естественного и плавного размытия, чем при ис- пользовании ядра усреднения. Ядро Гаусса часто используется в алгоритмах об- работки изображений для создания эффекта размытия, уменьшения шума или подавления высокочастотных компонентов изображения. 5.6.3. Фильтрация и сглаживание изображений 11ерейдем от теории к практике. Когда мы говорим о фильтрации и сгла- живании изображений в компьютерном зрении, мы обращаемся к методам обра- ботки изображений, которые позволяют улучшить их качество и выделить важ- ные детали. Фильтрация - это процесс применения фильтра к изображению для изме- нения его свойств. Фильтры могут усиливать или ослаблять определенные ха- рактеристики изображения. Так, например, фильтр размытия может сгладить изображение, уменьшив резкость краев и удалив мелкие детали (рис. 5.13). Рисунок 5.13 - Прямоугольный сглаживающий фильтр. Слева - пример изображения, справа - результат фильтрации разной интенсивностью Сглаживание - это метод, направленный на устранение шумов и подчер- кивание общих трендов в изображении. Это особенно полезно при работе с изоб- ражениями, содержащими шумы или нерегулярности. При сглаживании изобра- жения можно уменьшить влияние мелких деталей и сделать его более однород- ным (рис. 5.14). Рисунок 5.14- Применения сглаживания для шумоподавления в изображении
Фильтры могут быть применены для различных целен, таких как улучше- ние резкости, выделение краев, подавление шума или изменение цветового ба- ланса. Вот примеры некоторых фильтров, которые часто применяются в компь- ютерном зрении: • билатеральный фильтр представляет собой метод обработки изображе- ний, используемый для сглаживания, сохраняя при этом резкость границ объектов. Этот фильтр применяется с использованием двух компонен- тов: пространственной и яркостной. Пространен венная компонента определяет расстояние между пикселями изображения, а яркостная ком- понента оценивает различия в яркости между соседними пикселями. В результате билатерального фильтра применяются две функции ядра: одна для пространственного распределения, а другая для оценки разли- чий в яркости. Этот фильтр позволяет сохранять резкие 1раницы объек- тов, предотвращая размытие в этих областях. Он находит применение в различных областях, включая обработку изображений, ретушь фото- графий!, а также в компьютерном зрении. Примером может быть исполь- зование билатерального фильтра для улучшения качества фотографий, сохраняя детали объектов и избегая потери резкости в границах между ними. • фильтр Собеля используется для выделения границ на изображении. Он применяет два ядра (горизонтальное и вертикальное) для выделения изменений интенсивности, что позволяет обнаруживать вертикальные и горизонтальные края объектов. Результаты этих ядер могут быть объ- единены для получения общего представления о границах. Примером может быть использование фильтров Собеля для обнаружения границ на изображениях с видеокамер транспортных средств. Это помогает систе- мам мониторинга и безопасности выявлять движущиеся объекты и кон- тролировать транспортные потоки; • фильтр Гаусса использует функцию Гаусса для сглаживания изображе- ния. I [рименение этого фильтра приводит к размытию изображения, по- давлению высокочастотных шумов и созданию эффекта мягкости. Это полезно при необходимости устранить шумы и сделать изображение бо- лее приятным для визуального восприятия. Как пример, применение фильтра I аусса для сглаживания медицинских изображений (например, снимков с магнитно-резонансной томографии) для улучшения визуали- зации врачу и облегчения выявления патологий; • медианный фильтр заменяет значение каждого пикселя медианным зна- чением вокруг него. Это делает его эффективным для удаления шумов, особенно тех, которые представляют собой яркие выбросы «соль- перец». Медианный фильтр сохраняет резкие 1раницы объектов, что де- лает его полезным для обработки изображений с высоким контрастом. Применение медианных фильтров может был ь удаления шумов с датчи- ков роботов. Это может быть важно для точного восприятия окружаю- щей среды и принятия обоснованных решений в реальном времени:
• фильтр Лапласа, также известный как оператор Лапласа, используется для подчеркивания областей с быстрыми изменениями яркости. Он вы- деляет вторые производные по горизонтали и вертикали, что позволяет выявить места, где интенсивность изменяется быстро. Это делает его эф- фективным для обнаружения границ и контуров; • фильтр Прюитта применяет свертку к изображению, используя ядра, ко- торые выделяют изменения интенсивности в горизонтальном и верти- кальном направлениях. Результаты двух ядер (горизонтального и верти- кального) могут быть объединены для получения общего представления о 1раницах в изображении. Проще говоря, этот фильтр служит для обна- ружение горизонтальных и вертикальных границ. Применение фильтров Прюитта может быть использовано для обнаружения горизонтальных и вертикальных границ на изображениях, получаемых с камер автоном- ных автомобилей. Это важно для систем распознавания объектов и без- опасного управления автомобилем; • фильтр Хаара является частью вейвлет-анализа. Он применяет фильтры, основанные на вейвлет-функциях Хаара. для выделения особенностей изображения с различными частотами. Это позволяет обнаруживать края и изменения в различных масштабах. Использование фильтров Хаара может быть полезным для выделения текстур на изображениях деталей в процессе производства. Это помоыет в системах контроля ка- чества и выявлении дефектов; • фильтр Кирша применяет восемь различных ядер (по одному на каждое направление и диагональ) для выделения изменений интенсивности в восьми направлениях. Это делает его чувствительным к линиям и грани- цам в различных ориентациях, позволяя более широкий анализ струк- туры изображения. Выбор подходящего фильтра в обработке изображений зависит от конкрет- ной задачи и особенностей входных данных. Вот несколько шагов, которые мо- гут помочь правильно подойти к выбору фильтра: I. Определение цели обработки: тут необходимо определить конечную цель обработки изображения, выделить ключевые аспекты, такие как сглаживание, обнаружение границ или подавление шумов. 2. Анализ характеристик изображений: на этом этапе необходимо изучить особенности изображений, включая контраст, яркость и наличие шумов. Это позволит точнее определить, какие аспекты требуют коррекции. 3. Понимание особенностей фильтров: необходимо ознакомиться с харак- теристиками различных фильтров и их эффектами. Также необходимо учесть, что каждый фильтр может быть наиболее эффективен в опреде- ленной области задач. 4. Вычислительная сложность: здесь необходимо принимать во внимание вычислительные затраты различных фильтров, особенно при работе с большим объемом данных.
5. Тестирование и оценка результатов: проведение тестирований фильтров на изображениях. Оценка того, как они влияют на качество изображения и насколько соответствуют поставленной цели. б. Контекст задачи: необходимо учесть контекст задачи. Например, при ра- боте в области безопасности на железнодорожном (ЖД) транспорте уде- лять особое внимание сохранению деталей. 7. Комбинация фильтров: возможность использования комбинации раз- личных фильтров для достижения наилучших результатов. Например, сочетание фильтров для уменьшения шумов и обнаружения границ. Выбор фильтра - это процесс, требующий внимательного анализа и экспе- риментов. Эффективное применение фильтров зависит от конкретной задачи и контекста использования. Понимание этих основных принципов фильтрации и сглаживания поможет студентам вуза и инженерам в работе с изображениями, обеспечивая им инстру- менты для улучшения визуальных данных и более эффективного анализа инфор- мации. 5.64. Фильтрация Гаусса Фильтр Гаусса - это математический алгоритм, широко применяемый в обработке изображений и сигналов. Он базируется на распределении Гаусса (нормальном распределении) и используется для сглаживания изображений, устранения шумов и выделения ключевых особенностей. Здесь мы рассмотрим определение фильтра Гаусса, его основные принципы работы и разнообразные области применения. Ниже (рис. 5.15) представлены два примера применения этого фильтра на фотографиях. Подумайте, в каких местах изображения был применен фильтр и для чего этот эффект? Рисунок 5.15 - Пример применения фильтра Гаусса на фотографии Давайте представим, что фильтр I аусса - это как волшебная операция для улучшения картинок. Когда у нас есть изображение с множеством точек (пиксе- лей), фильтр I аусса работает с каждой точкой, чтобы сделать картину более при- ятной для глаз. Ниже представлен еще один пример реализации этого фильтра (рис. 5.16).
Рисунок 5J6- Пример применения фильтра Гаусса Фильтр Гаусса использует особенный математический трюк с чем-то, что называется «ядро». О нем мы уже говорили выше. Добавим лишь, что это как шаблон с числами, которые следуют законам нормального распределения (как если бы они распределялись вокруг среднего значения). И этот шаблон применя- ется к каждой точке на картине. Тут важно вспомнить пример из раздела 5.6.1. Когда мы говорим о «вычислении нового значения», мы имеем в виду, что фильтр Гаусса берет числа вокруг каждой точки и смешивает их вместе. Это но- вое значение становится «упрошенной» версией текущей точки, что делает изоб- ражение более гладким и убирает мелкие детали, которые могут мешать. Для дополнительного понимания математической интерпретации фильтра Гаусса стоит рассмотреть фильтр с конечной импульсной характеристикой (КИХ), который применяется для фильтрации нижних частот электрического сигнала. Важно отметить, что фильтр Гаусса учитывает, насколько далеко и насколько сильно влияют соседние точки. Если точка находится близко и имеет большее влияние, она будет иметь больший вес при вычислении нового значе- ния. Это помогает сохранить общий облик изображения, но сделать его более мягким и менее шумным. Процесс применения фильтра Гаусса начинается с формирования ядра, ко- торое представляет собой двумерный массив значений, соответствующих весам нормального распределения. Эти веса отражают вклад каждого пикселя в окрест- ности в итоговое значение текущего пикселя. Для каждого пикселя изображения вычисляется новое значение путем умножения значений пикселей на соответствующие веса ядра и последующего их суммирования. Полученная сумма становится новым значением текущего пикселя, что приводи! к сглаживанию изображения и подавлению шумов. Фильтр Гаусса нашел широкое применение в различных областях, включая обработку изображений, компьютерное зрение, обработку сигналов и стати- стику. В медицинской диагностике, распознавании образов, а также в задачах компьютерного зрения, где важна точность выделения особенностей, фильтр Гаусса играет ключевую роль. В пособии мы более подробно рассмотрим примеры применения фильтра Гаусса, его влияние на изображения различного типа, а также обсудим методы
оптимизации для эффективного использования этого фильтра в различных сце- нариях. Рассмотрим пример применения функции cv2.GaussianBlur() фильтра Гаусса на простом программном коде. import cv2 # Загрузка изображения image_path = «kartinka.jpg» # путь к исходному изображению output_path = «no_shum_kartinka.jpg» # путь для сохранения ре- зультата kernel_size - (15, 15) sigma_x = О # Применение фильтра Гаусса image = cv2.imread(image_path) blurred_image = cv2.GaussianBlur(image, kernel_size, sigma_x) # Сохранение результата cv2.imwrite(output_path, blurred_image) Данный код загружает изображение из файла «kartinkajpgjpg» и применяет к нему фильтр Гаусса с указанными параметрами (размер ядра 15x15 и значение sigma х равное 0) для размытия изображения. После чего сохраняет полученное размытое изображение в файл «ио shum kartinkaJpg». Коэффициенты kernel size и sigma x влияют на характеристики и резуль- тат применения фильтра Гаусса к изображению. Коэффициент kernel size (размер ядра): определяет размер окна, использу- емого для вычисления взвешенной суммы пикселей вокруг целевого пикселя. Больший размер ядра означает большую область сглаживания и более заметное размытие изображения. Однако слишком большой размер ядра может привести к потере деталей в изображении. Коэффициент sigma х (стандартное отклонение по X): управляет степенью размытия. Чем больше sigma х, тем более размыто становится изображение. Если sigma x равно 0, берегся значение на основе размера ядра. Значение sigmax также может быть автоматически рассчитано. Значение sigma x также связано с шириной гауссова распределения, которое используется для вычисле- ния весов пикселей. Более детальная информация о функции cv2.GaussianBlur() представлена в Приложении данной книги. На рисунке 5.17 приведен результат применения фильтра Гаусса в про- грамме.
Рисунок 5.17 - Результат иыполнения программы применения фильтра Гаусса Как видно, фильтр Г аусса легко избавляется от зернистости, однако теряет контуры изображения. Далее для сравнения будет рассмотрен этот пример с при- менением билатерального фильтра. 5.6.5. Билатеральный фильтр Билатеральный фильтр (Bilateral Filter) - это метод фильтрации изобра- жений. который используется для сглаживания изображений, уменьшения шума, но при этом сохраняет рёбра и грани. Этот фильтр применяется в обработке изоб- ражений с целью улучшения их визуального восприятия, сохранения деталей и устранения шума. Билатеральный фильтр учитывает как пространственные (геометрические) различия между пикселями, так и яркостные различия. Таким образом, он пред- назначен для сохранения рёбер и граней, учитывая одновременно простран- ственные и яркостные характеристики изображения. Этот фильтр использует две функции весов для определения влияния каж- дого пикселя на результат. Одна функция определяет веса на основе простран- ственного расстояния между пикселями, а другая - на основе различий в яркости. Рассмотрим пример применения функции cv2.bilateralFilter() билатераль- ного фильтра на простом программном коде import cv2 4 Загрузка изображения input_image_path = «kartinka.jpg» # путь к исходному изображению output_image_path = «no_shum_kartinka.jpg» # путь для сохранения результата # Параметры билатерального фильтра d = 20 sigma_color = 100 sigma_space = 120
# Применение билатерального фильтра image = cv2.imread(input_image_path) filtered_image = cv2.bilateralFilter(image, d, sigma_color, s igma_space) # Сохранение результата cv2.imwrite(output_image_path, filtered_image) Для корректной работы билатерального фильтра необходимо настроить три параметра: d- диаметр окрестности каждого пикселя. Этот параметр определяет, ка- кие пиксели включаются в окрестность каждого пикселя при вычислении весов; sigma color - стандартное отклонение по цвету. Этот параметр контроли- рует, насколько различия в яркости влияют на веса. Большее значение сглажи- вает изображение больше; sigma space - стандартное отклонение по координатам. Этот параметр определяет, насколько пространственные различия влияют на веса. Большее зна- чение увеличивает радиус окрестности. Отметим, что более детальная информация о функции cv2.bilateralFilter() представлена в Приложении данной книги. Билатеральный фильтр обеспечивает эффективное сглаживание, сохраняя при этом рёбра, что делает его подходящим для задач, где важно сохранение де- талей. Экспериментируя с этими параметрами, можно добиться различных эф- фектов, от тонкого сглаживания до более радикального размытия изображения. Выбор оптимальных значений зависит от конкретной задачи и ваших предпочте- ний. Результат работы рассмотренного кода представлен на рис. 5.18. Рисунок 5.18 - Применение билатерального фильтра на фото
Как было сказано выше, выбор между билатеральным фильтром и фильтром Гаусса или каким-либо другим фильтром, зависит от конкретной задачи и требо- ваний к обработке изображений. Если важно сохранить рёбра и грани, билате- ральный фильтр может быть предпочтительным. В других случаях, когда глав- ное - сглаживание, фильтр 1 'аусса может быть более подходящим. 5.6.6. Фильтры расширения и сужения Фильтр расширения (dilation) и фильтр сужения (erosion) - это две часто применяемые операции в обработке изображений, используемые в компьютер- ном зрении для изменения формы и размера объектов на изображениях. Давайте разберемся с каждым из них. Фильтр расширения применяется для увеличения яркости и размера объ- ектов на изображении. Он работает следующим образом. Каждый пиксель изоб- ражения рассматривается вместе с его окрестностью, называемой структуриру- ющим элементом. Структурирующий элемент - это небольшое изображение (обычно квад- ратное или прямоугольное), которое определяет форму и размер окрестности, используемой для анализа каждого пикселя на изображении при применении операций морфологической обработки, таких как сужение и расширение. Струк- турирующий элемент применяется к каждому пикселю на изображении. Он раз- мещается таким образом, чтобы его центр находился в центре окрестности пик- селя. к которому применяется операция. Если хотя бы один пиксель в окрестности имеет значение (обычно это зна- чение 1 (белый) для черно-белого изображения), то текущий пиксель устанавли- вается в значение 1. Это приводит к тому, что объекты на изображении «растут» или «расширяются», а шум или маленькие дырки в объектах могут быть запол- нены. Ниже на рисунке 5.19 продемонстрирован принцип фильтра расширения для одного структурирующего элемента. Рисунок 5.19 - Принцип работы структурирующего элемента в фильтре расширения
В данном случае область структурирующего элемента 3><3, который подле- жит преобразованию представлена квадратом О 0 1 ООО. ООО Поскольку в область попадает единственно значение 1 (белый цвет), то ре- зультирующая область будет иметь вид 111 1 1 1. 111 Чго касается фильтра сужения, то здесь наоборот. Он используется для уменьшения объектов на изображении. Он работает следующим образом. Каж- дый пиксель изображения также рассматривается вместе со своей окрестностью, структурирующим элементом. Если все пиксели в окрестности имеют значение (обычно 1), то текущий пиксель сохраняется, в противном случае он устанавли- вается в значение 0. Это приводит к «сужению» объектов на изображении, уда- лению мелких деталей и шума (рис. 5.20). Рисунок 5.20 - Принцип работы структурирующего элемента в фильтре сужения В данном случае все та же область структурирующего элемента 3x3, кото- рый подлежит преобразованию, представлена квадратом 0 0 1 0 0 0. 0 0 0 Но поскольку область не состоит из единиц (белый цвет), то результирую- щая область будет иметь вид 0 0 0 0 0 0. 0 0 0 К примеру область с красным квадратиком остается неизменной, по- скольку все ее значения равны единице. 13 библиотеке компьютерного зрения OpenCV функции cv2.erode() и cv2.dilate() используются для применения этих операций соответственно.
Обе функции принимают в качестве параметров исходное изображение и струк- турирующий элемент, который определяет форму окрестности для каждого пикселя. Рассмотрим программный код с применением функций сужения и расши- рения. import cv2 import numpy as np # Создание структурирующего элемента (ядра) для дилатации kernel = пр.ones((5,5), np.uint8) # Загрузка изображения input_image = «•‘.artinka. । д» # путь к исходному изображению output_imagel = «sugenie_kartinka.jpg» # путь для сохранения ре- зультата output_image2 = «rashirenie_kartinka.jpg» # путь для сохранения результата 4 Считывание исходного изображения image = cv2. imread(input_image) # Применение фильтра сужения eroded image = cv2.erode(image, kernel) 4 Применение фильтра расширения dilated_image = cv2.dilate(image, kernel) 4 Сохранение результата cv2.imwrite(output_imagel, eroded_image) cv2.imwrite(output_image2, dilated—image) Этот код использует библиотеку OpenCV для выполнения морфологиче- ских операций. Сначала создается структурирующий элемент (ядро) разме- ром 5x5. Затем загружается исходное изображение, после чего применяются опе- рации сужения и расширения с использованием созданного структурирующего элемента. Результаты обеих операций сохраняются в отдельных файлах изобра- жений. Результат выполнения такой программы представлен на (рис. 5.21), на ко- тором первое изображение - исходное, второе - после применения фильтра сужения, второй - после применения фильтра расширения. Рисунок 5.21 - Результат применения фильтров сужения и расширения над исходным изображением 102
Таким образом, если, например, рассматривать изображения портрета че- ловека, то эти два фильтра приводят к следующим изменениям. Операция сужения на изображении может привести к удалению мелких де- талей, таких как тонкие волосы, мелкие морщины или детали кожи. Возможно сглаживание контуров объектов, что приведет к уменьшению детализации изоб- ражения. Операция расширения на изображении может сделать контуры объектов более толстыми и заметными. Возможно заполнение маленьких пустот или раз- рывов в объектах, что может сделать объекты более плотными и компактными. Обратите внимание, что конечный результат зависит от размера и формы структурирующего элемента, используемого в операциях сужения и расшире- ния, а также от особенностей изображения. Важно экспериментировать с пара- метрами и выбирать подходящие структурирующие элементы в зависимости от желаемого эффекта. 5.6.7. Медианный фильтр Медианный фильтр - это один из методов сглаживания изображений. Он используется для уменьшения шума на изображении, при этом сохраняя края объектов. Для понимания как работает медианный фильтр, давайте сначала раз- беремся с понятием «медианы». Медиана - это значение, которое находится посередине отсортированного набора чисел. Другими словами, если у нас есть набор чисел, мы упорядочиваем их по возрастанию или убыванию, и медианой будет значение, которое стоит в середине этого упорядоченного списка. Когда мы применяем медианный фильтр к изображению, мы берем неболь- шое окно (обычно квадратное) и помещаем его поверх каждого пикселя на изоб- ражении. Затем мы собираем все значения пикселей в этом окне и упорядочиваем их по яркости (от наименьшей к наибольшей). Затем мы выбираем значение, ко- торое стоит посередине этого отсортированного списка - это и будет новым зна- чением пикселя после применения медианного фильтра. Основная идея медианного фильтра заключается в том, что шумные пик- сели, такие как выбросы, будут иметь аномальные значения, которые выбива- ются из общей тенденции окружающих пикселей. Поскольку мы выбираем ме- диану, а не среднее значение, медианный фильтр более устойчив к таким выбро- сам, сохраняя при этом края объектов на изображении. Важно не путать медианный фильтр и фильтры на основе среднеарифме- тического значения. Среднеарифметическое значение - это просто среднее зна- чение чисел в наборе. Для его вычисления мы суммируем все числа и делим на количество чисел. Л медианное значение находится посередине отсортирован- ного списка чисел. Мы не учитываем значения с обеих сторон, а просто выби- раем значение в середине. Вот пример: представьте, что у нас есть изображение с белым фоном и чер- ной точкой, которая представляет собой шум. Применение медианного фильтра
к этому изображению сократит шум, но при этом сохранит контуры объектов, включая черную точку. Таким образом, медианный фильтр - это простой и эффективный способ уменьшить шум на изображении, сохраняя при этом важные детали. Функция cv2.medianBlur() в библиотеке OpenCV позволяет легко применять медианный фильтр к изображениям в Python. Ниже представлен пример программы с применением этой функции. import cv2 # Загрузка изображения input_image = «kartinла. рд» # путь к исходному изображению output_image = «mediar_kartinka. pg» # путь для сохранения рез-та # Считывание исходного изображения image = cv2.imread(input_image) # Применяем медианный фильтр с ядром размером 5x5 median_blur_image = cv2.medianBlur(image, 5) # Сохранение результата cv2.imwrite(output_image, median_blur_image) В этом примере программа загружает изображение с именем kartinka.jpg, применяет медианный фильтр е ядром размером 5x5 и записывает обработанное изображение. Результат рассмотренного примера представлен на рис. 5.22. Рисунок 5.22 - Результат применения медианного фильтра На рисунке для сравнения приведен фильтр с ядром 5x5 и 11x11. Первое изображение является исходным. Ьолее детальное описание функции cv2.medianBlur О представлено в При- ложении данной книги. 5.6.8. Фильтр Лапласа Фильтр Лапласа - это один из базовых операторов обработки изображений, который используется в компьютерном зрении для выявления изменений ярко- сти в изображении. Он помогает выявить края и границы объектов на изображе- нии.
Вот как это работает: представьте, что у вас есть изображение, и вы хотите найти места, где яркость резко меняется или есть резкие перепады яркости. Филыр Лапласа позволяет обнаруживать такие области. Он применяется к каждому пикселю изображения. Для каждого пикселя он берет сумму весов его соседних пикселей и вычитает из яркости самого пикселя, умноженную на количество соседей. Это позволяет выделить места, где яркость резко меняется. Рассмотрим более подробно процедуру вычисления данного фильтра. Представим, что у нас есть следующее изображение: 100 100 100 100 100 100 100 100 100 100 100 100 50 100 100 100 100 100 100 100 100 100 100 100 100 Это простое изображение размером 5x5 пикселей, где значения пикселей представляют яркость. Допустим, мы применяем филыр Лапласа с ядром разме- ром 3x3 к этому изображению. Ядро выглядит так: О 1 О 1 —4 1 0 10 Вычисляем первый пиксель: (0100) + (1-100)+ (0 100)+ (1-100)+(-4-100)+ (1-100)+ (0 100) + + (1-100) + (0-100) = 0. Вычисляем второй пиксель: (0-100) +(1•100)+ (0-100) + (1 • 100) +(-4-100) + (I 100) + (0-100) + + (1-100) + (0-100) = 0. Вычисляем третий пиксель: (0-100) + (1 -100) + (0-100) + (1 -50) +(-4-100) + (1 -100) + (0-100) + + (1-100)+ (0-100) = -50. И так далее для всех пикселей. Результаты вычислений показывают, насколько резко изменяется яркость в каждом пикселе вокруг его соседей. В данном случае обратите внимание, что некоторые значения могут быть отрицательными, что указывает на уменьшение яркости, а некоторые - положительными, что указывает на увеличение. В результате расчета 0 при использовании фильтра Лапласа указывает на отсутствие резких изменений яркости в окрестности данного пикселя, что может означать нахождение в плоской области изображения без краев или границ объ- ектов. Значение -50 свидетельствует о наличии резкого уменьшения яркости в окрестности пикселя, что характерно для краев объектов или границ изобра-
жения, обеспечивая информацию о возможном местоположении объектов на изображении. Применение фильтра Лапласа может привести к усилению шума на изоб- ражении, поэтому часто его применяют совместно е другими методами, такими как сглаживание изображения перед применением филыра. Функция cv2.Laplacian() в библиотеке OpenCV позволяет применять этот фильтр к изображениям с помощью программирования на языке Python. Вы мо- жете указать изображение и размер ядра фильтра, который определяет, какие со- седние пиксели учитываются при вычислении. Рассмотрим пример с применением данной функции. import cv2 # Путь к исходному изображению input_image = «kartinka.jpg» # Путь для сохранения результата output_image « «laplacian_kartinka.jpg» # Считываем исходное изображение в оттенках серого image = cv2.imread(input_image,cv2.IMREAD_GRAYSCALE) # Применяем фильтр Лапласа laplacian_image - cv2.Laplacian(image,5) # Сохраняем результат cv2.imwrite(outputimage, laplacian image) Результат выполнения программы представлен на рис. 5.23. Рисунок 5.23 - Результат применения фильтра Лапласа Из результата выполнения программы видно, что фильтр Лапласа необхо- димо применять вместе с другими фильтрами, такими как сглаживающие филь- тры, чтобы улучшить качество обработки изображения. Это связано с тем, что фильтр Лапласа чувствителен к шуму и может привести к усилению шума на изображении. Применение предварительного сглаживания позволяет снизить уровень шума и улучшить обнаружение краев на изображении. Болес подробная информация о функции cv2.Laplacian() представлена в Приложении.
5.6.9. Фильтр Собел я Филь гр Собеля - это один из основных операторов обработки изображе- ний, используемый для выявления границ на изображении. Он является частью обширного арсенала инструментов компьютерного зрения. Этот фильтр работает следующим образом. Представьте, что у вас есть изображение в оттенках серого, например, фотография. Когда мы говорим о вы- явлении границ, мы хотим найти места на изображении, где происходит резкое изменение яркости или интенсивности пикселей. Это и есть границы объектов на изображении. Фильтр Собеля выполняет вычисление градиента интенсивности каждого пикселя. Градиент показывает, насколько бысгро меняется интенсивность в каж- дом направлении (горизонтальном и вертикальном). Это позволяет нам опреде- лить, где на изображении происходят резкие изменения, что часто связано с наличием 1раниц. 11роцесс вычисления фильтра Собеля включает следующие шаги: Применяется ядро (или маска) к каждому пикселю изображения (обычно 3x3 или 5x5), которая проходит через каждый пиксель и производит определен- ные вычисления. Для вычисления градиента по горизонтали используется следующее ядро: 10-1 2 0 -2. 10-1 Это ядро выделяет горизонтальные границы. Для вычисления градиента по вертикали используется следующее ядро: 1 2 1 0 0 0 . -1 -2 -1 Это ядро выделяет вертикальные границы. После применения обоих ядер к изображению, мы получаем две отдельные карты градиента: одну для горизонтальных изменений и другую для вертикаль- ных. Затем эти две карты градиента объединяются для получения общей карты градиента. Обычно используется формула: gradient_rnagnitude = + Gy 2, где Gx и Gy- это градиенты по горизонтали и вертикали соответственно. Полученная карта 1радиента показывает, где на изображении находятся границы объектов.
Таким образом, фильтр Соболя помогает выявлять границы объектов на изображении, что является важным шагом в обработке изображений в компью- терном зрении. Он широко используется для различных задач, таких как обнару- жение краев, сегментация объектов и другие. Рассмотрим пример программы, которая реализует фильтр Собеля, посред- ством функции cv2.Sobel (). Этот код применяет фильгр Собеля для вычисления горизонтального и вертикального градиентов изображения. Результаты сохраняются в отдельные файлы «sobel x.jpg» и «sobel_y.jpg». Зачастую требуется изменить размер ядра (ksize) в зависимости от требуемой чувствительности к границам. import cv2 # Путь к исходному изображению input_image = «kartinka. pg» # Путь для сохранения результата output_image = «эоЬед kartinka. рд» # Считываем исходное изображение в оттенках серого image = cv2.imread(input_image, cv2.IMREAD_GRAYSCALE) # Применяем фильтр Собеля Горизонтальный градиент sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5) # Применяем фильтр Собеля Вертикальный градиент sobely = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5) # Сохраняем результаты cv2.imwrite(«sobe' x.jpg», sobel_x) cv2.imwrite(«sobe y-jpg»f sobel_y) Результат выполнения этой программы представлен на рис. 5.24 в виде двух градиентов (по горизонтали и вер:икали соответственно). Рисунок 5.24 - Результат применения фильтра Собеля (горизонтальный и вертикальным градиенты) В примере для демонстрации результатов вычисления градиентов по осям не выполнена процедура их объединения. Ниже представлен код программы
с учетом математического объединения градиентов, формула которой была рас- смотрена выше. В этом коде применяется функция cv2.magnitude() для объединения резуль- татов вычислений горизонтального и вертикального градиентов в общую карту градиента. Результат сохраняется в файл «sobel kartinka.jpg». import cv2 # Путь к исходному изображению input image = «kartinka. рс» # Путь для сохранения результата output_image = «sobel kart . pg» # Считываем исходное изображение в оттенках серого image = cv2.imread(input_image, cv2.IMREAD_GRAYSCALE) # Применяем фильтр Собеля Горизонтальный градиент sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5) Применяем фильтр Собеля Вертикальный градиент sobel_y — cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5) # Объединяем результаты вычислений gradient_magnitude = cv2.magnitude(sobel_x, sobel_y) # Сохраняем результат cv2.imwrite(output_image, gradient_magnitude) Результат выполнения программы слияния двух градиентов Собеля пред- ставлен на рис. 5.25. Рисунок 5.25 - Результат применения фильтра Собеля (сумма градиентов) Стоит заметить, что существуют и другие фильтры, которые представле- ны библиотекой OpenCV. К ним относятся: фильтр Приюта с функцией cv2.hoxFilter(), а также филыр Хаара с функцией cv2.fHter2D(). Более детальный обзор и применение этих функций будут рассмотрены в теме при рассмотрении вопросов распознавания объектов на изображении.
Также напомним, что все рассмотренные выше функции могут применяться и к видеокадру. В этом случае ее применение ничем не отличается. Функция должна находиться в теле цикла чтения кадра и применяться последовательно к каждому кадру. 5.7. Выделение контуров и краев на изображениях 5.7.7. Обнаружения границ Выделение контуров и краев на изображениях - это процесс выявления границ объектов или переходов между различными областями в изображении. Это помогает выделить важные детали и структуры. Эта техника имеет множество применений, таких как распознавание обра- зов, сегментация объектов, улучшение качества изображений, медицинская диа- гностика и другие области. Выделение границ и контуров помогает выделить объекты на изображении, делая их более заметными для последующей обра- ботки. Основной принцип выделения границ - это выявление изменений в ярко- сти или цвете пикселей изображения. Граница объекта обычно представляет со- бой резкое изменение яркости. Для этого используются различные методы, такие как детекция градиента, фильтры или морфологические операции. На рис. 5.26 приведен пример, который демонстрирует резкий переход цве- тов некоторых объектов на изображении, что используется в качестве признака для детекции границ самих объектов. Рисунок 5.26 - Демонстрация принципа детекции границ Как видно на рисунке, край бутона цветка с цветом (237, 85, 106) резко отличается от заднего фона принтера (79, 80,91). Благодаря этой разнице можно идентифицировать в цветовом пространстве пикселей место границы двух
объектов. 11ричем, чем выше разрешение, тем выше детализация и тем более точ- ное выявление границ. Примеры применения: 1. Распознавание лиц. При выделении контуров лиц можно более точно определить их форму, что полезно в системах распознавания лиц. 2. Медицинская диагностика. Выделение контуров на медицинских изоб- ражениях может помочь в выявлении изменений в тканях или органах. 3. Робототехника. Роботы, использующие камеры для навигации, могут ис- пользовать выделение контуров для определения границ объектов и из- бегания столкновений. 4. Качество изображения. При улучшении контуров объектов можно улуч- шить общее визуальное восприятие изображения. Выделение контуров и краев - это мощный инструмент в обработке изобра- жений, который помогает выявлять структуры и особенности, делая изображе- ния более информативными и удобными для анализа. В библиотеке OpenCV для обнаружения границ на изображении применяют функцию cv2.Canny() с использованием алгоритма Саппу. Рассмотрим пример программы, которая использует алгоритм Саппу для обнаружения границ на входном изображении с применением порогов гистерезиса 50 и 50 и отображает оригинальное изображение в оттенках серого и результат обнаружения границ. import cv2 # Захват видеопотока с камеры) cap = cv2.VideoCapture(0) while True: # Считывание кадра из видеопотока ret, frame = cap.read() й Применение алгоритма Canny kontur = cv2.Canny(frame, 50, 150) # Отображение оригинального кадра cv2.imshow(’Ori< na' Frame’, frame) # Отображение измененного кадра cv2.imshow('Kontur Frame’, kontur) # Проверка на нажатие клавиши ’q’ для выхода из цикла if cv2.waitKey(1) & OxFF == ord( ): break # Освобождение ресурсов cap.release() cv2.destroyAllWindows() В предоставленном коде функция cv2. Саппу (frame, 50, 50) применена к каждому кадру frame видеопотока. 11ервое значение называется threshold 1 =50 - параметр представляет собой нижний порог 1радиснта. Пиксели с градиентом (яркостным изменением) ниже этого порога будут отбрасываться как шум.
Второе значение называетея threshold2 =150 - параметр представляет со- бой верхний порог градиента. Пиксели с градиентом выше этого порога будут рассматриваться как часть «сильных» контуров. На практике значения порогов могут варьироваться в зависимости от кон- кретной задачи и особенностей изображения. Изменение этих порогов может влиять на количество и интенсивность выделенных контуров. Если значения по- рогов слишком высоки, могут быть утрачены слабые контуры, и наоборот, если значения слишком низки, могут возникнуть ложные положительные контуры из- за шума. Таким образом, при настройке этих параметров важно провести экспери- менты и выбрать оптимальные значения для конкретного случая. Результат работы программы приведен рисунке 5.27 для грех различных вариантов коэффициентов Рисунок 5.27 - Результат работы программы выделения контуров с различными градиентами 5.7.2. Обнаружения контуров Обнаружение границ и обнаружение контуров - это два важных этапа в обработке изображений. Обнаружение границ представляет собой процесс выяв- ления мест на изображении, где происходит резкое изменение яркости или ин- тенсивности. Это может быть вызвано изменением текстуры, цвета или освеще- ния на изображении. Обычно это делается с использованием алгоритмов, таких
как алгоритм Саппу, функцию которой мы рассмотрели выше, или оператор Со- беля. Результатом этого процесса является бинарное изображение, на котором белые пиксели обозначают обнаруженные границы, а черные - фон. Обнаружение контуров, с другой стороны, является следующим шагом по- сле обнаружения 1раниц. Оно заключается в поиске кривых, которые описывают границы объектов или форм на изображении. Обычно это делается на основе би- нарного изображения, полученного после обнаружения 1раниц. Контур пред- ставляет собой набор точек, которые образуют кривую, наиболее точно описы- вающую границу объекта на изображении. Таким образом, обнаружение границ помот ает нам определить места изме- нений на изображении, тогда как обнаружение контуров позволяет нам выделить и описать эти изменения в виде кривых. Обнаруженные контуры могут быть ис- пользованы для множества задач, включая выделение объектов на изображении, анализ их формы, измерение их размеров и многое другое. Как было сказано выше, функция cv2.Canny() используется, чтобы найти места, где цвета на изображении меняются очень резко. Она помогает нам найти контуры объектов, обозначая места, где яркость на изображении изменяется резко. Она не возвращает непосредственно контуры, а просто выделяет места, где объекты заканчиваются или начинаются. Л вот для создания контуров, для работы с ними применяют функции cv2.findContours() и cv2.drawContours(). После того, как мы используем cv2.Саппу () и найдем места, где объекты заканчиваются или начинаются, мы можем использовать cv2.findContours() для того, чтобы найти контуры этих объектов. Затем cv2.drawContours() использу- ется для того, чтобы рисовать эти контуры на изображении. То есть, если мы хотим получить сами контуры и нарисовать их на изображении, мы используем эти две функции. Необязательно функцию выделения контуров cv2.findContours() проводить после процедуры Саппу. Достаточно провести бинаризацию исходного изоб- ражения и применить к нему уже функцию cv2.findContours() и затем cv2. drawContours(). Именно такой пример программы рассмотрен ниже. import cv2 # Захватываем видеопоток с первой доступной в системе веб-камеры cap = cv2.VideoCapture(0) while True: # Считываем кадр с веб-камеры ret, frame = cap.readO # Преобразование цветного изображения в оттенки серого grey=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) # Бинаризация изображения кадра _,binar=cv2.threshold(grey, 127, 255,cv2.THRESH_BINARY) И Выделения контуров на изображении кадра
kontur cv2.findCont ours(binar,cv2.RETR_EXTER- NAL,cv2.CHAIN APPROX_NONE) # Отображения контуров на заданном изображении im_kontur= cv2.drawContours(frame,kontur,-l, (0,255,0),2) # Отображаем исходный кадр cv2.imshow('Contours', frame) # Ждем нажатия клавиши 'q’ для выхода из цикла if cv2.waitKey(1) & OxFF == ord('q’): break # Освобождаем ресурсы cap.release() cv2 . destroyAHWindows () В данной программе каждый кадр преобразуется в оттенки серого, после чего применяется бинаризация, чтобы получи гь черно-белое изображение. Затем на бинаризованном изображении находятся контуры объектов, используя функ- цию cv2findContours(). Найденные контуры затем отображаются на исходном цветном кадре с помощью функции cv2. drawContours(). Функция cv2findContours() вызывается с тремя аргументами: Ыпаг, cv2.RETR EXTERNAL, cv2.CHAINAPPROX NONE 11ервый аргумент binar-переменная, содержащая бинаризованное изобра- жение, на котором мы хотим найти контуры. В нашем случае это черно-белое изображение кадра, полученное после преобразования в оттенки серого и бина- ризации. Второй аргумент - режим поиска контуров. В данном случае используется cv2.RETR EXTERNAL, что означает, что функция будет извлекать только внеш- ние контуры, игнорируя внутренние. Третий аргумент - метод аппроксимации контуров. Здесь используется cv2.CHAIN APPROX NONE, который сохраняет все точки контура без сжатия или аппроксимации. Таким образом, эта строка кода ищет внешние контуры на бинаризованном изображении. Что касается функции cv2. drawContours (frame, kontur, -1, (0,255,0), 2), то здесь: frame - исходное изображение, на котором мы хотим нарисовать контуры. В данной программе переменная frame содержит кадр с веб-камеры, на котором мы обнаруживаем контуры; kontur — переменная, содержащая найденные контуры. В предыдущей строке кода мы нашли контуры с помощью cv2findContours() и записали их в переменную kontur. -1 - параметр указывает индекс контура, который мы хотим нарисовать. Значение -1 означает, что мы рисуем все найденные контуры. (0, 255, 0) - цвет, которым мы хотим нарисовать контуры. В данном случае это зеленый цвет в формате BGR. 2 - толщина линии контура. Здесь используется значение 2, что означает, что контуры будут нарисованы линией толщиной 2 пикселя.
Заметим, если необходим указать лини» один контур из выделенных, то вместо значения -1 можно указать порядковый номер контура. Однако легко убедится, что в этом случае на каждом кадре значение индекса того или иного контура будет различным. И при конкретном значении индекса на изображении, будут появляться различные контуры. Для выделения конкретного контура и снижения вероятности появления ложных контуров, необходимы дополнитель- ные меры, которые повышают точность распознавания границ. Кроме того, можно указать диапазон контуров, которые могут вызывать интерес: cv2.drawContours(frame, kontur[150:200],-1, (0,255,С) , 2). Результат рассмозренной программы представлен на рис. 5.28. Рисунок 5.28 - Результаты выполнения программы обнаружения контуров с различным пороговым значением Такой подход отрисует контуры, у которых порядковый номер лежит в диа- пазоне от 150 до 200, а остальные контуры будут проигнорированы. 5.8. Сегментация изображений Сегментация изображения - это процесс разделения изображения на не- сколько частей или «сегментов», где каждый сегмент представляет собой опре- деленный объект или область интереса. Давайте разберемся по шагам.
Кроме того, сегментация - это метод обработки изображений, который позволяет выделить различные объекты или области на изображении, разбивая его на более мелкие части. Сегментация изображения полезна во многих областях, таких как меди- цинская диагностика, автоматическое вождение, анализ сцен и распознавание объектов. Она позволяет компьютеру лучше понимать структуру изображения и выделять интересующие нас элементы. Существует несколько методов сегментации, но одним из основных подхо- дов является использование свойств пикселей на изображении. Это может вклю- чать в себя цвет, текстуру, контраст и яркость. Алгоритмы анализируют эти свой- ства, чтобы определить, какие пиксели принадлежат к одному объекту или области. Cei ментация изображения является мощным инструментом для анализа и понимания визуальной информации. Ее применение в различных областях помо- гает автоматизировать процессы и улучшить качество принимаемых решений. Пример применения: 1. Медицинская диагностика. В медицинской области cei ментация исполь- зуется для выделения и анализа различных структур в медицинских изоб- ражениях, таких как снимки MRI или СТ. Это помогает врачам более точно определить патологии и области интереса. 2. Автоматическое вождение. В автомобильной индустрии сегментация ис- пользуется для распознавания дорожных объектов, таких как дорожные знаки, пешеходы и другие т ранспортные средства. Это помогает автомо- билю принимать более обоснованные решения на дороге. 3. Анализ сцен. В области компьютерного зрения и виртуальной реальности сегментация позволяет выделять объекты и создавать более реалистич- ные сцены. Алгоритм сегментации изображения включает в себя несколько шагов, начиная с выбора подходящего метода для анализа изображения. Первым этапом является предобработка изображения, направленная на улучшение его качества путем применения сглаживания, устранения шумов и изменения контраста. После предобработки определяются пространственные характеристики, такие как цветовое пространство (RGB, HSV, LAB и т. д.), которые будут использоваться при анализе. Далее устанавливаются пороговые значения для выделения интересу- ющих нас областей, определенных в зависимости от цвета, яркости или гекстуры. В процессе сегментации может применяться фильтрация для выделения определенных структур или особенностей. Региональные методы используют свойства соседних пикселей, объединяя их в один сегмент. Затем проводится оценка результатов сегментации, включая удаление мелких шумов, объединение или разделение сегментов. После этого применяются дополнительные шаги постобработки, такие как морфологические операции для устранения дыр в сегментах или разделение слишком больших сегментов. Важным этапом является анализ и интерпретация сегментов, где происходит определение типов объектов, анализ их формы, раз- меров и расположения на изображении.
5.9. Гомография изображений Гомография изображении - это математический метод, который позво- ляет преобразовывать одно изображение в другое. Гомо1 рафия используется, ко- гда нужно сделать два изображения одного и того же объекта или сцены похо- жими друг на друга. Например, если есть две фото1 рафии одной достопримеча- тельности, сделанные с разных точек зрения, томографию можно использовать, чтобы объединить их в одно изображение так, чтобы оно выглядело, как будто было сделано из одной точки (рис. 5.29). Рисунок 5.29 - Пример применения гомографии двух изображений Кроме тою, гомо! рафия широко применяется в стерео-зрении: когда сцену снимают с двух разных точек (глаз), получают два изображения этой сцены. То- мография используется для выравнивания этих изображений так, чтобы можно было точно сопоставить каждую точку на одном изображении с соответствую- щей точкой на другом. Это помогает понять трехмерную структуру сцены и со- здать ощущение глубины (рис. 5.30). Также это метод может быть использован для создания трехмерных эффектов в фильмах или видеоиграх.
Рисунок 5.30 - Пример применения томографии в стерео-зрении В гомографии пиксели модифицируются путем применения аффинного преобразования к исходным координатам пикселей. Томография представляет собой матрицу, которая описывает это преобразование. Каждый пиксель на изоб- ражении представлен координатами (х, у), и гомография позволяет нам пересчи- тать эти координаты в новое положение (х\ у') с учетом преобразования. Томография задается матрицей размера 3><3. Каждая координата (х, у) представляется в виде гомогенных координат (х, у, 1). После применения томо- графии к этим координатам мы получаем новые гомогенные координаты (х', у', w), где w может быть отличным от I в общем случае. Для получения финальных координат (х’, у’) мы делим новые гомогенные координаты (х\ у', w) на w: X' X' = — w У У = — w Это учитывает возможные изменения масштаба и сдвига, которые могут происходить в результате гомографии. Таким образом, модифицируются коор- динаты пикселей с учетом преобразования, заданного томографией. В библиотеке OpenCV томография изображений осуществляется функцией cv2.findHomography(). Рассмотрим небольшой пример применения этой функции. Предположим у нас есть две фотографии iml.jpg и im2.jpg (рис. 5.31), в которых необходимо найти точки соединениями объединить фотографии в одну. Причем одна из них не соосна с другой.
Рисунок 5.31 - Пример исходных изображений для их дальнейшей гомографии Приведённый ниже исходный код выполняет сопоставление и слияние двух изображении посредством функции cv2JindHomography(). В приведенной ниже программе применен алгоритм ORB (Oriented FAST and Rotated BRIEF) для нахождения ключевых точек и их дескрипторов на каж- дом изображении. Дескрипторы представляют собой компактное описание клю- чевых точек, позволяющее сравнивать их между собой. После этого применяется алгоритм BFMatcher (Brute Force Matcher), кото- рый сопоставляет дескрипторы ключевых точек на обоих изображениях и нахо- дит соответствия между ними. Сопоставления сортируются по расстоянию между дескрипторами. Далее извлекаются координаты ключевых точек для сопоставленных пар на обоих изображениях. Затем с помощью метода RANS АС находится гомогра- фия, то есть преобразование перспективы, которое позволяет выравнять одно изображение относительно другого. После нахождения гомографии (cv2.findHomography() применяется это преобразование к одному изображению таким образом, чтобы оно выравнива- лось с другим. Затем два изображения сливаются в одно, чтобы получить окон- чательный результат, где элементы обоих изображений выровнены и находятся на своих местах. Наконец, объединенное изображение отображается, и пользователю предоставляется возможность увидеть резулыат выполнения программы.
xmport cv2 import numpy as np # Загрузка изображений imagel = cv2.imread(' . ') image2 = cv2.imread(’ir . pg') # Преобразование изображений в черно-белый формат grayl = cv2.cvtColor(imagel, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) # Нахождение ключевых точек и их дескрипторов с помощью ORB orb = cv2 .ORB _create () keypointsi, descriptorsi = orb *detectAndCompute(grayl, None) keypoints2, descriptors2 = orb.detectAndCompute(gray2, None) #Нахождение соответствий между дескрипторами с помощью BFMatcher bf = cv2.BFMatcher(cv2.NORM HAMMING, crossCheck=True) matches = bf.match(descriptorsi, descriptors2) # Сортировка соответствий по расстоянию matches = sorted(matches, key=lambda x: x.di stance) # Извлечение координат ключевых точек для соответствующих точек src_pts = np.float32([keypointsi[m.queryldx].pt for m in matches]).reshape(-1, 1, 2) dst_pts = np.float32([keypoints2[m.trainldx].pt for m in matches]).reshape(-1, 1, 2) # Нахождение томографии между изображениями Н, = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) # Применение томографии для преобразования одного изображения так, чтобы оно соответствовало другому result = cv2.warpPerspective(imagel, H, (image2.shape[1] + im- age! . shape [1] , image2.shape[0])) result[0:image2.shape[0], 0:image2.shape[1]] = image2 # Отображение объединенного изображения cv2.imshow(’Merjed Image’, result) cv2.waitKey(0) cv2.destroyAllWindows() Рассмотрим в программе основные ее этапы. Конструктор cv2.()RB create() создает объект ORB (Oriented FAST and Rotated BRIEF), который используется для обнаружения ключевых точек и вы- числения их дескрипторов на изображениях. Функция detectAndCompute() выполняет обнаружение ключевых точек и вычисление их дескрипторов на заданном изображении с использованием алго- ритма ORB. После выполнения этих строк кода переменные keypointsi и keypoints2 со- держат обнаруженные ключевые точки на соответствующих изображениях, а пе- ременные descriptors 1 и descriptors2 содержат их соответствующие дескрип- торы.
Следующие строки кода bf— cv2. В FMatcher (cv2. NORM HAMMING, crossCheck=True) matches = bf.match(descriptors 1, descriptors2) выполняют сопоставление дескрипторов ключевых точек между двумя изображениями с помощью метода В FMatcher (Brute Force Matcher), который ис- пользует подход перебора всех возможных пар для нахождения наилучших со- ответствий. Здесь cv2.NORM HAMMING указывает на метрику расстояния, используе- мую для сравнения дескрипторов. Для дескрипторов, полученных с использова- нием алгоритма ORB, эта метрика обычно является наилучшим выбором. Пара- метр crossCheck—True указывает на то, что сопоставления будут проверены в обоих направлениях, что улучшает качество сопоставлений. Далее выполняется сопоставление дескрипторов descriptors I и descriptors2 с использованием объекта hf созданного ранее. Результатом является список объектов DMatch, представляющих собой соответствия между ключевыми точ- ками двух изображений. Каждый объект DMatch содержи! индексы соответству- ющих дескрипторов из descriptors! и descriptors2, а также расстояние между этими дескрипторами. Функция sortedf) принимает список объектов DMatch (matches) и сорти- рует его. Аргумент key-lambda х: х distance указывает па ключ сортировки, ко- торый в данном случае является расстоянием между дескрипторами. Таким об- разом, сопоставления будут отсортированы по возрастанию расстояния, что поз- волит оставить наилучшие соответствия в начале списка. Следующая строка кода находит гомографию (преобразование перспек- тивы) между наборами точек srepts и dstpts с использованием метода RAN SAC Н, _ == cv2.findHomography(src pts, dst pts, cv2.RANSAC, 5.0), где, sre pts - набор исходных точек, заданных в виде массива NumPy. dst_pts - набор соответствующих точек, к которым необходимо выровнять исходные точки, также заданный в виде массива NumPy. cv2.RANSAC - это метод оптимизации, который используется для оценки гомографии с учетом выбросов в данных. RANSAC (Random Sample Consensus) позволяет найти наиболее вероятную модель томографии, игнорируя выбросы. 5.0 - этот параметр представляет собой пороговое значение для определе- ния того, является ли точка выбросом или нет. Значение 5.0 означает, что точка будет считаться выбросом, если она находится на расстоянии более 5 пикселей от модели. Результатом выполнения этой езроки будет матрица томографии Н, кото- рая содержит информацию о преобразовании перспективы между двумя набо- рами точек. Строка result = cv2.warpPerspective(imagel, II, (image2.shape[ 1] + im- age Lshapef I /, image2.shape[0])) использует функцию cv2.warpPerspective(), чтобы применить томографию II к image! и создать новое изображение result. Размер нового изображения определяется как сумма ширины imagel и image2 по горизонтали и максимальная высота из двух изображений по вертикали.
С трока result [0 :image2.shape[0], 0:image2.shape[l]] = image2 копирует со- держимое image2 в левую верхнюю часть result, чтобы наложить его на imagel. Диапазон [0:image2.shape[0], 0:image2.shape[ 1 ]] указывает на область, где будет расположено imagel в result. Таким образом, в результате result будет содержать слияние imagel и image2, причем image! будет наложено на imagel с использованием найденной гомографии (рис. 5.32). Рисунок 5.32 - Результат программы гомографии двух изображений ПРАКТИЧЕСКОЕ ЗАДАНИЕ Задание 1. Напишите программу, которая принимает изображение и инвер- тирует его цвета, используя функцию cv2.bitwise not. Исследуйте изменения ви- зуально и определите, какие коэффициенты влияют на результат. Задание 2. Создайте два различных кадра и объедините их линейно с ис- пользованием функции cv2.addWeighted. Исследуйте изменения коэффициентов и их влияние на прозрачность объединенного изображения. Задание 3. Примените преобразование абсолютных значений и масштаби- рование к изображению с использованием функции cv2.convertScaleAbs. Иссле- дуйте изменения коэффициентов масштабирования и их влияние на контраст и яркость изображения. Задание 4. Разработайте программу, которая бинаризует изображение с ис- пользованием функции cv2. threshold и пороговой обработки. Исследуйте различ- ные пороговые значения и их влияние на результат бинаризации. Задание 5. Разработайте программу, в которой предусмотрено обнаруже- ние контуров предметов. I (остарайтесь захватить контуры только интересующих объектов.
Задание 6. Создайте два различных кадра и примените арифметические операции (сложение, вычитание, умножение, деление) между ними с использо- ванием библиотеки OpenCV. Исследуйте изменения коэффициентов и их влия- ние на результат. Задание 7. Напишите программу с применением функции билатерального фильтра и фильтра Гаусса для видеокадра с веб-камеры. Исследуйте влияния ко- эффициентов фильтра на результат работы программы. Задание 8. Напишите программу применив фильтры, описанные в разделах 5.5.4-5.5.9. Результатом должны быть семь окон: оригинальный видео-стрим и шесть окон с видео-стримов после обработки фильтрами. Исследуйте резуль- тат фильтрации. Задание 9. Повторите код из учебника для гомографии двух изображений. Исследуйте возможности функций, представленных в программе. Задание 10*. Напишите программу для микрокомпьютера с М1Р1-камерой. Реализуйте видеозахват с камеры, фильтрацию и выделение контуров на изобра- жении. Задание 11*. Напишите программу для микрокомпьютера с MIPI-камерой. Реализуйте видео-захват с камеры, фильтрацию и выделение контуров на изоб- ражении. I [одумайте, как можно применить корреляционные методы для обна- ружения тех или иных объектов.
6. ГРАФИЧЕСКИЕ ОТРИСОВКИ В КОМПЬЮТЕРНОМ ЗРЕНИИ 6.1. Графические отрисовки В данном разделе рассмотрены инструменты, которые используют для гра- фической отрисовки в Python с помощью функций библиотеки OpenCV. Они придают программам новые возможности, повышают функциональность и ин- формативность. Графические отрисовки - это эффективный способ создания изображений и визуализации данных, делая информацию более доступной и по- нятной. В разделе будет предложено применять различные функции OpenCV для рисования линий, кругов и прямоугольников, а также для добавления текста к изображениям. Используя возможности библиотеки, можно легко изменять цвета и толщину линий, придавая изображениям выразительность. Добавление текстовых меток, интерактивных элементов и других графиче- ских элементов с использованием OpenCV предоставит удобный инструмент для создания информативных и ярких визуализаций. Такой подход делает ваши дан- ные более ясными и обеспечивает простоту работы с изображениями в про- граммном коде. Давайте рассмотрим пример применения графических от рисовок в более широком контексте, таком как телеметрия на борту самолета (рис. 6.1). Графи- ческие визуализации играют важную роль в анализе и представлении данных о состоянии воздушного судна. Рисунок 6.1 - Пример графической отрисовки данных телеметрии у пилота самолета
В данном случае графические от рисовки могут представлять собой интер- активные индикаторы, диаграммы и графики, которые отображают различные параметры полета. Например, линейные графики могут отображать изменения высоты или скорости в течение времени, круговые диаграммы могут представ- лять распределение расхода топлива по двигателям, а цветные карты могут ви- зуализировать данные о температуре или давлении в различных точках воздуш- ною судна. Добавление текстовых меток к этим графикам может предоставить допол- нительную информацию, такую как конкретные моменты времени или значения параметров. Например, метка на графике может подсвечивать момент взлета или посадки. В последнее время графические элементы, такие как квадраты, эллипсы, круги, текст и другие, играют важную роль в компьютерном зрении и системах наведения ракет и БИЛА. Они используются для обнаружения, отслеживания и распознавания объектов, выделения объектов на изображениях с помощью пря- моугольников или эллипсов, оценки размеров и расстояний между объектами, маркировки объектов интереса и отображения результатов анализа данных. Также они предоставляют операторам визуальную обратную связь, помогая им принимать более информированные решения на основе визуализированной ин- формации об окружающей среде. 6.2. Отрисовка геометрических фигур Отрисовка геометрических фигур представляет собой процесс создания изображений различных геометрических форм, таких как линии, круги, прямо- угольники, треугольники и другие. Этот процесс часто используется в компью- терном зрении для визуализации объектов и данных. Отрисовка геометрических фигур является важной частью визуализа- ции информации. Она позволяет наглядно представлять различные объекты и структуры данных на экране. Это необходимо для создания пользовательских интерфейсов, визуализации данных, анимации и других компьютерных прило- жений. 11ринцип огрисовки геометрических фигур основан на использовании гра- фических примитивов, таких как точки, линии и плоские формы. Система коор- динат используется для определения положения и размеров этих геометрических объектов. При отрисовке программы создают соответствующие изображения, используя базовые графические команды и алгоритмы. Прим еры пр им ей ей ия: 1. 01 рисовка геометрических фигур применяется для создания элементов интерфейса, таких как кнопки, текстовые поля, иконки и другие эле- менты, которые пользователь видит на экране. 2. Визуализация данных с использованием геометрических фигур позво- ляет создавать различные, диаграммы и графики, что делает процесс анализа данных более понятным.
3. При создании анимации отрисовка геометрических форм применяется для создания движущихся объектов, изменения форм и других визуаль- ных эффектов. 4. В компьютерных играх отрисовка геометрических фигур используется для отображения персонажей, объектов окружения и спецэффектов. 5. В охранных системах, автомобильном, железнодорожном и в других видах транспорта, работа которых основана на искусственном интел- лекте. Стоит заметить, что чем больше графической отрисовки используется на изображения, тем больше задействован аппаратный ресурс. Особенно это кри- тично при работе в режиме реального времени. В какой-то степени даже увели- чение толщины отрисованной линии ведет за собой преобразования большего числа пикселе)!, что в большей степени задействует ресурс процессора. Все это необходимо учитывать на этапе разработки программного обеспечения под кон- кретную аппаратную платформу. Далее рассмотрим основные функции библиотеки OpenCV, которые ис- пользуют для создания простых геометрических фигур. Рассматривать будем на примере отрисовки объектов в кадре, полученном с веб-камеры. Процедура от- рисовки на статическом изображении отличается лишь тем, что считываем изоб- ражение из файла, а не кадр из камеры. 6.2.1. Отрисовка линий Функция OpenCV, которая используется для отрисовки линий, называется cv2.line(). Давайте рассмотрим ее структуру, аргументы и их значения: cv2.line(img, ptl, pt2, color, thickness, lineType, shift) где img- изображение, на котором будет производиться отрисовка линии. ptl - координаты первой точки (х, у). pt2 - координаты второй точки (х, у). color - цвет линии в формате BGR (синий, зеленый, красный). Например, (255, 0, 0) представляет собой синий цвет. thickness - толщина линии. Если значение отрицательное (например, -1), то линия будет закрашена. ИпеТуре - тип линии. Это параметр, который определяет форму концов ли- нии. По умолчанию используется cv2.LINE_8. Другие возможные значения включают cv2.LINE 4 и cv2.LINE А А (антиалиасинг). shift - количество битовых сдвигов при вычислении координат. Обычно устанавливается в 0. Ниже приведен пример программы с использованием cv2.line() для отри- совки линии на видеокадре, полученном с веб-камеры:
xmport cv2 # Захват видеопотока с камеры cap = cv2.VideoCapture(0) while True: # Считывание кадра из видеопотока ret, frame = cap.readO # Отрисовка зеленой линии на кадре ptl = (50, 50) pt2 = (200, 200) color = (0, 255, 0) thickness = 2 cv2.line(frame, ptl, pt2 , color, thickness) # Отрисовка красной линии на кадре cv2 .line(frame, (60,100), (260,350), (0,0, 255), 2) # Отображение кадра cv2.imshow(’Video Frame’, frame) # Проверка на нажатие клавиши 'q' для выхода из цикла if cv2.waitKey(1) & OxFF == ord(’q'): break # Освобождение ресурсов cap.release() cv2 . destroyAHWindows () В данной программе производится захват видеопотока с камеры компьютера. На каждом кадре рисуются две линии с помощью функции cv2.line. Первая линия идет от точки м координатой (50:50) до точки с координатой (200:200) и имеет зе- леный цвет (0,255, 0). Вторая линия идет от точки с координатой (60:100) до точки (260: 350) и имеет красный цвет (0, 0,255). В первом случае все значения перемен- ных функции cv2.line выведены в отдельные строки, во втором случае, все коэффи- циенты функции указаны явно. Результат выполнения такой программы пред- ставлен на рис. 6.2. Рисунок 6.2 - Результат работы программы отрисовки линий
62.2. Отрисовка прямоугольника Функция библиотеки OpenCV, которая позволяет отрисовать прямоуголь- ник с любыми геометрическими и цветовыми значениями, называется cv2.rectangle(). Рассмотрим ее структуру, аргументы и их значения: cv2.rectangle(img, ptl, pt2, color, thickness, UneType, shift) где, img - изображение, на котором будет производиться отрисовка прямо- угольника. ptl - координаты верхнего левого угла прямоугольника (х, у). pt2 - координаты нижнего правого угла прямоугольника (х, у). color - цвет прямоугольника в формате BGR (синий, зеленый, красный). thickness - толщина границы прямоугольника. Если значение отрицатель- ное, прямоугольник будет закрашен. НпеТуре - тип линии границы. По умолчанию используется cv2.LiNE_8. Другие возможные значения включают cv2.L!NE 4 и cv2.L/NE АА (антиали- асинг). shift - количество битовых сдвигов при вычислении координат. Обычно устанавливается в 0. Пример использования функции cv2.rectangle() в программном коде для от- рисовки прямоугольника представлен ниже. import cv2 # Захват видеопотока с камеры cap = cv2.VideoCapture(0) while True: # Считывание кадра из видеопотока ret, frame = cap.read() # Отрисовка зеленого прямоугольника на кадре ptl = (150, 200) pt2 = (300, 350) color = (0, 255, 0) thickness = 2 cv2.rectangle(frame, ptl, pt2, color, thickness) # Отрисовка красного прямоугольника на кадре cv2.rectangle(frame,(300, 400), (400, 450), (0, 0, 255), 12) # Отображение оригинального кадра cv2.imshow('Vide Frame1, frame) # Проверка на нажатие клавиши 1 q1 для выхода из цикла if cv2.waitKey(1) & OxFF == ord(’q’): break # Освобождение ресурсов cap.release() cv2.destroyAHWindows ()
Здесь на каждом кадре рисуется зеленый прямоугольник с верхним левым углом в точке с координатой (150;200) и нижним правым углом в точке с коор- динатой (300;350). Толщина линии прямоугольника установлена в 2 пикселя. Также па каждом кадре рисуется красный прямоугольник с верхним левым углом в точке (300;400) и нижним правым углом в точке (400:450). Толщина ли- нии этого прямоугольника также установлена в 12 пикселей. Результат выполнения такой программы приведен на рис. 6.3. Рисунок 63 - Результат работы программы отрисовки прямоугольника Отмстим, что если применить отрицательную величина толщины линии (thickness), то произойдёт заливка площади прямоугольника. Причем модуль этого значения нс траст роли. 6.2.3. Отрисовка кругов и эллипсов Для отрисовки кругов и эллипсов с различными геометрическими и цвето- выми параметрами в библиотеке OpenCV применяют функции cv2.circle() и cv2.ellipse() соответственно. Рассмотрим каждую из них: cv2.circle(img, center, radius, color, thickness, lineType, shift) где img- изображение, на котором будет производиться отрисовка круга. center - координаты центра круга (х, у). radius - радиус круга. color - цвет круга в формате BGR (синий, зеленый, красный). thickness - толщина границы круга. Если значение отрицательное, круг бу- дет закрашен. ИпеТуре - тип линии границы. По умолчанию используется cv2.LINE_8. Дру- гие возможные значения включают cv2.LINE_ 4 и cv2.L!NE_AA (антиалиасинг). shift - количество битовых сдвигов при вычислении координат. Обычно устанавливается в 0.
cv2.ellipse(img, center, axes, angle, start Angle, end Angle, color, thickness, lineType, shift) где hng- изображение, на котором будет производиться отрисовка эллипса, center - координаты центра эллипса (х, у). axes - длины полуосей эллипса (major axis, minor axis). angle - угол поворота эллипса в градусах. startAngle - начальный угол дуги эллипса в градусах. end Angle - конечный угол дуги эллипса в градусах. color - цвет эллипса в формате BGR. thickness - толщина границы эллипса. Если значение отрицательное, эл- липс будет закрашен. ИпеТуре- тип линии границы. По умолчанию используется cv2.L!NE_8. shift - количество битовых сдвигов при вычислении координат. Обычно устанавливается в 0. Пример применения функций cv2.circle(), cv2.ellipse() в программном коде для отрисовки круга и эллипса представлен ниже. Здесь на каждом кадре рисуется красный круг с центром в точке (150, 150), радиусом 100 пикселей, и толщиной линии 2 пикселя. Также на каждом кадре отрисовывается зеленый эллипс с центром в точке (300, 350), полуосями (длина, ширина) равными (200, 50), углом поворота 30 гра- дусов, начальным углом 0 и конечным углом 360 градусов, толщиной линии 2 ггикселя. import cv2 # Захват видеопотока с камеры cap = cv2.VideoCapture(0) while True: # Считывание кадра из видеопотока ret, frame = cap.readO # Отрисовка красного круга на кадре center = (150, 150) radius = 100 color = (0, 0, 255) thickness = 2 cv2.circle(frame, center, radius, color, thickness) # Отрисовка зеленого эллипса на кадре center = (300, 350) axes = (200, 50) angle = 30 startAngle = 0 endAngle = 360 color = (0, 255, 0) thickness = 2 cv2.ell ipse(frame, center, axes, angle, startAngle, endAngle, color, thickness) # Отображение оригинального кадра
cv2.imshow(' rideo Frame', frame) # Проверка на. нажатие клавиши ' q' для выхода из цикла if cv2.waitKey(1) & OxFF == ord('q'): break # Освобождение ресурсов cap.release() cv2.destroyAllWindows() Как и в случае с прямоугольником, если применить отрицательную величина толщины линии (thickness), то произойдёт заливка площади прямоугольника. Результат выполнения программы приведен на рис. 6.4. Рисунок 6.4 - Результат работы программы отрисовки круга и эллипса 6.2.4. Отрисовка полигональных фигур Полигональная фигура - это геометрическая фигура, ограниченная конеч- ным числом прямых отрезков, называемых сторонами. Полигональные фигуры могут иметь различные формы, включая треугольники, квадраты, многоуголь- ники и другие. В библиотеке OpenCV для отрисовки полигональных фигур используется функция cv2.polylines(). Это важная функция, которая позволяет воссоздать практически любую геометрическую фигуру, включая имитацию трёхмерной и в какой-то степени округлую сложную фигуры. Рассмотрим се структуру, ар- гументы и их значения: cv2.polylines(img, pts, is&osed, color, thickness, UneType, shift) где img - изображение, на котором будет производиться отрисовка полигона. pts - список точек, задающих вершины полигона. Это трехмерный массив N х 1 х 2, где N - количество вершин.
isClosed- флаг, указывающий, замкнут ли полигон. Если True, то полигон замкнутый (первая и последняя вершины соединены линией). color - цвет линии полигона в формате BGR. thickness - толщина линии полигона. Если значение отрицательное, поли- гон будет закрашен. ИпеТуре - тип линии границы. По умолчанию используется cv2.LINE 8. Другие возможные значения включают cv2.LINE 4 и cv2.LINE АА (антиали- асинг). shift - количество битовых сдвигов при вычислении координат. Обычно устанавливается в 0. Пример применения функций cv2.polylines() в программном коде для отри- совки многоугольника представлен ниже. import cv2 import numpy as np # Захват видеопотока с камеры cap = cv2.VidcoCapture(0) while True: # Считывание кадра из видеопотока ret, frame = cap.read() # Отрисовка зеленого полигона на кадре color = (0, 255, 0) isClosed = True thickness = 2 cv2.polylines(frame, [np.array([[50, 50], [150, 280], [210, 250], [250, 130], [15C, 50]], np.int32)], isClosed, color, thick- ness) # Отображение оригинального кадра cv2.imshow('Video F ame’, frame) # Проверка на нажатие клавиши 1q’ для выхода из цикла if cv2.waitKey(1) & OxFF == ord(‘ ): break # Освобождение ресурсов cap.release() cv2 . destroyAHWindows () Здесь создается массив pts, представляющий вершины полигона. В данном случае это пятиугольник с координатами вершин. На каждом кадре рисуется зеленый полигон с использованием функции cx'2.polylines(). Передается массив вершин pls, зеленый цвет (0, 255, 0), флаг isClosedуказывает, что полигон замкнут (последняя вершина соединяется с пер- вой), и толщина линии установлена в 2 пикселя. Результат выполнения рассмотренной программы представлен на рис. 6.5. Кстати, если аргумент isClosed будет иметь значения False (то есть кривая не замкнута и не образует многоугольник), то получится кривая Безье. Кривые Безье представляют собой математические кривые, описываемые параметрическим уравнением. Они используют управляющие точки для онре- 132
деления формы кривой. Кривые Безье широко применяются в компьютерной графике и дизайне, где они используются для создания гладких и красивых кри- волинейных форм. Они обладают свойствами гладкости, контролируемости и легкости анимации. Рисунок 6.5 - Результат работы программы отрисовки многоугольника 6.2.5. Создание холста Холст в программировании графики представляет собой пространство, на котором можно рисовать изображения или выполнять другие графические опе- рации. Это своего рода «пустая картина», которую вы можете заполнить цве- тами, формами и другими элементами. Холсты используются для создания визуальных представлений данных. Например, построение графиков, диаграмм или изображений. Визуальные приложения, такие как редакторы изображений, видеоигры и программы компьютерной графики используют холсты для взаимодействия с 1 рафическими элементами. В данной части мы познакомимся с функцией np.zerosQ библиотеки NumPy, которая поможет нам создать пустое изображения для нанесения на него различных отрисовок. np.zeros() ~ это функция библиотеки NumPy, предназначенная для созда- ния массива, элементы которого инициализированы нулями. Рассмотрим струк- туру и аргументы этой функции. питру.zeros!shape, dtype=float, order='C) shape-это кортеж, определяющий размеры массива. Например, для одно- мерного массива (5), для двумерного массива (3, 4), и так далее. dtype (необязательный) - опциональный аргумент, указывающий тип дан- ных элементов массива. По умолчанию используется float. Может принимать значения, такие как int, float, np.uint8, и другие.
order (необязательный) - опциональный аргумент, который определяет по- рядок размещения элементов в памяти. Может быть 'С' (по умолчанию) для по- рядка C-style (но строкам) или Т^'для порядка Fortran-style (по столбцам). Рассмотрим пример создания массивов с помощью этой функции 4 Создание одномерного массива из 5 элементов, инициализирован- ных нулями array_ld = np.zeros(5) 4 Создание двумерного массива 3x3, инициализированного нулями array_2d = пр.zeros((3, 3)) 4 Создание трехмерного массива 2x2x2, инициализированного нулями array_3d = пр.zeros((2, 2, 2)) # Указание типа данных (uint8) для массива array uint8 = np.zeros((4, 4), dtype=np.uint8) Здесь shape - определяет размер и форму массива, dtype - определяет тип данных элементов массива. Например, np.uinttt используется для 8-битовых без- знаковых целых чисел, что может быть полезно, например, при работе с изобра- жениями. где значения цветов обычно варьируются от 0 до 255. order - обычно не требует явного указания. Однако при работе с большими массивами порядок размещения в памяти может влиять на производительность операций. Если рассматривать изображение с точки зрения математики, то оно пред- ставляет собой матрицу пикселей. Функция np.zerosQ может быть применена для инициализации «пустого» холста. Например, вызов np.zeros((500, 500, 3), dtype=np.uint8) создаст трехмерный массив размером 500x500, представляющий RGB-изображение, где каждый пиксель инициализирован нулевыми значе- ниями. Это!' подход позволяет заранее определить структуру изображения, ко- торую затем можно заполнить цветами, создавая или обрабатывая графические данные. Рассмотрим пример программы, в которой создается пустая матрица пик- селей, на которую нанесем различные геометрические фигуры import cv2 import numpy as np 4 Создание черного изображения image = np.zeros ((500, 500, 3), dtype=np.uint8) 4 Создание белого изображения #image = np.ones((500, 500, 3), dtype=np.uint8) * 255 4 Отрисовка синей линии на кадре cv2.line(image, (20, ЗС) , (250, 200), (255, 0, 0), 2) 4 Отрисовка красного круга на кадре cv2.circle(image, (150, 100), 50, (0, 0, 255), 2)
# Отрисовка зеленого прямоугольника на кадре cv2.rectangle(image, (120z 180), (400, 480), (0, 255, 0), 6) # Отрисовка желтого прямоугольника на кадре cv2.rectangle(image, (300, 300), (350, 350), (0, 255, 255), 40) # Отображение изображения cv2.imshow(«Е gui », image) # Ожидание нажатия клавиши и закрытие окна при нажатии cv2.waitKey(0) cv2.destroyAllWindows() В этой нро]рамме предусмотрено: • создание черного изображения размером 500x500 пикселей. • отрисовка синей линии с начальными координатами (20, 30) и конеч- ными координатами (250, 200) на черном изображении. • отрисовка красного круга с центром в (150, 100) и радиусом 50 пикселей. • отрисовка зеленого прямоугольника с верхним левым углом (120, 180) и нижним правым углом (400, 480) и толщиной линии 6 пикселей. • отрисовка желтого прямоугольника с верхним левым углом (300, 300) и нижним правым углом (350, 350) и толщиной линии 40 пикселей. Обратите внимание, что если убрать решетку перед строкой image = np.ones((500, 500, 3), dtype=np.uint8) * 255, то программа создаст белый холст размером 500*500 пикселей, представленный в виде матрицы единиц. Исполь- зуется диапазон значений яркости от 0 до 255, где 0 соответствует черному, а 255 - белому цвету. Умножение на 255 обеспечивает, что все пиксели холста будут максимальной яркости, создавая белый фон для последующего рисования графических элементов. Результат такой программы показан на рис. 6.6. Рисунок 6.6 - Результат работы программы создания холста
В заключение подумайте, что изменится в результате программы, если вы допустите в строке image = пр. zeros ((500, 500, 3) замену и вместо 3 уста- новить значение 1. 63. Перемещение геометрических фигур Перемещение геометрических фигур в компьютерном зрении представляет со- бой важный аспект обработки изображений и анализа данных. Перемещение гео- метрических фигур на изображениях часто используется для выявления объектов, отслеживания движения, a также для создания различных визуальных эффектов. При перемещении геометрических фигур по матрице изображения каждая фи- iypa представляется набором пикселей с определенными координатами (х,у). Про- цесс перемещения фщур осуществляется путем изменения значений координат х и у каждого пикселя в соответствии с заданной траекторией или смещением. Рассмотрим пример с квадратом (рис. 6.7), который описывается функцией cv2. rectangle(frame, (20,40), (70, 110), (О,255,0), 2). Рисунок 6.7 - Отображение квадрата Например, чтобы переместить этот квадрат на изображении вправо на 100 пикселей, необходимо увеличить значение х координаты каждого пикселя квад- рата на 100 (рис. 6.8). Аналогично, для перемещения влево на 100 пикселей, нужно уменьшить значение х координаты на 100. При вертикальном перемещении квадрата вверх или вниз изменяются значения у координаты соответствующим образом.
Этот процесс может быть реализован с использованием матричных опера- ций, позволяющих эффективно изменять координаты всех пикселей фигуры од- новременно. После завершения перемещения пикселей обновленное изображе- ние с перемещенной фигурой может быть отображено на экране или сохранено для последующего использования. Порядковый номер колонки пикселей 90 0 20 0 70 120 перемещение х=20 у=40 х=х+100 cv2.rectangle(frame, (х.у), (х+50.у+ 50).(0.255.0).2) 720 Кадр (1280x720) 1280 Рисунок 6.8- Перемещение квадрата на 100 пикселей вправо Этот процесс может бьпь реализован с использованием матричных опера- ций, позволяющих эффективно изменять координаты всех пикселей фигуры од- новременно. После завершения перемещения пикселей обновленное изображе- ние с перемещенной фигурой может быть отображено на экране или сохранено для последующего использования. Таким образом, перемещение геометрических фигур на матрице изображе- ния осуществляется путем изменения их координатных значений х и у, что поз- воляет достичь различных визуальных эффектов и обработать изображения в со- ответствии с требованиями конкретной задачи. Ниже представлена программа, реализующая автоматическое перемеще- ния квадрата в области кадра. import cv2 # Инициализация начальных координат х и у х = 0 у = 0 # Захват видеопотока с камеры cap = cv2 . VicieoCapture (0) while True:
# Считывание кадра с видеопотока ret, frame = cap.read() # Рисование прямоугольника на кадре cv2.rectangle(frame, (х, у), (х+50, у+50), (0, 255, 0), 2) # Изменение координат прямоугольника для перемещения х — х + 2 у = у + 2 # Отображение видеопотока с прямоугольником cv2.imshow(’video’, frame) # Ожидание нажатия клавиши 'д’ для выхода из цикла if cv2.waitKey(1) & OxFF == ord(’q'): break # Освобождение ресурсов и закрытие всех окон OpenCV cap.release() cv2.destroyAllWindows() Данная программа на каждом кадре видеопотока рисует зеленый квадрат размером 50х50 пикселей, который начинается с координат (х, у) и с каждой ите- рацией смещается вправо и вниз на 2 пикселя. Таким образом, зная закон пере- мещения квадрата, мы можем программно перемещать его следуя закону по мат- рице пикселей. 6.4. Динамическая отрисовка прямоугольной области Динамическая отрисовка прямоугольной области означает создание и об- новление прямоугольной области на изображении в реальном времени в ответ на действия пользователя или изменения внешних условий. Например, при помощи функции обратного вызова мыши в программе можно динамически отрисовы- вать прямоугольник на изображении в момент перемещения или нажатия кнопки мыши пользователем. Это позволяет пользователям выбирать области интереса на изображении и взаимодействовать с ними в реальном времени. В данном раздел рассмотрим отрисовку прямоугольной области на видео- кадре. Как вы уже поняли, отрисовка геометрических фигур на видеокадре имеет свои особенности по сравнению с работой со статическими изображениями. Каждый кадр видео постоянно меняется, поэтому любые графические элементы, такие как линии, прямоугольники или окружности, должны быть перерисованы на каждом кадре. Важно обеспечить эффективность отрисовки, чтобы не замед- лять производительность программы, особенно если видео содержит большое количество кадров в секунду. Координаты фигур могут быть заданы относительно размеров кадра, что может потребовать преобразования координат, если разрешение видео отлича- ется от размеров фигур. Если фигуры должны быть частично прозрачными, важно обеспечить правильное отображение на фоне видеокадра. 11ри взаимодействии с видео, например, при рисовании фигур но щелчку мыши, важно корректно обрабатывать события и синхронизировать их с кадрами
видео. При отрнсовке фигур необходимо обеспечить плавность анимации, чтобы объекты выглядели естественно, особенно если они двигаются на видео. 1 [ри необходимости фигуры могут интерполироваться между кадрами, чтобы создать эффект плавного движения. 11ри разработке прог рамм для работы с видео важно учитывать эти особен- ности, чтобы обеспечить корректное отображение и взаимодействие графиче- ских элементов с видеокадрами. Ниже приведён пример отрисовки прямоугольной области, которая в даль- нейшем может служить в качестве области интересов в программе отслеживания объектов. Данная программа использует библиотеку OpenCV для захвата видео по- тока с веб-камеры и отображения его в окне. Она также позволяет пользователю рисовать прямоугольник на кадре, используя события мыши: нажатие левой кнопки мыши начинает рисование, а ее отпускание завершает процесс. Прямо- угольник отображается на кадре, пока пользователь его рисует, после чего он сохраняется на кадре до следующего изменения или завершения программы. В прог рамме: xl,yl - координат ы начальной точки прямоугольника; х2,у1 - координаты конечной точки прямоугольника; drawing- флаг, указывающий начало и конец процесса рисования. import cv2 # Переменные для координат прямоугольника х1 = О yl = О х2 * О у2 = О drawing = False # Флаг для отслеживания рисования cap = cv2.VideoCapture(0) # Функция отслеживания событий мыши def draw rectangle(event, xf у, flags, param): global xl, yl, x2, у 2, drawing if event = cv2.EVENT_LBUTTONDOWN: xl, yl = x, у drawing True elif event == cv2.EVENT. MOUSEMOVE: if drawing: x2, y2 = x, у elif event == cv2.EVENT LBUTTONUP: x2, y2 = x, у drawing = False # Создание окна cv2.namedWindow(1[mage') # Установка функции обратного вызова cv2.setMouseCallback('Imc j ', draw rectangle) while True: # Считывание кадра с веб-камеры
ret, frame = cap.read() # Если прямоугольник был нарисован, отобразить его на текущем кадре if not drawing: cv2.rectangle(frame, (xl, yl), (x2, y2), (0, 255, 100), 2) # Отображение текущего кадра cv2.imshow( , frame) # Ожидание нажатия клавиши для завершения программы if cv2.waitKey(1) & JxFF == ord('q’): break # Закрытие окна cv2.destroyAlIWindows() В программе функция draw rectangle служит как обработчик событий мыши для рисования прямоугольника на изображении. При нажатии левой кнопки мыши (cv2.EVENT LBUTTONDOWN) функция запоминает начальные координаты х и у для прямоугольника и устанавливает флаг drawing в True. Этим флагом фиксируется начало процесса отрисовки. При движении мыши (cv2.EVENT MOUSEMONE) и при активном режиме рисования (drawing = = True), функция обновляет координаты конца прямоугольника х2 и у2. Когда кнопка мыши отпускается (cv2.EVENT LBUTTONUP), функция записывает ко- нечные координаты прямоугольника х2 и у2 и устанавливает флаг drawing в False, завершая процесс рисования. Если флаг drawing установлен, осуществляется отрисовка прямоугольной области: cv2.rectangle(frame, (xl,yl), (х2,у2), (0, 255, 100), 2). На рисунке 6.9 представлено изображение, поясняющее описанный выше принцип.
Этот пример алгоритма позволяет пользователю в реальном времени выби- рать и выделять интересующие его объекты на изображении. Пользователь мо- жет легко определить область интереса, которая будет подвергнута анализу или отслеживанию, что обеспечивает более точное и надежное определение объектов в кадре. Например, после выбора прямоугольника пользователь может использо- вать трекер, такой как, например, MedianFlow или CSRT, чтобы отслеживать объект в последующих кадрах, что облегчает автоматизацию процесса отслежи- вания. 6.5. Добавление текста к изображению ОIрисовка текста в компьютерном зрении с использованием библиотеки OpenCV может быть полезной в различных сценариях, таких как добавление ан- нотаций к изображениям, создание визуальных элементов в видеопотоке, марки- ровка объектов на изображении и другие приложения. Это может быть полезным в областях компьютерного зрения, где важно предоставить дополнительную ин- формацию или пометки для анализа изображений. Функция OpenCV для отрисовки текста называется cv2.putTextQ. Рассмот- рим ее структуру, аргументы и их значения: cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, hotLeftOr) где img - изображение, на котором будет производиться отрисовка текста. text - строка с текстом, который вы хотите отобразить. org — координаты начальной точки текста (левый верхний угол) в форма- те (х, у). font Face - шрифт текста. Например, cv2.FONT HERSHEY SIMPLEX. fontScale - масштаб текста. color - цвет текста в формате BGR. thickness - толщина линии (если отрицательная, текст будет отображен с закрашенным фоном). ИпеТуре - тип линии. По умолчанию используется cv2.LINE АА. hotLeftOr - флаг, который указывает, что начальная точка текста - левый нижний угол (если True). Пример применения функций cv2.putText() представлен ниже. xtnport cv2 # Захват видеопотока с камеры cap = cv2.VideoCapture(0) while True: # Считывание кадра из видеопстока ret, frame = cap.read() # Добавление текста на кадр с кириллицей text = оиве , МИР!’ org = (100, 100) fontFace = cv2.FONT_HERSHEY_COMPLEX fontScale = 1
color = (С, 255, 0) thickness = 2 cv2.putText(frame,text,org, fontFace, fontScale, color, thickness) # Отображение оригинального кадра cv2.imshow(1V Jec Frame’, frame) # Проверка на нажатие клавиши ’q' для выхода из цикла if cv2.waitKey(1) & OxFF —- ord(’ ’): break # Освобождение ресурсов cap.release() cv2.destroyAllWindows() В этой программе создаётся текстовая строка, содержащая фразу ’Привет, МИР?’, и определяются параметры для её отображения на кадре: координаты начала текста (100, 100), выбор шрифта (cv2.FONT_HERSHEY_COMPLEX), масштаб (1), цвет (0, 255, 0), и толщина линии текста (2). Затем эта текстовая строка добавляется на текущий кадр видеопотока с помощью функции cv2. putText (), что позволяет визуально наложить текст на изображение перед его отображением. Результат выполнения такой прог раммы приведен на рис. 6.10. Рисунок 6.10 - Результат работы программы отрисовки текста 6.6. Вычисление гистограммы изображения Гистограмма изображения - это графическое представление распределения яркост и пикселей на изображении. Проше говоря, она показывает, сколько пик- селей имеют определенную яркость. В гистограмме по горизонтальной оси от- ложены уровни яркости (обычно от 0 до 255 для черно-белых изображений), а по вертикальной - количество пикселей с соответствующей яркостью (рис. 6.11).
Рисунок 6.11 - Пример гистограммы для чёрно-белого изображения В контексгс компьютерного прения гистограммы используются для ана- лиза и улучшения изображений. По гистограмме можно судить о контрастности, яркости, наличии переосвещенных или затемненных областей. Например, если гистограмма растянута от 0 до 255, это может указывать на хороший контраст, а смещение влево или вправо может свидетельствовать о недостаточной или из- быточной яркости. Пример применения: 1. Коррекция яркости и конiраста. По форме гистограммы можно опреде- лить необходимость коррекции изображения. Например, если гисто- грамма сосредоточена в узком диапазоне, можно рас тянуть ее для улуч- шения контраста. 2. Автоматическая обработка изображений. Алгоритмы компьютерного зрения могут использовать гистограммы для автоматической коррек- ции изображений, улучшая их качество без участия человека. 3. Сегментация изображений. Гистограммы могут помочь выделить объ- екты на изображении путем анализа распределения яркости. 4. Детекция и коррекция переосвещенных и затемненных областей. По гистограмме можно определить, есть ли участки с высокой или низкой яркостью и применить соответствующие коррекции. Для вычисления гистограммы изображения применяют функцию cv2.calcHist() библиотеки OpenCV. cv2. calcHist(images, channels, mask, histSize, ranges, hist, accumulate) где images - список изображений, для которых вычисляется гистограмма. channels - индексы каналов, для которых вычисляется гистограмма. Например, для изображения в оттенках серого это может быть [0], для цвет- ного - [0, 1,2]. mask - маска изображения. Гистограмма будет вычисляться только для пикселей, соответствующих ненулевым значениям маски. histSize - количество корзин в гистограмме.
ranges - диапазон значений пикселей. Обычно это |(), 256], но может быть настроено на конкретный диапазон значений. hist (опционально) - результирующая гистограмма. accumulate (опционально) - если установлено в True, гистограмма будет накапливаться. Поясним некоторые аргументы функции. histSize в функции cv2.calcHist() представляет собой количество корзин (или бинов) в гистограмме. Мы уже гово- рили. что гистограмма - это столбчатая диаграмма, которая представляет собой распределение значении в изображении (например, интенсивности пикселей). Гак вот эта диаграмма делится на несколько «корзин» или интервалов, и histSize определяет, сколько таких интервалов будет использовано для построения гисто- граммы. Чем больше histSize, тем более детализированной будет гистограмма, по- тому что она будет иметь больше столбцов, отражающих различные значения в заданном диапазоне. Например, если histSize равно 256 (что часто используется для оттенков серого), гистограмма будет иметь по одному столбцу на каждое значение интенсивности от 0 до 255. Однако стоит помнить, что слишком большое количество корзин может привести к потере обобщающей способности гистограммы, особенно если дан- ных мало. Поэтому выбор оптимального histSize зависит от конкретной задачи анализа изображения. mask в функции cv2.calcHist() представляет собой маску изображения. Это изображение того же размера, что и оригинальное изображение, но оно со- держит значения 0 и 1. Гистограмма будет вычисляться только для тех пикселей оригинального изображения, где соответствующие значения маски равны 1 (ненулевые). Использование маски предоставляет возможность ограничить область ин- тереса при вычислении гистограммы. Это может быть полезно, когда важны только определенные части изображения, и вы хотите проигнорировать или учесть только определенные области. Рассмотрим пример программы, в который производится считывание чёрно-белого изображения, а затем расчет и вывод его гистограммы. import cv2 import numpy as np import matplotlib.pyplot as pit # Загрузка изображения из файла image = cv2.imread('kartinka. pg') # Перевод в оттенки серого gray = cv2.cvtColor(image, cv2.COLOR BGR2GRAY) # Вычисление гистограммы hist = cv2.calcHist([gray], [0] , None, [256], [0, 256]) # Создание графика для гистограммы pit.bar(пр.arange (256), hist.flatten (), color*’black’) # Ис- пользуем pit.bar pit.title(1 Histogram’)
pit.xlabel(‘Pixel Vaiue') plt.ylabel(' ) # Отображение оригинального изображения cv2.imshow(’Imag image) pit. show () # Ожидание нажатия клавиши 'q’ для выхода cv2.waitKey(0) # Закрытие окна с изображением и гистограммой cv2.destroyAllWindows() Рассмотрим некоторые строки программы более детально. gray = cv2.cvtColor (image, cv2.COLOR BGR2GRAY): преобразует цветное изображение в оттенки серого. Этот шаг полезен, поскольку гистограмма будет строиться на основе яркости пикселей, что упрощает анализ. В строке hist - cv2.calcHist([gray], [0], None, [256], [0, 256]) осуществля- ется вычисление гистограммы изображения в опенках серого (gray). Рассмот- рим аргументы функции: gray - это изображение в оттенках серого, для которого с троится гисто- грамма. [0] - указывает на индексы каналов, для которых будет вычислена гисто- грамма. В данном случае у нас есть только один канал оттенков серого, поэтому используется 10]. None - это параметр маски, который позволяет вычислить гистограмму только для определенных областей изображения. В данном случае маска не ис- пользуется, поэтому устанавливается значение None. [256] - определяет количество бинов в гистограмме. Бины представляют собой интервалы интенсивности пикселей. В данном случае используется 256 бинов. чтобы охватить весь диапазон оттенков серого (от 0 до 255). [О, 256\ - определяет диапазон интенсивностей пикселей, для которого будет вычислена гисто1рамма. В данном случае это весь диапазон от 0 до 255, что соответствует всем возможным значениям интенсивности для оттенков серого. plt.bar(np.arange(256), hisi.flatten(), color-'black.) - строит столбчатую ги- стограмму с использованием библиотеки Matplotlib. Каждый столбец представ- ляет яркость пикселей, а высота столбца - количество пикселей с соответствую- щей яркостью. plt.titlefHistogram), plt.xlabelfPixel Value), pit.у label ('Frequency) - добав- ляет заголовок и подписи к осям графика для более понятного представления ги- стограммы. plt.showQ - отображает окно с гистограммой, ожидая, пока пользователь не закроет его самостоятельно. Результат выполнения рассмотренного примера представлен на рис. 6.12.
«оо Histogram W 1000 0 о 5c |ч !4i Л>ЪУ1М # + Q S й Рисунок 6.12 - Результат выполнения программы вычисления гистограммы изображения Резюмируя, можно отметить, что особенности функции вычисления гисто- Iраммы в OpenCV включают высокую эффективность и гибкость, позволяющую анализировать как монохромные, так и цветные изображения, а также работать с различными типами гистограмм, такими как гистограммы яркости, цвета или направления градиента. ПРАКТИЧЕСКОЕ ЗАДАНИЕ Задание 1. Создайте изображение с несколькими группами фигур разных форм и цветов. Используйте cv2.circle(), cv2.rectangle() и cv2.putText() для созда- ния эффектного мультисг руппированного изображения. Задание 2. Используйте cv2.rectangle(), cv2.circle() и cv2.polylines() для со- здания геометрического узора на черном фоне. Экспериментируйте с парамет- рами, такими как цвет, толщина линии и радиус, чтобы создать интересный узор. Задание 3. Используйте cv2.cllipsc(), cv2.circlc() и cv2.polylines() для созда- ния изображения с радужным эффектом. Например, создайте изображение с цветными эллипсами, окружающими центральный круг. Задание 4. Создайте изображение с цветовым градиентом, используя cv2.1ine(), cv2.rectangle() и cv2.circle(). Экспериментируйте с различными цве- тами и направлениями, чтобы создать гладкий переход между цветами. Задание 5. Используйте cv2.ellipse(), cv2.putText() и cv2.circle() для создания изображения, на котором текст окружает эллине. Экспериментируйте с парамет- рами, чтобы достичь эстетически приятного распределения. Задание 6. Используйте cv2.polylines() для создания сложной области инте- реса (многоугольник). Преобразуйте изображение внутри в оттенки серого. Задание 7. Используя одну из функций для создания геометрической фи- гуры создайте программу автоматического перемещения фигуры по экрану
по какому-то углу (не по вертикали и горизонтали). При этом доходя до границы окна, фигура должна начать перемещение в другую сторону. Задание 8. Используйте cv2.polylines(), cv2.putText() и cv2.rcctangle() для со- здания изображения с несколькими полилиниями, каждая из которых содержит текст. Попробуйте разные стили и расположения текста. Задание 9. Используя cv2.pulText() и cv2.reclangle() напишите программу и повторите формат текста, который представлен на рис. 6.13. Подумайте, каким образом можно создать тень от текста. Рисунок 6.13 - Пример зыводимого текста на изображении Задание 10*. Реализуйте Задание 7 на платформе микрокомпьютера с ис- пользованием MIPI- камеры. Задание 1Г. Реализуйте на платформе микрокомпьютера алгоритм слеже- ния за перемещением красного объекта. Объект необходимо взять в зеленый квадрат.
7. ОБРАБОТКА ДВИЖУЩИХСЯ ОБЪЕКТОВ 7.1. Основы обработки движущихся объектов Обработка движущихся объектов является важной частью компьютерного зрения, предоставляя машинам возможность автоматически обнаруживать и от- слеживать движущиеся объекты на изображениях и видеопотоках. Этот процесс находит широкое применение в реальном мире, включая области видеонаблюде- ния, автоматизации и робототехники. Важность обработки движущихся объектов проявляется в способности си- стемы следить за динамикой сцен, что делает ее эффективной в решении различ- ных задач. Обнаружение движущихся объектов фокусируется на выявлении их присутствия на изображении, в то время как отслеживание позволяет системе отслеживать перемещение объекта в пространстве со временем. Эти два про- цесса в сочетании позволяют системам реагировать на изменения в реальном времени. Рассмотрим несколько примеров использования обработки движущихся объектов. Допустим, у нас есть торговый центр с камерами наблюдения. Обра- ботка движущихся объектов может автоматически выявлять подозрительное движение или оставленные предметы, предупреждая службу безопасности и обеспечивая безопасность посетителей. Методы обработки движущихся объектов широко применяются в управле- нии беспилотными летательными аппаратами (БИЛЛ). Здесь алгоритмы обра- ботки движущихся объектов могут использоваться для наблюдения и отслежи- вания других воздушных судов, препятствий или целей на земле. Это позволяет автономным дронам избегать столкновений и выполнять полетные миссии без- опасно. Именно благодаря способности дронов к анализу движущихся объектов, некоторые функции этих машин делают их автономными. В автомобильной отрасли системы компьютерного зрения помогают води- телям и автопилотам распознавать и отслеживать другие транспортные средства, пешеходов, сигналы дорожного движения и опасные ситуации на дороге. Это может быть особенно полезно для систем помощи водителю, таких как системы предупреждения о столкновениях или автоматического торможения. В железнодорожной сфере технологии компьютерного зрения могут ис- пользоваться для наблюдения за поездами и железнодорожными путями, обна- ружения препятствий на путях, а также для мониторинга безопасности на вокза- лах и перегонных пунктах. Это помогает повысить эффективность и безопас- ность железнодорожного движения, предотвращая аварии и обеспечивая более надежный пассажирский и грузовой транспорт. Обработка движущихся объектов охватывает ключевые концепции, такие как обнаружение и отслеживание, и их роль в создании более интеллектуальных систем компьютерного зрения.
Обработка движущихся объектов в компьютерном зрении представляет со- бой обширный набор методов и техник, предназначенных для обнаружения, от- слеживания и анализа движущихся объектов в видеопотоках или на изображе- ниях. Основные подходы включают в себя вычитание фона, оптический поток, детекторы движения, методы машинного обучения, алгоритмы отслеживания объектов, сегментацию кадра и глубокое обучение. Метод вычитания фона используется для выделения объектов путем вычи- тания статического фона из текущего кадра, а оптический поток измеряет дви- жение пикселей между последовательными кадрами. Детекторы движения выде- ляют области, где происходят изменения на изображении, а методы машинного обучения, такие как SVM и нейронные сети, могут классифицировать и анализи- ровать движущиеся объекты. Алгоритмы отслеживания объектов, такие как корреляция и фильтры Кал- мана, позволяют системе отслеживать движущиеся объекты через несколько кад- ров. Сегментация кадра используется для выделения объектов на изображении, что упрощает их последующее отслеживание. Глубокое обучение, особенно сверточные нейронные сети, применяется для более точного обнаружения и классификации движущихся объектов. Все эти методы взаимодействуют, обеспечивая системам компьютерного зрения эффективные инструменты для работы с движущимися объектами в раз- личных сценариях применения. Далее мы рассмотрим методы обработки изображений в видеопотоке, де- текции и отслеживания движущихся объектов, чтобы получить более глубокое понимание этой темы. Делать это будем на конкретном примере, который будет усложняться ог темы к теме, путем добавления новых функций в рамках данного раздела. Задача будет заключаться в отслеживании выбранного движущегося объ- екта. 7.2. Предварительная обработка изображений Предварительная обработка изображений в контексте обработки движу- щихся объектов представляет собой важный этап подготовки данных для после- дующих алгоритмов и методов. Этот этап нацелен на улучшение качества изоб- ражений, повышение их контрастности, снижение шума и обеспечение более оп- тимального входа для алгоритмов обнаружения и отслеживания движущихся объектов. Одной из ключевых задач предварительной обработки является фильтра- ция шума. Применение методов сглаживания, таких как Гауссовский или меди- анный филыр, помогает уменьшить случайные изменения яркости пикселей, что может негативно сказываться на точности обработки.
Дополнительно, предварительная обработка включает в себя улучшение контраста изображения. Гистограммное выравнивание позволяет повысить раз- личимость между объектами и фоном, что в свою очередь облегчает задачу об- наружения движущихся объектов. Преобразование цветового пространства также является важным этапом. Использование функций, например, cv2.cvtColor в OpenCV, позволяет эффек- тивно переходить между различными цветовыми пространствами. Это может быть особенно полезно для учета изменений в освещении и выделения объектов оптимальным образом. Бинаризация изображения, т. е. преобразование его в черно-белый формат, также является распространенным методом предварительной обработки. Это упрощает процесс обнаружения объектов и является эффективным способом снижения сложности данных для последующих алгоритмов. Использование морфологических операций, таких как расширение и суже- ние, а также заполнение дыр в объектах, дополняет процесс предварительной об- работки, обеспечивая лучшую форму и структуру объектов на изображении. В целом, правильная предварительная обработка изображений играет клю- чевую роль в подготовке данных, что в свою очередь повышает эффективность системы обработки движущихся объектов, обеспечивая более точные и стабиль- ные результаты. Перейдем к реальному примеру, в котором поэтапно в каждом разделе мы будем наслаивать дополнительные функции. Напомним, наша задача заключается в отслеживании движения указанного объекта. В качестве объекта выберем искусственный цветок на переднем плане кадра (рис. 7.1). Рисунок 7.1 - Исходный кадр обработки
На этапе предварительной обработки изображения в программе приведен пример применения двух методов преобразования цветового пространства и фильтрация. import cv2 # Загрузка видеопотока с веб-камеры cap = cv2.VideoCapture(0) while True: ret, frame = cap.readO if not ret: break # Преобразование в оттенки серого gray = cv2.cvtColor(framef cv2.COLOR_BGR2GRAY) # Размытие для сглаживания изображения и уменьшения шума filter_frame = cv2.GaussianBlur(gray, (5, 5), 0) cv2.imshow(’Otsie ivanie' , filter_frame) if cv2.waitKey(1) & OxFF == ord( j ): break cap.release () cv2.destroyAllWindows() Обратим внимание на то, что ранее в своих примерах мы не проверяли успешность считывания кадра. В данном примере это реализовано строкой if not ret: break. Как известно, функция cap.read() используется для чтения следую- щего кадра из видеопотока, а переменная ret будет содержать логическое значе- ние, указывающее на успешность операции чтения. Если чтение прошло успешно (ret == True), то переменная frame будет содержать сам кадр. Однако иногда возникают ситуации, когда поток видео может быть недо- ступен или закончиться (например, если камера отключена или видеофайл завер- шился). В таких случаях cap.readO вернет ret == False, что указывает на ошибку или конец видео! ютока. Проверка if not ret позволяет проверить, был ли успешно прочитан следующий кадр из видеопотока. Если ret == False, то это может озна- чать конец видеопотока или ошибку, и код внутри блока // может выполнить со- ответствующие действия, например, выйти из цикла чтения видеоиотока, break. Преобразование в оттенки серого: gray = cv2.cvtColor (frame, cv2.COLOR BGR2GRAY). Этот метод преобра- зует цветное изображение в оттенки серого, что уменьшает количество каналов (вместо грех каналов, один) и облегчает последующую обработку. Кроме того, для многих задач обработки изображений, таких как выделение контуров, обнаружение объектов или распознавание объектов, информация о цвете может быть нс так важна, как информация о яркости. Поэтому преобразование в от- тенки серого позволяет упростить алгоритмы обработки и ускорить их выполне- ние.
Размытие для сглаживания изображения и уменьшения шума: blurred — cv2. GaussianBlur(gray, (5. 5), 0) Здесь используется гауссовское раз- мытие (GaussianBlur) для сглаживания изображения и уменьшения шума. Этот ме- тод применяет фильтр Гаусса к каждому пикселю, что создает эффект размытия и помогает сгладить изображение. Таким образом, применение гауссовского размы- тия перед обработкой движущихся объектов помогает улучшить качество изобра- жения и сделать последующую обработку более эффективной и надежной. Напомним, что количество предлагаемых фильтров в библиотеке OpenCV немалое. И в лучшем случае следует вывести результаты нескольких фильтров, чтобы выбрать тот, который отвечает данным требованиям задачи. Результат работы программы представлен на рис. 7.2. • Оии^алн —ОХ Рисунок 7.2 - Результат предварительной обработки кадра Если видео достаточно качественное и нет сильного шума, то применение размытия может быт ь излишним и даже нежелательным, так как оно может ухуд- шить качество изображения и уменьшить его четкость. Размытие часто исполь- зуется для снижения шума или уменьшения детализации изображения, что мо- жет быть полезно при работе с изображениями низкого качества или при нали- чии значительного шума. Очевидно, что фильтрация изображения в данном примере это лишняя процедура, поскольку изображение достаточно качественное и не содержит шу- мов. Фильтрация здесь применена в целях демонстрации процедуры подготовки кадра к дальнейшей его обработке. 7.3. Выбор области интереса Выбор области интереса (Region of Interest, RO1) в контексте отслеживания объекта в компьютерном зрении представляет собой процесс выделения опреде- ленной области изображения, которая содержит интересующий нас объект. Этот
раздел имеет ключевое значение для эффективного отслеживания объектов, так как позволяет сосредоточить вычислительные ресурсы на анализе только той ча- сти изображения, где находится интересующий объект (рис. 7.3). Процесс выбора области интереса может быть выполнен как вручную, так и автомагически. В случае ручного выбора, пользователь определяет область ин- тереса вручную, указывая границы объекта на изображении. В автоматическом режиме алгоритмы компьютерного зрения могут использоваться для обнаруже- ния и выделения объекта, основываясь на признаках, таких как цвет, текстура, форма и т. д. Рисунок 7.3 - Пример выбора области интереса (ROI) в кадре Выбор области интереса позволяет уменьшить объем данных, которые необходимо обрабатывать, что в свою очередь повышает эффективность алгоритмов отслеживания объектов. Кроме того, это позволяет сократить вы- числительные затраты, что важно в реальном времени при обработке видеопо- тока. В применении к отслеживанию объектов, такие технологии, как машинное обучение, могут быть использованы для автоматического обнаружения и выбора области интереса. Это позволяет системе адаптироваться к изменениям в поло- жении объекта и окружающей среде, обеспечивая стабильное отслеживание в различных условиях. Важно отметить, что размер области интереса ROI может существенно влиять на производительность и точность системы отслеживания объектов в компьютерном зрении. Большие RO1 требуют больше вычислительных ресурсов для анализа, по- этому использование слитком крупных областей может привести к снижению производительности системы, особенно в режиме реального времени. Это осо- бенно важно, когда система работает па устройствах с ограниченными ресур- сами, такими как мобильные устройства или встроенные системы.
Слишком маленькие ROI могут сделать систему менее устойчивой к изме- нениям в положении объекта или его окружении. Если RO1 недостаточно боль- шая. система может столкнуться с трудностями в отслеживании объекта, осо- бенно при перемещении, изменении масштаба или изменении освещения. Это связано с малым количеством информации, которую несет область интересов. Размер RO1 также может влиять на способность системы обобщать отсле- живание на новые сценарии и объекты. Слишком жесткое определение ROJ мо- жет сделать систему менее гибкой и менее способной к адаптации к различным условиям съемки. Размер ROI также может влиять на способность системы выделять и ис- пользовать признаки объекта. В некоторых случаях увеличение размера ROI мо- жет помочь в более точном анализе текстур, цветов и других признаков, что мо- жет улучшить точность отслеживания. Оптимальный размер ROI зависит от конкретных условий задачи, характе- ристик объекта и требований к производительности системы. Эксперименты и настройка параметров обычно требуются для достижения оптимального ба- ланса между вычислительной эффективностью и точностью отслеживания. Напомним, что изображение на экране с размером, например, 12К0 на 720 является ни чем иным как матрица пикселей с размером 1280 пикселей по горизонтали и 720 пикселей по вертикали. То есть все изображение имеет мате- матическую запись в Python: а = frame/0:720, 0:1280] или более компактная за- пись а =frame/': 720, :1280]. Таким же математическим трюком можно и выделить область ROI, напри- мер roi - frame[200:250, 150:300]. Этой записью мы выделяем фрагмент кадра, ограниченный прямоугольником. Интервал 200:250 означает, что мы берем вер- тикальные пиксели с 200-го по 249-й включительно. Таким образом, это пред- ставляет 50 вертикальных пикселей. Л интервал 150:300 означает, что мы берем горизонтальные пиксели с 150-го по 299-й включительно. Таким образом, это представляет 150 горизонтальных пикселей. Итак, RO1 будет состоя!ь из 50 вертикальных строк (пикселей) и 150 гори- зонтальных столбцов (пикселей), образуя прямоугольную область изображения. На рис. 7.4 приведено графическое пояснение создания области RO1. Наиболее частое заблуждение состоит в том, что область интереса ROI всегда равна объекту интереса. На самом деле область ROI включает в себя объект или объекты интереса. И если представить область ROJ как рамку или окно, то следящий квадратик или прямоугольник будет перемещаться внутри этой области в зависимости от положения объекта интереса на изобра- жении. Таким образом, область ROI является более крупным рамочным элемен- том, внутри которого может перемещаться меньший элемент, такой как следя- щий квадратик, чтобы отслеживать конкретный объект или область на изобра- жении. Важно заметить, что такое обозначение области ROI вокруг интересую- щего объекта будет жёстко привязано к своим координатам и при смещении объ- екта интереса область окажется вокруг не интересующей нас области.
Порядковый номер колонки пикселей О 150 299 1280 ▼ 720 ROJ Кадр(1280x720) Рисунок 7.4 - Выделение ROI в кадре (roi = frame[200:250, 150:300]) Например, если БПЛА используется для наблюдения за транспортом на дороге, ROI, которая сориентирована жестко по центру оси фюзеляжа, мо- жет быть применена для выделения области, содержащей только дорожное движение, игнорируя небеса или соседние здания. Это помогает снизить объем данных, который необходимо обработать, ускоряя процесс анализа и принятия решений. Однако важно понимать, что координаты и размеры RO1 жестко привязаны к изначальному изображению. При изменении позиции объекта интереса ROI останется фиксированным относительно фюзеляжа, что может привести к сме- щению интересующей области за пределы ROL Поэтому важно обеспечить ди- намическое смещение RO1 в зависимости от изменяющихся условий и требова- ний задачи. Для этих целей в дальнейшем будут рассмотрены трекеры. Ио на этом этапе нам важно понимать, как формировать область интереса и как эта область соотносится с выделяемым объектом интереса. Разберемся, что произойдет, когда выделяемая область с объектом стано- вится больше, меньше или равна области RO1: Выделяемая область с объектом больше области ROI: в этом случае часть объекта может оказаться за пределами области ROI, и следящий элемент внутри области RO1 (например, квадрат или прямоугольник) нс сможет захватить весь объект. Это может привести к потере информации или части объекта при его анализе или отслеживании. Выделяемая область с объектом меньше области ROI: если объект зани- мает только часть области ROI, значит, остальная часть области RO1 будет пу- стой или содержать фоновую информацию. В этом случае следящий элемент внутри области ROI может находиться вокруг объекта, но часть области ROI
останется нсзадействованной. Это может привести к неэффективному использо- ванию ресурсов и снижению точности анализа. Выделяемая область с объектом равна области ROI: если область с объ- ектом точно соответствует размерам области ROI, это означает, что весь объект полностью понадает внутрь области ROL В этом случае следящий элемент мо- жет полностью охватывать объект, что обеспечивает эффективное отслеживание и анализ. Как было указано выше, область интересов может быть любого размера и теоретически она может быть размером от единого пикселя, до размера разре- шения изображения. Выделяя область ROI, мы получаем доступ к его содержимому в виде мас- сива данных, в котором содержится информация о цвете всех его пикселей. Ниже представлен пример исходного кода, в котором область ROI определена одним пикселем roi = frame1300:301,500:501]. Информация о данном пикселе выво- дится в терминал print(roi). import cv2 cap = cv2.VideoCapture(0) while True: ret, frame = cap. read () ^Определяем область ROI roi =f rame [300:301,500: 5 (’1] cv2.imshow('Otslej ivanie', frame) #Выводим содержание области ROI, то есть цвет пикселя print(roi) if cv2.waitKey(1) & OxFF == ord(’q’): break cap.release () cv2.destroyAllWindows() В дальнейшем, работая над областью интересов, нет необходимости прово- ди гь модификацию кадра целиком, тем самым на1ружая излишне аппаратные ре- сурсы. Для этого можно провести обработку только выделенной области интересов ROI. Например, при дальнейшем рассмотрении слежения за объектом трекером или выделение объектов алгоритмами глубокого обучения, эти операции требуют преобразования области изображения в оттенки серого цвета. Но зачастую доста- точно применить это преобразование только для выделенной области ROI. Приведем пример программы, в которой область интересов ROI имеет фиксированный размер 280 на 200, а внутри данной области выделен объект ин- тереса (искусственный цветок). import cv2 cap - cv2.VideoCapture(0) while True: ret, frame = cap.read()
^Определяем область ROI roi=frame[120:400,200:400] # Переносим область интереса в серые цвета gray_roi=cv2.cvtColor(roi,cv2.COLOR_EGR2GRAY) # Переносим область интереса в BGR gray_roi=cv2.cvtColor(gray_roi,cv2.COLOR_GRAY2BGR) # Перекрашиваем в оттенки серого выделенный фрагмент кадра frame[120:400,200:400]=gray_roi cv2.rectangle(frame,(230, 150), (350, 350 ), (0, 255, 0), 2) cv2 . imshow (’ ots.J e । j tranie ' , frame) if cv2.waitKey(1) & OxFF == ord(’q’): break cap.release () cv2.destroyAllWindows () Первое преобразование cv2.cvtColor(roi,cv2.COLOR BGR2GRAY) перево- дит изображение из цветной области BGR в область оттенков серого. Второе пре- образование cv2.cvtColor(gray roi,cv2.COLOR GRAY2BGR) переводит изобра- жение из области серых топов в цветную область BGR, при этом изображение остается серым. Это дает нам возможность применить изображения в оттенках серого в цветной области. Такие преобразования позволяют выполнить определенные операции или фильтрацию, которые работают только с одноканальными изображениями (та- кими как фильтры границ или некоторые методы компьютерного зрения), на вы- бранной области изображения. Часто такие операции применяются для эконо- мии вычислительных ресурсов или просто для удобства обработки данных. Ре- зультат такой программы приведен на рис. 7.5. Рисунок 7.5 - Отображения области ROI в оттенках серого цвета
Необязательно выводить область интереса на экран. Наблюдателю или оператору она не представляет важности. Поэтому зачастую область ROI исполь- зуют в коде, и она является промежуточным звеном программы, но не выводят с результирующим изображением. Результатом такой программы должен стать кадр как он есть (frame) и область выделения объекта интереса (например, зеле- ный квадрат). 11о логике, зеленый квадрат в области ROI должен сопровождать переме- щение объекта. Это может быть сделано с использованием алгоритмов компью- терного зрения, которые фиксируют границы объекта на основе яркости, цвета, текстуры или других характеристик пикселей на изображении. Фиксация обычно выполняется путем определения координат и размеров выделенной области, ко- торые затем могут использоваться для дальнейшего анализа или отслеживания объекта. Об этом речь пойдет в следующем разделе. Обобщим выше сказанное. Использование области RO1 с последующим перемещением следящего квадратика внутри нее предоставляет несколько пре- имуществ: 1. Уменьшение объема обрабатываемых данных. Обработка всего изоб- ражения может быть ресурсоемкой, особенно в случае высокого разре- шения изображения. Использование области ROI позволяет сосредото- читься только па части изображения, содержащей интересующий объ- ект, что снижает объем данных, подлежащих обработке. 2. Увеличение скорости обработки. Поскольку обработка выполняется только внутри области ROI, а не на всем изображении, это может зна- чительно ускорить процесс анализа и принятия решений. 3. Улучшение точности и эффективности. Когда обработка ограничива- ется областью ROI, аналитические алгоритмы могут быть более точ- ными и эффективными, так как они сосредоточены только на конкрет- ной области изображения, содержащей интересующий объект. 4. Адаптивность к изменяющимся условиям. Перемещение следящего квадратика внутри области RO1 позволяет адаптироваться к измене- ниям в положении объекта на изображении, обеспечивая непрерывное отслеживание при движении объекта. Еще один простой способ выделить область ROI в кадре это использование функции из библиотеки OpenCV: cv2.selectROI(). Эта функция, в отличии от предыдущего метода выбора области RO1, позволяет определить границы обла- сти интересов и объект интерактивно. То есть, когда вызывается cv2.selectRO1, появляется окно с изображением, и пользователь может выделить интересую- щую его область, перетаскивая мышью и задавая размеры прямоугольника. Эти действия в реальном времени влияют на параметры выбранной области, которые затем возвращаются из функции. Такой подход позволяет пользователям взаимодействовать с программой или библиотекой, делая её более удобной и гибкой в использовании, особенно при работе с визуальными данными, такими как изображения или видео.
Рассмотрим ниже программу, в которой реализован следующий этап в нашей программе: выбор области интереса. В данной программе, после запуска, пользователь может выбрать началь- ную область интереса с помощью мыши, выделяя прямоугольник на первом кадре, который будет зафиксирован в переменных х, у, и’, /?. Нажать ENTER. Затем программа будет перерисовывать этот прямоугольник на каждом последу- ющем кадре с веб-камеры. import cv2 cap = cv2.VideoCapture(0) ret, frame = cap.readO # Определение начальных координат и размеров прямоугольника х, у, w, h = cv2.selectROI(frame, fromCenter=False) while True: ret, frame = cap.readO # Отрисовка прямоугольника на кадре cv2.rectangle(frame, (x, y), (x + w, у + h), (0, 255, 0), 2) cv2.imshow('Region of Interest', frame) if cv2.waitKey(1) & OxFF == ord(' : ): break # Освобождение ресурсов cap.release() cv2.destroyAllWindows() Следует оценить насколько понятны!i и более компактный становится код, если применять описываемую функцию. Здесь функция cv2.selectROI() позволяет пользователю выбирать прямо- угольную область RO1 на изображении. Функция включает в себя четыре аргу- мента, из них два обязательных. Аргументы frame - изображение, на котором пользователь будет выбирать R.O],frот Center (опционально) - флаг, указывающий, следует ли начинать выбор ROI от центра. По умолчанию False. Функция возвращает кортеж, представляющий координаты и размер вы- бранной области: (х, у, ж h). Строка кода с функцией cv2.rectangle() используется для отрисовки прямо- угольника на изображении frame. Она указывает координаты верхнего левого и нижнего правого углов прямоугольника, которые предварительно определе- ны на основе выбранной области с помощью функции cv2.selectROI(). Таким об- разом, координаты х. у - это верхний левый угол прямоугольника, а ж. /? - его ширина и высота, соответственно. Эти координаты обновляются на каждой ите- рации цикла, чтобы отображать прямоугольник на последующих кадрах видео- потока. Более подробное разъяснении функции cv2.selectRO1() приведено в Прило- жении данной книги.
Результат работы такой программы представлен па рис. 7.6. На первом ри- сунке производится выбор ROI. На втором рисунке результат нажатия кнопки ENTER. На третьем рисунке, смещение объекта в кадре. Рисунок 7.6- Результат работы программы: выбора области интереса в кадре Обратим внимание, что смещение объекта на кадре не приводит к смеще- нию зеленого прямоугольника. Понятное дело, ведь выделение области ROI не реализует слежение за объектом без дополнительных мер. О них речь пойдет в следующем разделе. 7.4. Отслеживание движущихся объектов Отслеживание движущихся объектов - это ключевой этап в обработке компьютерного зрения, позволяющий системам следить за объектами в движе- нии через последовательные кадры видеопотока. Этот процесс важен для непре- рывного мониторинга объектов в реальном времени и выявления их перемеще- ний и изменений в динамике сцены. Основные задачи отслеживания объектов 1. Разработка алгоритмов, способных справляться с изменениями в осве- щении, масштабе, и другими факторами, сохраняя точность отслежи- вания. 2. Анализ движения объектов для определения их скорости и направле- ния, что имеет важное значение в различных приложениях, таких как видеонаб: т юдение. 3. Разработка методов, способных справляться с ситуациями, когда объ- екты могут перекрываться или временно исчезать из кадра. Методы отслеживания движущихся объектов: 1. Корреляционные методы. Оценка схожести между объектами на после- довательных кадрах на основе корреляции, что позволяет отслеживать объекты на основе их уникальных признаков. 2. Оптический поток. Измерение изменений положения пикселей между кадрами, что позволяет определить направление и скорость движения объектов.
3. Фильтры Калмана и Particle Filter. Прогнозирование перемещения объ- ектов на основе предыдущих данных и коррекция прогнозов с учетом текущих измерений. 4. Методы машинного обучения. Использование алгоритмов машинного обучения, таких как TrackNet или GOTURN, обученных на больших наборах данных для эффективного отслеживания объектов. 5. Интеграция с детекцией объектов. Совмещение методов отслеживания с методами детекции для повышения устойчивости и точности системы в условиях изменчивой сцены. 6. Комплексные методы трекинга. На 6 пункт стоит отдельно обратить внимание, он включает в себя алго- ритмы комплексных методов трекинга. Некоторые из широко используемых тре- керов включают KLT, CSRT, MedianFlow, TLD и MOSSE и т. д. Эти трекеры об- ладают различными характеристиками и подходами, что позволяет выбирать наилучший трекер в зависимости от конкретных условий сцены. Рассмотрим кратко каждый из них. Трекер CSRT (Continuous Adaptive Mean Shift with Color Name and Scale Estimation) представляет собой алгоритм отслеживания объектов в видеопотоке. Он применяется в случаях, когда требуется высокая точность отслеживания при изменениях в масштабе, освещении и появлении частичных закрытий объекта. CSRT использует комбинацию методов, включая адаптивное среднее смещение с оценкой цвета и масштаба. Метод адаптивного среднего смещения позволяет эффективно справляться с изменениями положения объекта в видеопотоке, а оценка цвета и масштаба по- могает адаптироваться к изменениям в окружающей среде. Эти характеристики делают CSR 1 подходящим для сложных сценариев, где объект может менять раз- мер, цвет или быть частично закрытым. Метод адаптивного среднего смешения используется в алгоритме отсле- живания объектов в видеопотоке, таком как CSRT. Он начинается с инициализа- ции окна вокруг объекта (область RO1), который нужно отследить. Затем для каждой точки в этом окне вычисляются характеристики, такие как цвет и тек- стура, для оценки плотности вероятности. Далее вычисляется центр масс этой плотности, который затем используется для смешения окна в направлении, мак- симизирующем плотность вероятности. Этот процесс повторяется до тех пор, пока центр окна не перестанет смещаться или не будет достигнут критерий оста- нова. Таким образом, метод адаптивного среднего смещения позволяет адапти- роваться к изменениям положения объекта и его характерно гикам в видеопотоке, обеспечивая эффективное отслеживание объектов при изменениях в масштабе, освещении и появлении частичных закрытий. В библиотеке OpenCV конструктор класса, реализующий трекер CSRT, называется cv2.TrackerCSRT() гиги cv2.TrackerCSRT createQ. Он предоставляет удобный интерфейс для использования этого трекера в приложениях компьютер- ного зрения, обеспечивая высокую стабильность и точность отслеживания объ- ектов в видеопотоке.
Трекер KCF (Kcrnelized Correlation Filters) представляет собой алгоритм отслеживания объектов, использующий корреляцию шаблона в пространстве признаков. Он применяет ядерные методы для повышения точности и эффектив- ности отслеживания. Корреляция шаблона в пространстве признаков - эго метод анализа изоб- ражений, который позволяет сопоставить шаблон (обычно небольшое изображе- ние, например, заданная область ROI) с изображением более крупного размера с целью определения, где находится шаблон на большем изображении. Простран- ство признаков здесь означает множество всех возможных признаков изображе- ния, которые могут быть использованы для описания его содержимого (напри- мер, цвет, текстура, углы и т. д.). Когда мы говорим о корреляции шаблона в пространстве признаков, мы обычно сначала преобразуем как шаблон, так и большее изображение в про- странство признаков. Затем мы ищем степень совпадения или корреляции между шаблоном и каждым фрагментом большего изображения в пространстве призна- ков. Это может быть выполнено различными способами, например, путем вы- числения скалярного произведения между векторами признаков шаблона и фраг- мента изображения. Когда корреляция максимальна, это указывает на то, что шаблон наи- более точно соответствует фрагменту изображения. Поиск максималыюй кор- реляции позволяет определить местоположение шаблона на большем изобра- жении. Алгоритм KCF подходит для сценариев, где требуется высокая точность отслеживания объекта при различных условиях, таких как изменения освещения и масштаба. Он может эффективно работать в реальном времени и обладает устойчивостью к различным видам движения объекта. В OpenCV функция, реализующая трекер KCF, предоставляется как cv2. TrackerKCF0 или cv2. TrackerKCF create(). Этот трекер предоставляет воз- можность быстрого и точного отслеживания объекта в видеопотоке, используя ядерные методы и корреляцию шаблона. Трекер Median Flow -это алгоритм отслеживания объектов в видеопотоке, который обеспечивает хорошую производительность при относительно неболь- ших изменениях в масштабе, освещении и частичных закрытиях объекта. Этот метод основан на использовании медианного значения для оценки перемещения объекта в кадре. Медианное значение - это значение в середине упорядоченного набора данных, разделенного на две равные части. Другими словами, это значение, ко- торое делит набор данных на две равные половины, где половина значений нахо- дится выше медианы, а другая половина - ниже. В контексте алгоритма MedianFlow медианное значение используется для оценки перемещения объекта на основе предыдущих значений этого перемещения. В алгоритме MedianFlow медианное значение используется для оценки пе- ремещения объекта в кадре. Начиная с инициализации отслеживаемого объекта
на первом кадре, алгоритм оценивает его новое положение, опираясь на преды- дущее смещение. Медианное значение предыдущих смещений объекта помогает предсказать его ожидаемое перемещение на текущем кадре. Эта оценка может быть скорректирована, учитывая новую информацию о положении объекта, по- сле чего информация о ею положении обновляется для использования на следу- ющем кадре. Такой подход позволяет алгоритму адаптироваться к изменениям положения объекта, уменьшая влияние шума или выбросов и повышая точность отслеживания. MedianFlow подходит для сценариев, где объект движется плавно, и его форма относительно стабильна. Он может быть эффективен в приложениях, где не требуется высокая точность отслеживания, но важна надежность и скорость работы. В OpenCV трекер MedianFlow представлен функцией cv2. TrackerMedianFlow() или cv2.TrackerMedianFlowcreateO. Эта функция предоставляет простой интер- фейс для интеграции трекера MedianFlow в приложениях на основе компью- терного зрения. Методы, используемые этим трекером, позволяют справлять- ся с небольшими изменениями в положении и форме объекта, что делает его подходящим для определенных видов задач отслеживания объектов в видео- потоке. Трекер MOSSE (Minimum Output Sum of Squared Error) - это алгоритм от- слеживания объектов, который работает на основе корреляции шаблона. Он ис- пользует адаптивные фильтры для обновления шаблона объекта и вычисляет корреляцию между шаблоном и текущим кадром для определения положения объекта. Принцип адаптивных фильтров, используемых в алгоритме MOSSE, за- ключается в обновлении шаблона объекта с учетом изменений в сцене. На первом кадре изображения выбирается шаблон объекта, который представ- ляет собой небольшой фрагмент изображения (например. RO1), содержа- щий объект, который нужно отследить. Затем адаптивные фильтры использу- ются для обновления шаблона объекта на каждом новом кадре, учитывая из- менения в положении и внешнем виде объекта в последующих кадрах. Это позволяет алгоритму сохранять актуальный шаблон объекта даже при из- меняющихся условиях сиены. После обновления шаблона объекта алгоритм вычисляет корреляцию между обновленным шаблоном и текущим кадром изображения. Корреляция позволяет определить степень схожести между шаблоном и частью изображения на текущем кадре, что помогает определить положение объекта. MOSSE подходит для сценариев, где требуется высокая скорость отслежи- вания объекта, но не обязательно высокая точность. Он может эффективно рабо- тать в реальном времени и подходит для приложений, где объект движется до- статочно плавно, и форма объекта относительно стабильна. В OpenCV, MOSSF. трекер предоставлен как cv2.Tracker MOSSE() cv2. Tracker MOSSE _create(). Этот i рекер обеспечивает простой интерфейс для быстрого и адаптивного отслеживания объекта в видеопотоке, что делает
его подходящим для определенных сценариев, где важна скорость отслеживания при относительно низких требованиях к точности. Трекер MIL (Multiple Instance Learning) представляет собой алгоритм от- слеживания объектов, основанный на методе множественного обучения. В кон- тексте отслеживания объектов, MIL рассматривает объекг как совокупность «су- мок» (instances) - подобных областей изображения. Обучение происходит на уровне этих сумок, что позволяет алгоритму учитывать изменения внутри объекта. Метод множественного обучения представляет собой разновидное! ь обу- чения с учителем, где обучающие примеры представлены в виде сумок (bags) вместо отдельных экземпляров. В каждой «сумке» содержится набор объектов, и каждая сумка имеет метку класса (положительная или отрицательная). Целью алгоритма MIL является нахождение гипотезы, которая может классифициро- вать сумки в соответствии с метками класса, присвоенными им. Примеры, используемые в MIL, называются «сумками» (bags), потому что предполагается, что каждая «сумка» содержит хотя бы один положи тельный пример, тогда как отрицательные примеры могут быть в сумке или отсутствовать вовсе. Этот подход особенно полезен в ситуациях, когда данные не содержат точ- ных меток для каждого отдельного экземпляра, но имеют только общие метки для группы экземпляров. В контексте отслеживания объектов, метод множественного обучения MIL используется для рассмотрения объекта как набора «сумок» изображений, что позволяет учитывать изменения внутри объекта и повышает устойчивость алго- ритма к различным условиям сцены. Трекер MIL подходит для сценариев, где обьект может менять свою форму или частично перекрываться другими объектами. Он обеспечивает некоторую степень инвариантности к форме объекта, что делает его полезным в условиях переменного окружения. В OpenCV функция, реализующая трекер MIL. предоставляется как cv2.TrackerMIL() или cv2.Tracker MIL _create(). Этот трекер предоставляет сред- ства для обучения на основе множественного обучения и отслеживания объектов в видеопогоке. Отметим, если при запуске программы с применением трекеров появляется ошибка отсутствия модуля грекера, то следует установить дополни гельные мо- дули в библиотеку OpenCV pip install op encv-contrib-python. Рассмотрим реализацию отслеживания объекта на примере. Напомним, что выше мы произвели подготовку изображения (фильтрация, преобразования цветовых пространств), также мы позаботились о выделении области интереса ROI. Теперь применим к этой заготовке метод отслеживания. В качестве примера выбран метод трекинга KCF. import cv2 # Инициализация трекера KCF tracker = cv2.TrackerKCF_create()
cap - cv2.VideoCapture(0) # Чтение первого кадра ret, frame = cap.readO # Определение начальных координат и размеров прямоугольника roi = cv2.selectROI(frame, fromCenrer=False)# roi=x, y, w, h # Инициализация трекера с текущим кадром и прямоугольником tracker.init(frame, roi) while True: ret, frame = cap.readO # Обновление трекера и получение новых координат success, roi = tracker.update(frame) (x, y, w, h) =roi. # Отрисовка прямоугольника на кадре cv2.rectangle(frame,(х, у) ,(x + w, у + h), (0, 255, 0),2) cv2 . imshow ('Otsle an', frame) if cv2.waitKey(1) & OxFF == ord( i ): break # Освобождение ресурсов cap.release() cv2.destroyAllWindows() Здесь пользователь выбирает прямоугольную область на первом кадре для отслеживания объекта: го i = cv2. select R OI(frame, from Center=False). Трекер инициализируется с текущим кадром и выбранной областью: tracker.init(frame, roi). Это стандартная процедура инициализации 1рексра в OpenCV. Далее в бесконечном цикле происходит захват новых кадров: ret, frame = cap.read(). Трекер обновляет координаты объект в каждом новом кадре: success, roi = tracker. update(frame). Полученные координаты объекта используются для отрисовки прямо- угольника вокруг объекта: cv2.rectangle(frame, (х, у), (х + w, у + И), (0, 255, 0), 2). Отображается текущий кадр с нарисованным прямоугольником: cv2. imshow ('Otslejivanie, frame). Уточним tracker.updatefframe) - это вызов метода для обновления состоя- ния трекера с использованием нового кадра из видеопотока. Этот метод прини- мает текущий кадр и возвращает два значения: success (успех) - логическое значение, которое указывает, было ли успеш- ное обновление трекера. Если объект был успешно обнаружен и отслежен на но- вом кадре, success будет True. В противном случае, если трекер не смог найти объект, success будет False. Заметим, чтобы сменить алгоритм трекинга в данной программе, достаточно за- менить функцию cv2.TrackerKCF createQ, например, на cv2.TrackerCSRT createQ. Это удобно для анализа и выбора алгоритма отслеживания. Однако некоторые
трекеры требуют некоторого дополнительного вмешательства. Кроме того, некоторые из трекеров могут отсутствовать в той или иной версии библиотеки OpenCV. В этом случае необходимо обратиться к документации библиотеки. Результат работы программы отслеживания движущегося объекта пред- ставлен на рис. 7.7. Рисунок 7.7 - Результат работы программы отслеживания движущегося объекта Если на экране появляется более одного объекта, и задача стоит их отсле- живать. применяют мульти-трекер. В библиотеке OpenCV предоставляет удоб- ный инструмент для одновременного отслеживания нескольких объектов в ви- деопотоке (cv2.MultiTracker() или cv2.MultiTracker_create()). В видеопотоке может быть несколько объектов, которые вы хотите отсле- живать одновременно, например, несколько автомобилей на дороге или не- сколько лиц в толпе. Мульги-iрекер обеспечивает возможность надежного от- слеживания каждого из этих объектов, даже если они частично перекрывают друг друга. Еще одним преимуществом мульти-трекера является его гибкость: вы мо- жете легко добавлять или удалять объекты из отслеживания ио мере необходи- мости. Это особенно полезно, когда объекты входят или покидают кадр.
Кроме того, мульти-трекер позволяет применять различные алгоритмы трекинга к разным объектам. Например, вы можете использовать разные методы для автомобилей и для лиц, что обеспечивает более точное и эффективное отсле- живание в различных сценариях. Таким образом, мульти-трекер является удобным инструментом для обра- ботки сложных сценариев, где требуется отслеживание нескольких объектов в видеопотоке. 7.5. Анализ траекторий движущихся объектов Анализ траекторий движущихся объектов - это этап в компьютерном зре- нии, который занимается изучением путей и маршрутов объектов, двигающихся вну гр и определенной области интереса. Когда мы рассматриваем движущиеся объекты, важно не только отслежи- вать их текущее положение, но и понимать, как они перемещаются со временем. Этот процесс анализа траекторий позволяет нам извлекать более высокий уро- вень информации из потока видеоданных. Теория анализа траекторий может включать в себя несколько ключевых шагов: Сегментация траекторий. В начале данные о движении объектов обычно представлены в виде последовательности координат в течение времени. Сегмен- тация позволяет выделить индивидуальные траектории каждого объекта для бо- лее детального анализа. Давайте представим, что у нас есть видеозапись, на которой снят ы движу- щиеся объекты, например, автомобили на дороге. Камера записывает коорди- наты (х, у) этих автомобилей в каждый момент времени. Получается набор дан- ных, где для каждого кадра мы имеем информацию о том, где находится каждый автомобиль. Теперь, если мы просто посмотрим на этот набор данных, он может выгля- деть как одна большая куча чисел. Сложно понять, какой автомобиль двигается куда и какие у него есть особенности движения. Вот где на помощь приходит «сегментация траекторий». Сегментация - это процесс разделения большого набора данных на отдельные «сегменты» или «части». В нашем случае с траекториями автомобилей сегментация позволяет выделить индивидуальные траектории для каждого автомобиля. Теперь у нас есть информация о том, как каждый автомобиль двигается по дороге отдельно от других. Пример понятен, если представить, что у нас есть видео, где несколько машин двигаются по дороге. На начале видео мы видим только координаты, но не можем отличить одну траекторию от другой. Сегментация траекторий позволяет нам «выделить» каждую машину отдельно, чтобы мы могли анализи- ровать ее движение, скорость, направление и т. д. Это полезно, например, для обнаружения ненормального поведения транспортных средств или анализа тра- фика.
Извлечение признаков. После выделения траекторий необходимо извлечь характеристики, которые описывают их движение. Это могут быть параметры, такие как скорость, ускорение, направление движения, повороты и т. д. Давайте представим, что у нас есть видеозапись с камеры, где сняты авто- мобили на дороге. После того, как мы cei монтировали траектории (то есть выде- лили каждую траекторию отдельно), нам нужно понять, как объекты двигаются, какие у них есть особенности в этом движении. Извлечение признаков - это как сбор ключевой информации о движении объектов. Эта информация помогает нам лучше понять, как объекты ведут себя в пространстве. Рассмотрим несколько примеров признаков: Скорость говорит нам, насколько быстро двигается объект. Например, мы можем измерить, сколько пикселей он проходит за секунду. Ускорение показывает, насколько быстро объект ускоряется или замедля- ется. Это может быть полезно для определения изменений в движении. Направление движения говорит нам, в каком направлении движется объ- ект. Например, двигается ли он вперед, назад, влево или вправо. Если объект поворачивается, мы можем измерить угол поворота и понять, как он изменяет свое направление. Кластеризация траекторий. Так как в реальных сценах может быть много объектов, целью является группировка схожих траекторий в кластеры. Это по- могает в понимании общих закономерностей движения. Давайте представим, что у нас есть видео, где снимаются несколько ма- шин, двигающихся по дороге. Каждая машина создает свою собственную траек- торию, то есть путь, по которому она двигается на экране. В реальной ситуации может быть много машин, и все они двигаются по-разному. Теперь, если мы хотим упростить анализ и понять, какие типы движений вообще присутствуют на дороге, мы можем использовать «кластеризацию тра- екторий». Это как сортировка похожих траекторий в группы, или кластеры. Простой пример: представьте, что у нас есть три машины, движущиеся примерно одинаково быстро и в одном направлении. Такие траектории будут по- хожи друг на друга. Кластеризация поможет нам сказать: «Вот группа машин, которые двигаются одинаково». Прогнозирование траекторий. На основе изученных данных можно попы- таться предсказать будущие траектории объектов. Это полезно, например, для принятия решений в робототехнике или для обеспечения безопасности в авто- номных транспортных средствах. Представьте, что у вас есть видео, на котором записано движение машин по дороге. Вы уже изучили, как они двигаются в прошлом - их траектории на предыдущих кадрах. Теперь вы хотите посмотреть в будущее и предсказать, как эти машины будут двигаться дальше. 11рогнозирование траекторий - это как предсказание будущих путей дви- жения объектов. Давайте рассмотрим пример: если машина движется прямо по дороге в течение последних нескольких секунд, мы можем предположить, что она, вероятно, продолжит движение прямо и в будущем.
Это полезно в различных областях. Например, в робототехнике, если робот изучил, как объекты двигаются вокруг пего, он может использовать эту инфор- мацию, чтобы предсказать, куда эти объекты, возможно, переместятся в сле- дующий момент времени. Такие предсказания помогают роботу принимать бо- лее обоснованные решения. В области автономных транспортных средств (например, беспилотных ав- томобилей), предсказание траекторий также играет важную роль. Например, если система видит, что впереди идет медленно двигающийся автомобиль, она может предсказать, что этот автомобиль бу дез двигаться медленно и в будущем, что позволит принять меры, чтобы избежать возможной аварии. Анализ аномалий. Также важно выявлять аномалии в движении, такие как неожиданные изменения траектории, остановки, или необычные уско- рения. Это может помочь в обнаружении нежелательных событий или пове- дения. Представьте, что вы наблюдаете за движущимися объектами на дороге с помощью камеры или другого сенсора. Вы записываете, как они двигаются: некоторые едут прямо, некоторые поворачивают, а некоторые могут даже делать остановки. Теперь давайте представим, что вы изучили данные о движении и нау- чились предсказывать, как эти объекты обычно себя ведут. Но вдруг вы замеча- ете что-то странное, например, машина, которая внезапно резко изменяет свою траекторию, или объект, который внезапно останавливается без видимой при- чины. Это и есть «аномалии в движении» - необычные или неожиданные собы- тия в поведении объектов. Анализ аномалий помогает выявлять такие странные ситуации, которые могут быть нежелательными или сигнализировать о пробле- мах. 11ример понятен, если мы представим себе стадо оленей, которые обычно двигаются в одном направлении. Если внезапно один из оленей начинает бежать в противоположном направлении, это может быть аномалией - что-то необычное и неожиданное. В реальной жизни анализ аномалий в движении может быть полезным, например, для обнаружения аварийных ситуаций на дороге, нежелательного по- ведения в системах безопасности или для выявления необычного движения объ- ектов в робототехнике. IГерейдем к примеру на языке Python. Ниже предложен код программы, ко- торый поможет понять некоторые принципы анализа движения объектов. Для этого модифицируем код, рассмотренный ранее, следующим образом import cv2 # Инициализация трекера KCF tracker = cv2.TrackerKCF create() cap - cv2.VideoCapture(0) ret, frame = cap.readO # Определение начальных координат и размеров прямоугольника
roi = cv2.selectROI(frame, fromCenter=False) # roi=x, y, w, h # Инициализация трекера с текущим кадром и прямоугольником tracker.init(frame, roi) # Инициализация списка для хранения координат центра объекта trajectory = [] while True: ret, frame = cap.read() # Обновление трекера и получение новых координат success, roi = tracker.update(frame) (x, y, w, h) = tuple(map(int, roi)) # Вычисление центра прямоугольника center x = x + w // 2 center у = у + h // 2 # Сохранение координат центра в список trajectory.append((center х, center у)) # Отрисовка прямоугольника на кадре cv2.rectangle(frame, (х, у), (х + w, у + h) , (С, 255, 0), 2) # Отрисовка траектории for i in range(l, len(trajectory)): cv2.1ine(frame,trajectory[i - 1],trajectcry[i], (255, 0, 0), 2) cv2.imshow('Отслеживани ’ , frame) if cv2.waitKey(1) & OxFF == ord(' p): break cap.release () cv2.destroyAllWindows() Основной функционал программы включает в себя отслеживание движу- щегося объекта на видеопотоке с использованием трекера KCF. Программа также сохраняет и отображает траекторию движения объекта на кадре. Здесь применены следующие принципы и методы анализа движения объекта: 1. Отслеживание объекта. Программа начинает с выбора пользователем прямоугольной области (RO1), представляющей объект, который требу- ется отследить. Затем используется трекер KCF для отслеживания этой области на последующих кадрах видеоиогока. 2. Извлечение координат объекта. Координаты прямоугольной области, представляющей объект, обновляются на каждом кадре видеопотока. Программа использует эти координаты для отображения прямоуголь- ника, представляющею текущее положение объекта. 3. Сохранение и визуализация траектории. Программа сохраняет коорди- наты центра объекта на каждом кадре в список trajectory. Затем она ис- пользует эти координаты для отображения траектории объекта на кадре видеопотока. Это визуальное представление траектории помогает ана- лизировать, как объект двигается в пространстве. В программе переменная trajectory-[J производит инициализацию списка для хранения координат центра объекта на каждом кадре. Строки cen- ter x-x+w//2 и center y-y+h//2 вычисляют координаты х, у центра прямоуголь- ника. После чего командой trajectory. append((center х, center у)) координаты
центра добавляются в список траектории. Это позволяет далее обрисовать линию траектории движения между текущим и последующим кадром cv2.line(frame, trajectory/i ~ trajectory! ij (255, Ф, 2). Результаты работы такой программы представлены на рис. 7.8. Рисунок 7.8 - Результат работы программы «анализ траектории движения объекта» Как видно, программа работает и демонстрирует стабильность удержания объекта в любых положениях и ориентации в пространстве. Кроме того, про- грамма обрисовывает след траектории, который в дальнейшем может быть по- лезным для анализа динамических характеристик объекта. ПРАКТИЧЕСКОЕ ЗАДАНИЕ Задание /. Провести сравнительный анализ не менее 3 любых трекеров. Результаты занести в сравнительную таблицу. Каждом трекеру присвойте свой балл стабильности от 0 до 10. Сделайте это максимально субъективно. В конце напишите вывод.
Трекер 1 Трекер 2 Трекер 3 Стабильность удержания объекта при его перемещении Стабильность удержания объекта при его вращении и переворотах Стабильность удержания при тряске с частотой 1 Гц Стабильность удержания при тряске с частотой 3 4 Гц Стабильность удержания при кратковременной потере объекта (0,5 с) Стабильность удержания при кратковременной потере объекта (1с) Стабильность удержания при сильном затемнении объекта Стабильность удержания при частичном перекрытии объекта Задание 2. Повторите текст программы, предложенной ниже, на компью- тере. Запустите ее и проанализируйте ее работу. Опишите функционал работы программы. Замените предложенные трекеры и повторите процедуру. Обратите внимание как влияет на работу программы ROI. import cv2 tracker types = ['KCF*, 'CSRT’, 'MIL’] trackers = [] # Инициализация трекеров for tracker_type in tracker types: if tracker_type «« 'KCF’: tracker = cv2.TrackerKCF_create() elif tracker_type == 'CSRT': tracker = cv2.TrackerCSRT create() elif tracker_type == 'M ’: tracker = cv2.TrackerMIL_create() else: print( »Неи: c .л .m >i ке _ : tracker^ type f») sys.exit(1) trackers.append(tracker) # Захват видео с камеры video_capture = cv2.VideoCapture(0)
tracker colors = [(0, 255, 0), (), 0, 255), (255, 0, J)] tracker_names = ['KCF acker', 'CSRT 'racker', 'MIL zker'j init_bbox = None init_tracking = False while True: ret, frame = video capture.read() if not ret: break if not init_tracking: init_bbox = cv2.selectROI(«Multi-Tracker Initializer an», frame, fromCenter=False, showCrosshair=True) init_tracking = True for tracker in trackers: tracker.init(frame, init_bbox) for i, tracker in enumerate(trackers): ok, bbox = tracker.update(frame) if ok: pl = (int(bbox[0]), int(bbox[1])) p2 = (int(bbox[C] + tbox[2]), int(bbox[l] + bbox[J])) cv2.rectangle(frame, pl, p2, tracker colors[i], 2) cv2.putText(frame, trackernames [ J.] , (pl [J] , pl[l] - IC) cv2.FONT HERSHEY SIMPLEX, 0.5, tracker_colors[i], 2) else: cv2.putText(frame, «Трекер не может продолжать отслежи- э»,(100, 80),cv2.FONT_HERSHEY SIMPLEX, 0.75, (0, 0, 255), 2) # Отображение кадра cv2.imshow('Multi-Tracker’, frame) # Обработка событий клавиатуры if cv2.waitKey(1) & OxFF = 27: If ESC break # Освобождение ресурсов video capture.release() cv2.destroyAllWindows()
8. ГЛУБОКОЕ ОБУЧЕНИЕ И НЕЙРОННЫЕ СЕТИ 8.1. Введение в глубокое обучение Глубокое обучение - это попытка обучить компьютер «понимать» мир во- круг себя, используя данные. Представьте, что вы показываете машине много фотографий с кошками и собаками, и говорите ей, какая фотография содержит кошку, а какая собаку. Сначала машина может не понимать, что такое кошка или собака, но постепенно, с каждой новой фотографией, она начинает замечать об- щие черты, которые отличают кошек от собак. Глубокое обучение использует нейронные сети, которые похожи на мозг человека. Эти нейронные сети состоят из множества нейронов, которые обраба- тывают информацию, подобно тому, как работают нервные клетки в нашем мозге. Когда вы учите нейронную сеть, вы фактически настраиваете параметры этих нейронов, чтобы они могли лучше распознавать образы или паттерны в дан- ных. Главное отличие глубокого обучения от других методов машинного обу- чения - это его способность автоматически извлекать признаки из данных. В предыдущих методах вам приходилось ручным образом выбирать и создавать признаки, которые потом использовались для обучения модели. Но в глубоком обучении нейронная сеть сама находит наиболее важные признаки для решаемой задачи, что делает процесс более эффективным и менее зависящим от человече- ского фактора. Это подходит для различных задач, от распознавания образов и речи до автоматического перевода текста и управления автомобилем без водителя. В ос- нове этого лежит идея обучения на больших объемах данных, что позволяет мо- дели выявлять сложные зависимости и паттерны, которые человек может пропу- стить или не заметить. Глубокое обучение имеет широкий спектр применений и становится все более распространенным в различных сферах, благодаря своей способности об- рабатывать огромные объемы данных и выявлять скрытые закономерности, ко- торые могут помочь в решении различных задач.
Рисунок 8.1 - Пример демонстрации результатов обнаружения объектов с помощью обученной нейронной сети в компьютерном зрении Для полного понимания того, как работает глубокое обучение и почему оно так эффективно в решении различных задач - от распознавания образов до автоматического перевода текста - важно разобрат ься в его основных принци- пах. Эти принципы являются ключом к пониманию того, как нейронные сети из- влекают информацию из данных и принимают решения на основе этой инфор- мации. К основным принципам глубокого обучения относят: нейронные сети, обу- чение на больших данных, автоматическое извлечение признаков, использова- ние многослойных архитектур и обратное распространение ошибки. Нейронные сети. Глубокое обучение использует компьютерные модели, называемые нейронными сетями, которые похожи на мозг человека. Нейронные сети состоят из множества нейронов, как пазл, где каждый нейрон отвечает за определенный аспект задачи. Например, если мы хотим научить нейронную сеть распознавать лица, каждый нейрон может быть ответственным за определенные черты лица, такие как форма глаз или улыбка. Обучение на больших данных. Для того чтобы нейронная сеть научилась хорошо выполнять задачу, ей нужно показать много примеров. Когда мы учим нейронную сеть распознавать кошек, мы даем ей много фотографий с кошками. Так она начинает понимать, что такое кошка, улавливая общие черты на всех этих фотографиях. Автоматическое извлечение признаков. Главная сила глубокого обучения заключается в том, что нейронная есть может сама находит ь важные признаки в данных. Например, если мы показываем ей много изображений кошек, она мо- жет сама выявить общие черты кошек, такие как уши или хвост, даже если мы сами не говорим ей, что искать.
Использование многослойных архитектур. Глубокие нейронные сети со- стоят из множества слоев, как башни из кирпичей. Каждый слой преобразует ин- формацию на своем уровне абстракции. Например, в сети для распознавания лиц первый! слой может определять края, второй слой - формы, а третий - уникаль- ные черты лица. Обратное распространение ошибки. Когда мы учим нейронную сеть, мы показываем ей примеры и говорим, какие ответы правильные, а какие нет. Сна- чала она делает ошибки, но затем корректирует свои действия, чтобы стано- виться все точнее и точнее. Хочется отметить, что нейронные сети в компьютерном зрении играют важную роль и нашли применение в различных областях. Они используются в автомобильной промышленности для систем помощи водителю и автопилотов, в медицине для анализа медицинских изображений и диагностики заболеваний, в системах безопасности для обнаружения подозрительной активности, а также в промышленности для контроля качества и автоматизации процессов производ- ства. Нейронные сети позволяют компьютерам понимать и анализировать изоб- ражения так же, как это делает человек, что делает их незаменимыми во многих задачах, связанных с компьютерным зрением. I Приведем несколько примеров: • автоматическое распознавание номерных знаков на дорожных транс- портных средствах для систем контроля скорости или безопасности на дороге; • автоматическое обнаружение и классификация дорожных знаков, таких как знаки ограничения скорости или указатели направлений, для по- мощи водителям в навигации и соблюдении правил дорожного движе- ния; • мониторинг трафике! на перекрестках и дорогах с помощью анализа ви- деопотока для оптимизации управления светофорами и предотвращения заторов; • автоматическое обнаружение и отслеживание пешеходов на тротуарах и дорогах для систем предупреждения о нарушениях безопасности или автоматического торможения автомобилей; • автоматическое анализирование изображений с камер видсонаблюде- ния для обнаружения подозрительной или неправильной активности в общественных местах, таких как аэропорты, торговые центры или ста- дионы; • определение и классификация дефектов на производственной линии, та- ких как дефекты на поверхности деталей или сборочных элементов, с целью обеспечения качества продукции; • автоматическое анализирование медицинских изображений, таких как рентгеновские снимки или снимки МРТ, для диагностики заболеваний или аномалий внутренних органов. В компьютерном зрении широко применяются различные типы нейронных сетей, включая:
Сверточные нейронные сети (Convolutional Neural Networks, CNNs), кото- рые особенно эффективны для анализа изображений благодаря способности об- наруживать иерархические признаки на разных уровнях абстракции, начиная с простых форм и текстур и заканчивая более сложными концепциями, такими как объекты и сцены. Глубокие нейронные сети (Deep Neural Networks, DNNs) являются общим термином для нейронных сетей с несколькими слоями. В задачах компьютерного зрения глубокие нейронные сети могут использоваться для классификации изоб- ражений, детекции объектов, сегментации изображений и других задач. Рекуррентные нейронные сети (Recurrent Neural Networks, RNNs). Хотя CNNs являются доминирующей архитектурой для анализа изображений, RNNs могут использоваться для обработки последовательных данных в задачах, таких как распознавание текста в изображениях или описании изображений. Сети с архитектурой «трансформера» (1 ransformer-based architectures). Трансформеры получили широкое применение в обработке естественного языка, но они также могут быть применены к задачам компьютерного зрения, особенно в контексте сегментации и генерации изображений. Генеративные состязательные сети (Generative Adversarial Networks, GANs). Эти сети используются для генерации новых изображений на основе обу- чающих данных. Они могут использоваться для создания реалистичных изобра- жений лиц, объектов, сцен и многого другого. В зависимости от конкретной задачи и требований различные архитектуры нейронных сетей могут быть применены для решения задач компьютерного зре- ния. 8.2. Сверточная нейронная сеть С верточная нейронная сеть (CNN) - это тип искусственной нейронной сети, который был вдохновлен тем, как работает зрительная система живых су- ществ. таких как люди и животные. Она широко используется для решения задач в области компьютерного зрения, таких как распознавание объектов на изобра- жениях, классификация изображений, обнаружение объектов и другие. Основная идея CNN заключается в том, чтобы позволить сети самой изу- чать ключевые признаки изображений, вместо того чтобы они были явно заданы. Она это делает, используя операцию, которая называется свертка. Основные компоненты сверточной нейронной сети (рис. 8.2): 1. Слой свертки (входной слой). Этот слой использует небольшие фильтры (ядро), чтобы скользить по входному изображению и вычислять свертку. Это позволяет обнаруживать различные признаки, такие как грани, углы и текстуры. 2. Слой объединения (скрытый слой). После слоя свертки обычно следует слой объединения. Этот слой уменьшает размерность пространства при- знаков. уплотняя их и выделяя наиболее важные признаки.
3. Полносвязные слои {выходной слой). После нескольких слоев свертки и объединения данные обычно подаются на полносвязные слои, которые используются для классификации или выполнения других задач. Между входным и выходным слоями в нейронной сети обычно располага- ется несколько скрытых слоев. На изображении (рис. 8.2) показан только один скрытый слой из 5 нейронов, однако в большинстве нейронных сетей присут- ствует несколько скрытых слоев с большим количеством нейронов. Каждый из этих слоев имеет свою определенную цель. Например, второй слой (первый скрытый слой) может быть настроен на распознавание контуров животного, тре- тий слой - определенных форм (например, кругов), четвертый слой - отдельных частей животного (например, глаза и зрачки), а последний (выходной) слой - на определение, является ли изображение кошкой или собакой, исходя из характе- ристик этих частей. Скрытый слой Рисунок 8.2 - Структура сверточной нейронной сети Когда мы решаем задачу классификации изображений, например, опреде- ление, содержит' ли изображение кошку или собаку, традиционные методы про- граммирования могут оказаться недостаточными. Например, попытка опреде- лить животное по признакам, таким как форма ушей и острота когтей, может быть неэффективной из-за многообразия вариантов и исключений. Сверточные нейронные сети призваны решить эту проблему, имитируя ра- боту зрительной системы человека. Они обучаются извлекать важные признаки изображений на основе набора данных, состоящего из пар «изображение - метка класса» (например, кошка или собака). CNN состоят из нескольких слоев, включая сверточные слои, которые ска- нируют изображение с помощью небольших фильтров, выделяя различные при- знаки, такие как грани и текстуры. Затем следуют слои объединения, которые уменьшаю*! размерность признакового пространства, сохраняя ключевые харак- теристики. В конце обычно находятся полносвязные слои, которые использу- ются для классификации. Сверточные нейронные сети автоматически изучают иерархию признаков изображений, начиная с низкоуровневых, таких как грани, и заканчивая более
высокоуровневыми, такими как формы и объекты. Это делает их мощным ин- струментом для решения задач компьютерного зрения, таких как распознавание объектов на изображениях. Рассмотрим пример работы CNN. Для облегчения работы сделаем так, чтобы машина анализировала только черно-белые фотографии (рис. 8.3). Пред- положим, что мы подаем на вход изображение размером 32 х 32 пикселя, что составляет в сумме 32 х 32 = 1024 пикселей (на рисунке изображение увеличено в несколько раз для наглядной демонстрации работы над пикселями). Каждый из этих пикселей кодирует уровень яркости серого от 0 до 255, где 0 представляет собой черный цвет, а 255 - белый. 206 Рисунок 83 - Пример работы CNN: входное изображение Таким образом, входной слой будет состоять из 1024 нейронов е активаци- ями, выстроенными в линию, или из массива (списка) из 1024 чисел. Что происходит, когда размер изображения не соответствует 32x32 пиксе- лям? Входной слой нейронной сети имеет определенный размер, что означает, что он способен анализировать только изображения размером 32x32 пикселя. Если передаваемое изображение больше этого размера, мы можем настроить оборудование для анализа только центральной области изображения 32x32 пик- селя, либо уменьшить все изображение до нужною размера. В случае, если изображение меньше, чем 32x32 пикселя, мы можем увеличить его до соответ- ствующих размеров или просто проигнорировать для анализа. Конечно, число 32 выбрано произвольно и при необходимости можно изменить размер вход- ных данных. Исследования показали, что анализ квадратных участков изобра- жения (например, 64x64 вместо, скажем, 64x70) обычно даст лучшие резуль- таты, поэтому обычно предпочтительно оставаться при анализе квадратных об- ластей. Применим к этому изображению ядро резкости размером 3Х3
О -1 О' -1 5 -1 . О -1 О. Эта процедура нам уже знакома (раздел 5.6 «Фильтрация»). Далее для каж- дого блока из 3x3 пикселей на изображении (рис. 8.4) мы умножаем каждый пик- сель на соответствующий элемент ядра, а затем суммируем их (рис. 8.4). Эта сумма становится новым пикселем на изображении справа (рис. 8.4). Если мы внимательно разбирались с теорией работы цифрового фильтра, в частности, раздела 5.6.2 «Ядро фильтра» этого пособия, нам не составит слож- ностей понять эту процедуру. Рисунок 8.4 - Применение ядра 3x3 для вычисления нового значения пикселя Один из вопросов этого процесса: что делать по краям изображения? Например, верхний левый угол входного изображения имеет только три соседа. Один из способов исправить это - расширить значения края на единицу в исходном изображении, оставив при этом новое изображение того же размера. В этой демонстрации мы вместо этого игнорируем эти значения, сделав их чер- ными.
Таким образом ядро 3*3 скользит последовательно по всему изображению, преобразуя пиксели в обновленный вид, до тех пор, пока всё изображение не бу- дет преобразовано и получено новое изображение. Полученное изображение называется карта признаков. Карта признаков (feature map) или карта объектов -это результат приме- нения сверточного слоя в сверточной нейронной сети к входным данным. Как мы увидели в примере, каждая карга признаков представляет собой двумерный массив, где каждый элемент (пиксель) отражает активацию определенного нейрона в сверточном слое на конкретном участке входного изображения. Отметим, что в результате работы первого сверточного слоя может по- явиться от одного до нескольких карт признаков. В этом случае слой применяет несколько различных ядер, как в примере, показанном на рис. 8.5. Рисунок 8.5 - Применение свертки с четырьмя разными ядрами Ниже представлен программный код, который поможет понять принцип ра- боты операции свертки на изображении и влияния ядра фильтра на результиру- ющий кадр. Для этого в библиотеке OpenCV применяется функция cv2filter2D(). Данная функция используется для применения произвольного ядра (филь- тра) к изображению. Она выполняет операцию свертки между ядром и изобра- жением. import cv2 import numpy as np cap= cv2.VideoCapture(0) # Функция для применения ядра sharpen def sharpen frame(frame): kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
sharpened_frame = cv2.filter2D(frame, -1, kernel) return sharpened frame while True: ret,frame=cap.read() # Преобразование изображения в оттенки серого gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Применение ядра sharpen к оттенкам серого sharpened_gray_framee = sharpen_frame(gray_frame) # Вывод изображения cv2 . imshow (' Ci L< line.1 ’ , frame) cv2.imshow(’ ' rertka’, sharpened gray_framee) if cv2.waitKey(1)&0xFF==ord('q'): break cap.release() cv2.destroyAllWindows() Следующим слоем CNN в после свертки является слой объединения. Слой объединения в сверточной нейронной сети служит для уменьшения простран- ственных размерностей карт признаков, полученных после применения сверточ- ных слоев. Он выполняет это путем агрегации информации из различных обла- стей исходной карты признаков. В этом слое отбрасываются части изображения, оставляя наиболее важные участки. Это делается в первую очередь, чтобы уменьшить степень переобуче- ния, а также ускорения вычислений. Этот процесс называется пудинг. 11а этом этапе берется другое ядро, которое перемещается по полученной карте объектов, где происходит агрегация информации в каждой области, покры- ваемой ядром. Эта агрегация обычно выполняется путем вычисления какой-либо статистики (например, максимального значения, среднего значения и т. д.) на ос- нове значений признаков в данной области. Стоит заметить, что распространенными размерами ядер пудинга являются 2x2 и 3Х3. Поскольку наше ядро сверточного слоя имеет размер 3Х3, то типич- ный выбор для размера ядра пудинга будет 2x2. Когда ядро пудинга перемещается по карте объектов, оно обычно двига- ется с определенным шагом (называемым шагом пудинга), что позволяет охва- тить все участки изображения без перекрытия. После того, как ядро обработает все участки, оно перемещается дальше до тех пор. пока не пройдет всю карту объектов. В результате каждая область изображения сокращается до одного значения или набора значений в соответствии с выбранной статистикой. Эти значения об- разуют новую карту признаков меньших размеров, которая представляет собой упрощенное представление исходной информации (рис. 8.6).
Рисунок 8.6-Демонстрация процесса пулинга изображения Рассмотрим пошагово процедуру пулинга с ядром размером 2x2 и шагом 2: / шаг. Первое, что мы делаем, - это выбираем область изображения, кото- рую мы будем обрабатывать. Для операции макс-пулинга это обычно прямо- угольник размером с ядро пулинга. В нашем случае ядро 2x2, которое начинает ход с верхнего левого угла и захват ывает четыре пикселя. 2 шаг. Затем мы выбираем самый большой пиксель из этой области. Это и будет значение для результирующего пикселя. 3 шаг. После того как мы вычислили значение для текущей области, мы двигаемся вправо на шаг пулинга. В нашем случае шаг пулинга равен 2, так что мы переходим к следующему набору пикселей, повторяя шаги 1 и 2. 4 шаг. Мы продолжаем этот процесс, пока не дойдем до конца строки. Затем мы переходим на следующую строку и повторяем процедуру. 5 шаг. Когда мы закончим применять операцию пулинга ко всем областям изображения, мы получим новое изображение, размер которого меньше исход- ного, но при этом сохранены его ключевые признаки. Этот процесс позволяет уменьшить размерность карт признаков, сохраняя важные характеристики изображения и обеспечивая инвариантность к незначи- тельным изменениям в расположении объектов на изображении. Таким образом, пулинг помогает улучшить производительность и эффективность сверточных нейронных сетей. Далее, после операции пулинга, добавляют еще один (точно такой же) блок, состоящий из сверточных слоев и слоев пулинга. Этот блок будет работать с данными, которые уже были обработаны предыдущими слоями, позволяя мо- дели извлекать более абстрактные признаки из изображения. Этот процесс (свертка-пулинг) обычно повторяется несколько раз, образуя так называемые блоки сверточных слоев (рис. 8.7).
16x16 Свертка 1 ly.ninn 8x8 Рисунок 8.7 - Повторная процедура свертка-пулинг После каждого такого блока обычно уменьшается размерность данных, что помогает снизить вычислительную сложность и предотвратить переобучение. Однако количество блоков и их характеристики (например, количество слоев в каждом блоке, размер ядер свертки и пулинга) могут быть различными в зави- симости от архитектуры нейронной сети и конкретной задачи. На этапе, когда размеры карт признаков становятся относительно неболь- шими (например, 8^8). дальнейшая свертка и пулинг могут привести к потере информации из-за уменьшения размерности и сглаживания изображения. Вместо этого в этой точке может быть более эффективным использование полносвязных слоев для дальнейшей обработки данных и выполнения задачи классификации или других задач обработки изображений. Тем не менее, в некоторых архитектурах нейронных сетей или для опреде- ленных задач может быть целесообразным продолжить свертку и пулинг даже на более поздних этапах. Например, в случае обработки изображений с очень высоким разрешением или для выполнения сложных задач, таких как обнаруже- ние объектов на изображении, можно продолжать свертку и пулинг на более поздних этапах. Однако это требует тщательного анализа и выбора оптимальной архитектуры сети в зависимости от кон крез ной задачи. Когда данные проходят через последний сверточный слой и слой пулинга и достигают карт признаков меньших размеров (в нашем случае карта признаков 8x8), их можно передать через полносвязные слои нейронной сети. Этот этап включает несколько шагов: 1. Разглаживание данных. Карты признаков, полученные после последнего пулинга. имеют двумерную структуру. Прежде чем передать их в полно- связные слои, необходимо разгладить их в одномерный вектор. Это де- лается путем вытягивания всех значений карг признаков вдоль про- странственных размерностей. Например, если карта признаков имеет размер 8x8 и содержит 64 признака, она будет преобразована в одномер- ный вектор длиной 64 (рис. 8.8). 8x8 Разглаживание данных Одномерный массив значений пикселей: [[255 254 0 254 255 255 240 255] 1 е 255 е 3 2 © 255 253] [141 Р 4 А А 255 1 255] ( е 255 251 255 е 254 249 253] ( i 254 253 254 255 1 255 255] [252 е 179 3 0 252 254 255] [ 3 254 3 е 255 255 0 1] [254 255 253 255 255 1 1 93]] Рисунок 8.8 - Разглаживание данных карты признаков
2. Передача через полносвязные слои. Полученный одномерный вектор данных передается через один или несколько полносвязных слоев нейронной сети. Каждый нейрон в полносвязном слое соединен с каж- дым нейроном предыдущего слоя. В полносвязных слоях нейроны обра- батывают входные данные с использованием весов и смещений, а также функций активации, чтобы выделить важные признаки и сформировать окончательное представление данных. Поясним этот процесс. После того, как данные были разглажены в одно- мерный вектор, этот вектор передается через один или несколько полносвязных слоев нейронной сети. В полносвязных слоях каждый нейрон соединен со всеми нейронами предыдущего слоя. Это означает, что каждый элемент входного вектора будет иметь весовые коэффициенты и смещения для каждого нейрона в следующем слое. В процессе передачи через эти слои данные подвергаются обработке с ис- пользованием весов и смещений. В результате этой обработки нейроны выде- ляют важные признаки и формируют окончательное представление данных. Для каждого нейрона в полносвязном слое выполняется следующий про- цесс: а) 11а вход подается одномерный вектор данных х. б) Каждый элемент этого вектора умножается па соответствующий ему ве- совой коэффициент И'. в) Затем к каждому результату прибавляется смещение Л. г) Полученные значения 7 подаются на вход функции активации, которая определяет, какой сигнал будет передан дальше. Математически полносвязный слой может быть описан следующей форму- лой: у = activation(W • х + Ь), где у- выходные данные слоя; х - входные данные (вектор), полученные из предыдущего слоя; Иг- матрица весов, которая соединяет входные и выходные данные; b - вектор сдвига, который добавляется к выходным данным; activation - функция активации, которая применяется к выходным данным, чтобы добавить нелинейность. Этот процесс повторяется для каждого нейрона в полносвязном слое, фор- мируя окончательное представление данных, которое затем может быть исполь- зовано для выполнения задач, таких как классификация или регрессия. 3. Использование функций активации. В полносвязных слоях нейронной сети обычно применяются функции активации, такие как ReLU(Rectified Linear Unit) или Sigmoid, чтобы внести нелинейность в модель, что поз- воляет нейронным сетям улавливать более сложные зависимости между данными и делать более точные предсказания. Вот простое объяснение двух распространенных функций активации: ReLU - эта функция активации определяется как /(х) = тах(0,х). Она означает, что если входное значение х положительное, то оно остается без из-
менений, а если оно отрицательное, то становится равным нулю. Это простая функция, которая быстро вычисляется и хорошо подходит для обработки гради- ентов во время обучения. 1 Sigmoid - эта функция активации определяется как /(х) = ^на ПРИ” нимает любое вещественное число в качестве входа и сжимает его в диапазоне от 0 до 1. Это означает, что она используется, когда нужно предсказать вероят- ность для двоичной классификации, например, отнесение объекта к одному из двух классов. Как было сказано выше, эти функции активации добавляют нелинейность в модель, позволяя нейронным сетям выявлять сложные паттерны и зависимости в данных. Без нелинейности нейронные сети были бы ограничены линейными преобразованиями, что значительно снизило бы их способность к выделению важных признаков и решению сложных задач. 4. Финальный слой. Последний полносвязный слой, как правило, является выходным слоем нейронной сети. Для задачи классификации изображе- ний этот слой обычно содержит количество нейронов, соответствующее количеству классов, которые необходимо классифицировать. Каждый нейрон на выходном слое представляет вероятность принадлежности к определенному классу, а функция активации (например. Softmax) преоб- разует эти значения в вероятности. Например, если у нас есть 10 классов, то на этом слое будет 10 нейро- нов. Каждый нейрон на этом слое представляет вероятность принадлежно- сти входного изображения к определенному классу. Это означает, что выход- ные значения нейронов могут рассматриваться как вероятности для каждого класса. Чтобы преобразовать эти значения в вероятности, обычно используется функция активации, такая как Softmax. Softmax принимает выходные значения нейронов и преобразует их так, чтобы все значения были неотрицательными, и чтобы их сумма составляла 1. Это обеспечивает правильное представление веро- ятностей для каждого класса. Таким образом, финальный слой нейронной сети принимает выходы предыдущих слоев и преобразует их в вероятности принадлежности к каждому классу, что позволяет сети делать предсказания о классе, к которому принадле- жит входное изображение. 5. Обратное распространение ошибки и обучение. После того как данные прошли через полносвязные слои, нейронная сеть оценивает, насколько хорошо ее предсказания соответствуют ожидаемым меткам классов. За- тем используется алгоритм обратного распространения ошибки для кор- рекции весов и смещений в сети с целью улучшения ее производитель- ности и повышения точности предсказаний. Цель этого процесса - минимизировать ошибку предсказания, чтобы сеть стала более точной. Путем многократного обновления весов и смещений на ос- нове градиентов функции потерь нейронная сеть постепенно «учится» находить оптимальные параметры для данной задачи.
Таким образом, этап использования полносвязных слоев нейронной сети позволяет модели выполнить окончательную обработку данных и сделать окон- чательные предсказания или решения в соответствии с поставленной задачей!. 8.3. Рекуррентная нейронная сеть Рекуррентные нейронные сети (RNN) - это класс нейронных сетей, спо- собных анализировать последовательные данные, сохраняя внутреннее состоя- ние, которое позволяет им учитывать контекст и зависимости в данных. В этом разделе мы рассмотрим основные принципы работы рекуррентных нейронных сетей, их архитектуру и применение в различных задачах компьютерного зрения. Рекуррентные нейронные сети обладают способностью обрабатывать по- следовательные данные любой природы, будь то текст, временные ряды или ви- део. Они состоят из повторяющихся блоков, каждый из которых имеет входные данные, выходные данные и внутреннее скрытое состояние. Основное отличие RNN от других типов нейронных сетей заключается в их способности использовать информацию из предыдущих шагов в расчетах на текущем шаге. Это позволяет им учитывать контекст и последовательные зави- симости в данных. Предположим, у нас есть задача распознавания жестовых символов в ре- альном времени с помощью камеры. Это может быть полезно, например, для управления устройствами без использования рук. На первом временном шаге RNN получает изображение текущего кадра с камеры в качестве входных данных. Затем RNN принимает следующий кадр из видеопотока. учитывая инфор- мацию о предыдущем кадре благодаря своей рекуррентной архитектуре. Этот процесс повторяется для каждого кадра видеопотока, позволяя RNN анализировать последовательность движений и распознавать жестовые символы. Или рассмотрим пример задачи сегментации объектов на видеозаписи. Например, мы хотим автоматически выделить и отследить движущиеся объекты на дорожной камере для мониторинга дорожного движения. На первом временном шаге RNN принимает первый кадр видеозаписи в качестве входных данных. Затем RNN принимает следующий кадр видеозаписи, используя информа- цию о предыдущем кадре для выделения и отслеживания объектов движения. Этот процесс повторяется для каждого кадра видеозаписи, позволяя RNN анализировать последовательность кадров и точно сегментировать объекты дви- жения. Таким образом, рекуррентные нейронные сети могут быть эффективным инструментом в задачах компьютерного зрения, позволяя анализировать и обра- батывать последовательные данные, такие как видеопотоки, с сохранением кон- текста и зависимостей между кадрами.
8.4. Распознавание объектов с использованием алгоритма каскадов Хаара Распознавание объектов с использованием OpenCV - это процесс автома- тическою нахождения и классификации объектов на изображении или видео. Это важная задача компьютерного зрения, которая нашла широкое применение в различных областях, таких как безопасность, медицина, транспорт, автомати- зация технологических процессов и многое другое. Мы уже увидели ранее, что библиотека OpenCV предоставляет множество функций и алгоритмов для обработки изображений и видео. В этом разделе рас- смотрим возможности функций этой библиотеки в области распознавании объ- ектов. Одним из основных методов распознавания объектов в библиотеке OpenCV является использование каскадов Хаара. Этот метод основан на поиске характерных признаков объекта на изображении, таких как края, углы или тек- стуры. Классификаторы Хаара представляют собой наборы шаблонов, которые обучаются на большом количестве положительных и отрицательных примеров объектов. Процесс распознавания объектов с использованием OpenCV обычно вклю- чает в себя следующие шаги: I. Загрузка изображения или видеопотока с камеры. 2. Преобразование изображения в формат, подходящий для обработки. 3. Применение классификатора или модели, обученной на определенном типе объектов. 4. Обнаружение объектов на изображении или видео. 5. Отображение результатов распознавания, например, путем обведения обнаруженных объектов прямоугольниками или другими маркерами. 6. Дополнительная обработка результатов, если это необходимо, напри- мер, определение дополнительных характеристик объектов или их клас- сификация. В результате успешного распознавания объектов можно получить инфор- мацию о их положении, размере, форме, а также сделать выводы о том, какие объекты присутствуют на изображении или в видеопотоке. Для использования классификатора Хаара в OpenCV сначала нужно загру- зить предварительно обученньп'1 классификатор с диска или из библиотеки OpenCV, а затем применить его к изображению или кадру видео. Этот процесс может быть выполнен с помощью функции detectMultiScalefi. Эта функция поз- воляет обнаружить объекты различного размера на изображении. После применения классификатора на изображении мы получаем коорди- наты (х. у, и\ /?) прямоугольника, который описывает обнаруженный объект. Здесь (х, - это координаты верхнего левого угла прямоугольника, а (ж, Л) - его ширина и высота соответственно. Что же такое классификатор? Давайте рассмотрим один простой пример.
Предположим, у нас есть классификатор, который обучен определять, явля- ется ли число на изображении четным или нечетным. Это может быть очень про- стой классификатор, но он поможет проиллюстрировать основные принципы. Наш классификатор будет использовать всего одну весовую функцию. Да- вайте представим, что эта функция просто проверяет, делится ли число на два без остатка. Если число делится на два, классификатор будет считать его четным, иначе - нечетным. Л вот немного сложнее пример классификатора. Давайте представим, что у нас есть классификатор для определения типа фрукта на изображении. Допу- стим, мы хотим классифицировать фрукты как «яблоко» и «банан». Наш класси- фикатор использует несколько весовых функций для принятия решения: • функция, которая проверяет наличие красного цвета (для яблок). • функция, которая проверяет наличие желтого цвета (для бананов). • функция, которая проверяет форму (например, круглая форма для яблок и удлиненная форма для бананов). В этом примере каждая весовая функция отвечает за определенный аспект объекта (цвет или форма), и классификатор объединяет результаты этих функций для принятия окончательного решения о том, какой тип фрукта присутствует па изображении. Таким образом сделаем вывод, что классификатор в контексте машинного обучения и компьютерного зрения представляет собой программу или алгоритм, который анализирует признаки объекта (например, цвет, форма, текстура и т. д.) и принимает решение о его принадлежности к определенному классу или категории. Для полного понимания алгоритма Хаара необходим рассмотреть, как же все-таки происходит распознавание того или ино1 о объекта изображения. Для этого используются признаки Хаара (также их называют окна Хаара или фильтры Хаара). Признаки Хаара представляют собой окна различных раз- меров и форм, которые перемешаются но изображению. Эти признаки представ- ляют собой простые шаблоны, которые измеряют различия в яркости между смежными областями изображения. Примерами признаков Хаара могут быть прямоугольные окна, покрывающие области с разными сочетаниями светлых и темных пикселей (рис. 8.9). Рисунок 8.9 - Пример набора фильтров Хаара
Алгоритм Хаара использует этот набор прямоугольных черно-белых обла- стей, называемых фильтрами Хаара, которые представляют собой шаблоны для выявления текстур и форм объектов на изображениях. 11ри сканировании изоб- ражения каждый фильтр Хаара оценивает сходство текущей области с образцом, представленным фильтром. Затем для каждой области изображения алгоритм вычисляет разницу между суммой яркостей! пикселей в белой! и черной областях фильтра, формируя признаки для определения объектов. Применяется пороговое значение, чтобы определить, является ли область объектом интереса. Области, которые превышают порог, считаются объектами и объединяются для получения более точной информации о расположении и форме объекта. Для выделения, например, человеческого лица (рис. 8.10) с помощью алго- ритма Хаара. можно использовать различные признаки, которые характеризуют особенности лиц: Рисунок 8.10 - Исходное изображение Глаза. Глаза обычно представляются как относительно темные области в верхней части лица с более светлой областью вокруг них. Фильтры Хаара могут обнаруживать глаза по наличию вертикальных границ между более светлыми и темными областями. Нос, Нос обычно представлен яркой областью между глазами, но ниже них. Фильтры Хаара могут выявлять нос по наличию горизонтальной границы между более светлой областью над носом и более темной областью под носом. Также, по всей длине носа вертикально светлая часть, а по бокам от носа верти- кальные темные части. Рот. Рот обычно представлен яркой областью ниже носа. Фильтры Хаара могут выявлять рот по наличию горизонтальной границы между более светлой областью над ртом и более темной областью под ртом. Брови. Ьрови обычно представлены темными областями над глазами. Фильтры Хаара могут выявлять брови по наличию горизонтальной границы между более темной областью бровей и более светлой областью лба. Лицевые контуры. Контур лица может быть выделен с помощью фильтров, которые обнаруживают границы между лицом и фоном, например, границы между лицом и волосами или между лицом и шеей.
На рисунке 8.11 приведен пример распределения фильтров Хаара на изоб- ражении с лицом. Рисунок 8.11 - Фильтры Хаара на изображении 11редставьте, что у нас есть фильтр Хаара, представляет собой прямоуголь- ную область. Этот фильтр выделяет горизонтальный светлый участок, соответ- ствующий глазам, и более темный участок ниже, который соответствует нижней части глаза. Когда этот фильтр применяется к изображению лица, он скользит по изображению, и для каждой области вычисляется разница между суммой ярко- стей пикселей в черных и белых областях фильтра. Если область содержит глаза, то разница в яркости между верхней и нижней частями области будет заметной. Верхняя часть обычно светлее из-за белка глаза или выпуклости глазного яблока, а нижняя - темнее из-за теней под глазами и глазной впадины. Это приводит к высокому значению признака для этой области, что может быть интерпретиро- вано алгоритмом как наличие глаза. Таким образом, фильтры Хаара, анализируя различия в яркости в разных частях области, могут помочь выявить особенности, характерные для лица чело- века, такие как глаза, брови и нос. Идеальньн! фильтр Хаара, имеет четкую структуру, где верхняя половина области светлее, а нижняя половина темнее. Однако в реальных изображениях мы редко встречаем такую четкую структуру из-за различных факторов, таких как освещение, тени, шум и другие артефакты. Поэтому на реальных изображе- ниях фрагменты, обнаруженные с использованием фильтра Хаара, могут иметь более сложные и менее четкие структуры, чем идеальные примеры. Пример иде- ального и реального фрагмента глаза, обнаруженного на изображении, представ- лен на рис. 8.12. После получения областей с помощью фильтра Хаара одним из способов определения наличия объекта в области является вычисление разницы в яркости между черной (темной) и белой (светлой) частями области. Для этого можно вы- полнить следующие шаги: 1. Вычислить среднее значение яркости пикселей в белой области. 2. Вычислить среднее значение яркости пикселей в черной области. 3. Вычесть значение средней яркости белой области из значения средней яркости черной области.
221 234 234 221 234 192 222 192 51 28 50 95 128 96 150 тт ~ v Значения, обнаруженные 11деальнын фильтр Хаара на изображении Рисунок 8.12 - Идеальные и реальные значения, полученные фильтром Хаара Математически это выглядит так: Д= white - dark = ^Ywhite1^) - ^aarklW. где /(x) - яркость пикселя; п - общее число пикселей в области. В идеальном случае (рис. 8.12, а) эта разница равна 255. В реальном же случае, в нашем примере: △= 218,75- 98,75 = 120. Чем ближе полученный результат к числу 255, тем больше вероятность того, что был обнаружен интересующий нас объект (в данном примере глаз). Также становится понятным, что мы никогда не получим 0, потом что мы имеем дело с реальным изображением, в котором черные пиксели со значением 0 и бе- лые со значением 255 в такой плотной компоновке не встречаются. Подобным образом необходимо найти все остальные признаки, по кото- рым можно идентифицировать лицо человека (глаза, брови, нос, губы и т. д.). Этот метод является одним из подходов к определению наличия объекта и может быть использован вместе с другими методами для улучшения точности обнаружения. Ниже рассмотрим пример программы применения алгоритма Хаара, кото- рый обнаруживает лицо человека на изображении. import cv2 # Загрузка предварительно обученных классификаторов для лица и глаз face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + ’haarcascade_frontalface_default.xml') # Считывание изображение imeg = cv2.imread(«lua:. pg») # Преобразование кадра в оттенки серого gray = cv2.cvtColor(imeg, cv2.COLOR_BGR2GRAY) # Поиск лиц в кадре
faces = face_cascade.detectMultiScale(gray, 1.3, 5) # Отрисовка прямоугольника вокруг обнаруженных лиц for (х, у, w, h) in faces: cv2.rectangle(imeg, (x, y), (x+w, y+h) , (255, 0, 0), 2) # Отображение результата cv2.imshow(’Litsa', imeg) # Выход из цикла cv2.waitKey(0) cv2 .destroyAllWindows() Программа загружает предварительно обученный классификатор для обнаружения лиц, считывает изображение, преобразует его в оттенки серого, затем использует классификатор для обнаружения лиц на изображении. После обнаружения лиц программа отрисовывает прямоугольники вокруг каждого об- наруженного лица и выводит полученное изображение с прямоугольниками на экран. Остановимся на отдельных функциях. Строка face cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade frontalface default.xml') инициализирует переменную face cascade, используя предварительно обученный классификатор для обнаружения лиц. Она объединяет путь к каталогу с предварительно обученными моделями каска- дов Хаара (cv2.data.haarcascades) с именем файла XML для обнаружения лиц в передней части (haarcascade frontalface default.xml). То есть, данный классифи- катор обучен распознавать лица, находящиеся в положении, когда они повер- нуты к камере лицом, а не в профиль или в других нестандартных позах. В каталоге cv2.data.haarcascades обычно содержатся несколько предвари- тельно обученных моделей каскадов Хаара для обнаружения различных объек- тов. Наиболее распространенные модели включают в себя: haarcascade eye.xml: модель для обнаружения глаз; haarcascade frontalface alt.xml: вариант модели для обнаружения лиц в пе- редней позе (альтернативный); haarcascade smile.xml: модель для обнаружения улыбок; haarcascade upper body.xml: модель для обнаружения верхней части тела; haarcascade Juli body.xml: модель для обнаружения полного тела; haarcascade j>rofileface.xw/: модель для обнаружения лиц в профиль; haarcascade eye tree eyeglasses.xml: модель для обнаружения глаз с оч- ками. Стоит заметить, что это далеко не полный список моделей, представлен- ных в каталоге cv2.data.haarcascades. Результат выполнения такой программы представлен на рис. 8.13. С трока faces = face cascade.detect Mult iScaletgray, 1.3, 5) выполняет обна- ружение объектов на изображении с использованием классификатора каскадов Хаара, который был предварительно обучен для обнаружения лиц. gray - это изображение в оттенках серого, на котором мы ищем объекты (в данном случае, лица).
1.3 - это параметр scaleFactor, который определяет, насколько изображе- ние уменьшается на каждом шаге при масштабировании изображения для поиска объектов. Например, если это значение равно 1.3. то изображение будет умень- шено на 30 % на каждом шаге. 5 - это параметр minNeighbors, который определяет, сколько соседних пря- моугольников должно быть обнаружено, чтобы считать обнаруженный объект действительным. Увеличение этого значения приводит к более консервативной фильтрации объектов, уменьшая количество ложных срабатываний. Рисунок 8.13 - Результат работы программы обнаружения лиц на изображении 8.5. Обнаружение объектов в реальном времени 8.5.1. Алгоритмы YOLO 6 июля 2022 I ода стал знаковой датой в истории искусе! венного интеллекта с выходом YOLOv7. С момента своего появления YOLOv7 стал главной темой об- суждений среди разработчиков компьютерного зрения, и это не случайно. Модель уже признана важным достижением в области обнаружения объектов. Вскоре после выпуска была опубликована статья, показывающая, что YOLOv7 является самой быстрой и точной моделью обнаружения объектов в ре- альном времени. Однако в чем заключается превосходство YOLOv7 над своими предшественниками? Что делает эту модель настолько эффективной в решении задач компьютерного зрения? Для полного понимания принципов работы YOLOv7 важно понять его ос- новную цель: обнаружение объектов в реальном времени. Это ключевой элемент современных систем компьютерного зрения, стремящихся не только к иденти- фикации объектов, но и к их точной локализации на изображениях или видео в реальном времени. Это позволяет создавать приложения, способные оперативно обрабатывать информацию о мире вокруг нас.
Разработчики используют модели обнаружения объектов в реальном вре- мени для множества задач, включая наблюдение за транспортом, безопасность, медицинские приложения и автономные системы. Эти модели позволяют компь- ютерам быстро и точно распознавать объекты и ситуации, что критически важно для принятия решений в реальном времени. YOLOv7 представляет собой современную модель обнаружения объектов, достигающую высокой скорости и точности. Ее разработка и выпуск открывают новые возможности для создания более эффективных и производительных си- стем компьютерного зрения. Модели обнаружения объектов в реальном времени представляют собой значительный прогресс по сравнению с традиционными моделями обнаружения изображений. Тогда как последние ориентированы на поиск и идентификацию объектов на статичных изображениях, модели обнаружения объектов в реальном времени способны работать с видеопотоками, обеспечивая отслеживание объек- тов в движении. Эю открывае т широкий спек гр применений, включая видеоаналитику, ав- тономные транспортные средства, подсчет объектов, отслеживание нескольких объектов и многое другое. Возможность работать в режиме реального времени делает эти модели незаменимыми в сферах, где требуется оперативная и точная обработка данных для принятия решений. YOLO (You Only Look Once - «Стоит только раз взглянуть») - это семей- ство алгоритмов глубокого обучения, впервые представленное в 2016 году Джо- зефом Редмоном, которые предназначены для обнаружения объектов на изобра- жениях и в видсопотоке в реальном времени. Алгоритмы YOLO особенно из- вестны своей способностью к высокой скорости работы и точности обнаружения объектов. Основная идея YOLO заключается в том, чтобы разделить изображение на сетку ячеек и применить алгоритм обнаружения объектов к каждой ячейке. Каж- дая ячейка предсказывает ограничивающие рамки и вероятности принадлежно- сти различным классам объектов. Этот процесс позволяет одновременно обнару- живать и классифицировать объекты на изображении. 11реимущества YOLO включают в себя: • высокую скорость работы, позволяющую использовать алгоритм для об- наружения объектов в реальном времени. • одновременное обнаружение и классификация объектов. • способность обнаруживать объекты различных размеров и форм. • относительную простоту в реализации и использовании благодаря до- ступности ггредобученных моделей. По сравнению с YOLO, алгоритмы обнаружения объектов в прошлом часто использовали сети предложений регионов для выделения потенциальных областей интереса на изображении. Затем для каждой области выполнялся про- цесс распознавания отдельно. Такой подход требовал нескольких итераций на одном и том же изображении, что снижало точность и увеличивало время вы- полнения.
В отличие от этого, алгоритм YOLO использует один полносвязный слой для одновременного выполнения прогноза. Это позволяет ему эффективно обра- батывать изображения и предсказывать наличие объектов на них за один проход, что приводит к увеличению скорости работы и повышению точности обнаруже- ния объектов. Такой подход делает YOLOv7 эффективным инструментом для ре- шения широкого спектра задач в области компьютерного зрения, продвигая эту область вперёд и устанавливая новые стандарты в индустрии. Метод YOLO разбивает изображение на N сеток, где каждая сетка состоит из ячеек одинакового размера SXS. Каждая из этих сеток отвечает за обнаруже- ние и определение местоположения объектов в ней (рис. 8.14). Эти сетки прогнозируют координаты ограничивающей рамки В относи- тельно координат ячейки, а также предсказывают класс объекта и вероятность Юго, что объект ирисутствует в данной ячейке. Поскольку множество ячеек мо- гут предсказывать один и тот же объект с разными координатами 01раничиваю- щей рамки, этот метод значительно сокращает вычислительные затраты, так как обнаружение и классификация объектов обрабатываются независимо для каж- дой ячейки изображения. Однако YOLO создает множество дублирующихся прогнозов. Чтобы ре- шить эту проблему, он применяет технику, называемую немаксимальное подав- ление. Этот процесс заключается в том. что YOLO убирает все ограничивающие рамки с низкими показателями вероятности. YOLO достигает этого, анализируя вероятностные оценки, связанные с каждым прогнозом, и выбирая прогноз с наивысшим баллом. Ограничивающие рамки, которые имеют большое пересечение с текущей рамкой и высокую веро- ятность, затем удаляю гея (рис. 8.14). Рисунок 8.14- Принцип обнаружения объектов на изображении с применением YOLO Этот процесс продолжается до тех пор, пока не будут заполнены ограни- чивающие рамки. 8.5.2. Эволюция модели YOLO Углубимся немного в историю модели YOLO. Первоначальная версия YOLOvl была представлена в 2015 году в статье «You Only Look Once: Unified.
Real-lime Object Detection» авторства Джозефа Редмона, Сантоша Диввалы, Росса Гиршика и Али Фархади. Благодаря своей скорости, точности и способности к обучению, YOLO быстро стал доминирующим алгоритмом в области обнаружения объектов и стал широко используемым. Вместо того, чтобы рассматривать обнаружение объек- тов как задачу классификации, авторы подошли к ней как к задаче регрессии с геометрически разделенными ограничивающими прямоугольниками и соответ- ствующими вероятностями классов, которые они решали с помощью одной нейронной сети (рис. 8.15). YOLOvl обрабатывал фотографии со скоростью 45 кадров в секунду в ре- жиме реального времени, тогда как меньший вариант, FastYOLO, обрабатывал со скоростью 155 кадров в секунду и по-прежнему получал вдвое больше птАР, чем другие детекторы в реальном времени. Год спустя, в 2016 году Джозеф Редмон и Али Фархади опубликовали Y0L0v2, также известную как YOLQ9000, в статье «YOLO9000: Better, Faster, Stronger». Class probability map Рисунок 8.15 - Принцип обнаружения объектов на изображении с применением YOLOvl Эта модель имела способность прогнозировать даже 9000 различных кате- горий объектов в реальном времени, что и привело к обозначению ее как YOLO9000. Новая версия модели была обучена одновременно на наборах дан- ных для обнаружения и классификации объектов, а также использовала Darknet- 19 в качестве новой базовой модели. YOLOv2 быстро стала популярной моделью обнаружения обьектов благо- даря своему успеху. Инженеры начали экспериментировать с алгоритмом, созда- вая свои собственные уникальные версии YOLO.
И уже в 2018 году в своей статье «YOLOv3: Incremental Improvements», опубликованной Джозефом Редмон и Али Фархади, авторы представили новую версию алгоритма. Она была основана на архитектуре Darknet-53. В YOLOv3 не- зависимые логистические классификаторы заменили механизм активации softmax. В процессе обучения была использована бинарная кросс-энтропийная по- теря. Darknet-19 был улучшен и переименован в Darknet-53, теперь включаю- щий 53 сверточных слоя. Кроме того, прогнозы теперь делались на трех различ- ных масштабах, что значительно повысило точность предсказания мелких объ- ектов YOLOv3. Рисунок 8.16 - Пример работы модели YOLOv2 YOLOv3 оказался последней версией YOLO, разработанной Джозефом Редмоном, так как он решил не продолжать работу над дальнейшими улучшени- ями YOLO или даже в области компьютерного зрения в целом, чтобы избежать возможного негативного воздействия на мир. В настоящее время YOLOv3 в ос- новном используется как отправная точка для разработки уникальных архитек- тур обнаружения объектов. Однако в апреле 2020 года Алексей Бочковский, Цзянь-Яо Ван и Хун- Юань Марк Ляо опубликовали статью «Y0L0v4: Optimal Speed and Accuracy of Object Detection», представив четвертую итерацию алгоритма YOLO. В новой архитектуре SPDarknet53 были представлены такие инновацион- ные элементы, как взвешенные остаточные соединения, межстадийные частич- ные соединения, кросс-мини-пакетная нормализация, самосостязательное обуче- ние, миш-активация, отбрасывание блокировки и потеря CIoU.
YOLOv4 является продолжением семейства YOLO, но разработан отдель- ными учеными, а не Джозефом Редмоном и Али Фархади. Его архитектура вклю- чает в себя магистраль SPL)arknet53. объединение пространственных пирамид и агрегацию путей PANet в качестве шеи и головы, на основе YOLOv3. В результате сравнения с его предшественником, YOLOv3, YOLOv4 обес- печивает на 10 % более высокую среднюю точность и на 12 % лучшие показатели кадров в секунду (рис. 8.17). MS COCO Object Detection FPS (V100) Рисунок 8,17 - Графическая демонстрация преимущества метода YOLOv4 На рисунке 8.17 представлены графики точности (АР) и скорости (EPS) множества нейронных сетей для обнаружения объектов, замеренных на ви- деокартах GPU TitanV/TeslaVlOO, TitanXP/TeslaPlOO, TitanX/TeslaM40 для двух основных индикаторов точности АР50:95 и ЛР50. В июне 2020 года мир услышал о YOLOvS. YOLOv5 - это проект с откры- тым исходным кодом, который включает в себя ряд моделей и алгоритмов иден- тификации объектов, основанных на модели YOLO и предварительно обученных на наборе данных СОСО. Этот набор моделей идентификации объектов предлагает различные мо- дели, обученные на наборе данных СОСО, а также простые возможности для 1 ТА (Test Time Augmentation), сборки модели, настройки гиперпарамстров и экс- порта в форматы ONNX, CoreML и TFLite. Поскольку YOLOv5 не включает в себя уникальные методы и разработки, его официальная документация не была опубликована. Однако компания Ultranytics использовала этот проект, чтобы выпустить «новую версию YOLO» под своим спонсорством. На домашней странице YOLOv5 доступны пять пред- варительно обученных моделей, а также представлены уроки и рекомендации по
обучению и использованию этих моделей (рис. 8.18). С траница оформлена про- фессионально и содержит структурированную информацию. Nano Small Merhum Large XLarge YOLOv5n YOLOv5s YOLOv5m YOLOv5l YOLOv5x 4 МВ.„ . 14 MB. , . 41 89 MBC FP18 6-3ms4,oo 6 4msv4M, ’°-1 ’2 1 28 4 mAP 37 2 ."APeoeu 45 2 mAP .iV f| 48 8 mAP COCO 50 7 Рисунок 8.18 - Предварительно обученные модели YOLOv5, предлагаемые компанией Ultranytics Стоит заметить, что у YOLO есть несколько недостатков, которые стоит учитывать. Одним из них является то, что каждая сетка способна идентифициро- вать только один объект, что делает его трудным для обнаружения и разделения мелких объектов на изображениях, особенно если они находятся в группах. Например. YOLO может иметь трудности с идентификацией и определением ме- стоположения крошечных объектов в роях, таких как рой муравьев. Кроме того, по сравнению с более медленными методами, такими как Fast RCNN, YOLO обычно обладает меньшей точностью. Это может быть связано с тем, что YOLO стремится к высокой скорости работы за счет использования единой нейронной сети для одновременного обнаружения и классификации объ- ектов, что может снизить точность по сравнению с методами, которые более тща- тельно анализируют изображения на разных этапах. Первоначальная версия YOLOv5 представляет собой чрезвычайно быст- рую. производительную и простую в использовании модель. Хотя YOLOv5 не вводит новых архитектурных изменений в семейство YOLO, он предлагает новую среду обучения и развертывания на основе фреймворка PyTorch, что рас- ширяет возможности детекторов объектов. Одновременно YOLOv5 представляет собой удобное для пользователей решение, которое поставляется «из коробки», готовое к использованию на объ- ектах, созданных по индивидуальному заказу. Позже состоялся релиз YOLOv6 от Meituan - это новая версия детектора объектов, который обеспечивает хороший баланс скорости и точности для ра- боты в реальном времени. Он включает улучшения в архитектуре и обу- чении для повышения производительности. Например, добавлен модуль Bi-directional Concatenation (BiC) для лучшей локализации объектов и стратегия Anchor-Aided Training (ААТ) для оптимального обучения. Также усовершенство- ваны основа и шея сети для высокой точности на датасете СОСО. Модель также предоставляет различные предварительно обученные модели с разной произво- дительностью и масштабом. Y()L0v6 предлагает несколько предварительно обученных моделей с раз- ной производительностью:
YOLOv6-N: Достигает точности 37,5 % АР на наборе данных СОСО va!2017 при скорости 1187 кадров в секунду (FPS) с использованием GPU NVIDIA Tesla Т4. YOLOv6-S: Достигает точности 45.0 % АР при скорости 484 FPS. YOLOv6-M: Достигает точности 50.0 % АР при скорости 226 FPS. YOLOv6-L: Достигает точности 52,8 % АР при скорости 116 FPS. Y()L()v6-L6: Обеспечивает передовую точность в реальном времени. Эти данные о производительности предоставляют информацию о скорости работы моделей на разных устройствах при разных уровнях точности обнаруже- ния объектов. Весной 2023 года появилась седьмая версия YOLO. YOLOv7 на тот момент представлял собой современный детектор объектов в реальном времени, кото- рый превосходиг все известные детекторы объектов по скорости и точности в широком диапазоне от 5 FPS до 160 FPS. Эта модель обладает самой высокой точностью (56,8 % АР) среди всех известных детекторов объектов в реальном времени при частоте кадров 30 FPS и выше на GPU VI00. К ее особенностям относят: • высокая точность и скорость: YOLOv7 превосходит по скорости и точ- ности другие современные детекторы объектов, такие как YOLOR, YOLOX. Scaled-YOLOv4 и YOLOv5: • обучение на MS СОСО: модель обучена на наборе данных MS СОСО с нуля, что подчеркивает ее способность достигать высокой точности на общепринятых наборах данных. • доступный исходный код: исходный код Y()LOv7 доступен на GitHub, что позволяет разработчикам исследовать, адаптировать и использовать модель для своих задач. Y()LOv7 представляет собой значительное достижение в области обнару- жения объектов в реальном времени и является одной из лучших моделей в своем классе. Казалось бы куда дальше, но в конце 2023 года выход восьмая версия YOLO. YOLOv8 представляет собой последнюю итерацию серии детекторов объектов в реальном времени YOLO, которая обеспечивает передовую произво- дительность в плане точности и скорости. Опираясь на успехи предыдущих вер- сий YOLO, YOLOv8 вводит новые функции и оптимизации, делая его идеальным выбором для решения различных задач по обнаружению объектов в различных областях применения. Основные характеристики YOLOv8: • усовершенствованные архитектуры позвоночника и шеи: YOLOv8 ис- пользует современные архитектуры позвоночника и шеи. что повышает производительность извлечения признаков и обнаружения объектов. • безъякорная сплит-головка Ultralytics: YOLOv8 применяет безъякорную сплит-головку Ultralytics, что улучшает точность и эффективность про- цесса обнаружения по сравнению с методами, основанными па якорях.
• оптимизированный компромисс между точностью и скоростью: YOL()v8 стремится к оптимальному балансу между точностью и скоро- стью, что делает его подходящим для решения задач обнаружения объ- ектов в реальном времени в различных областях применения. • разнообразие предварительно обученных моделей: Y()LOv8 предлагает различные предварительно обученные модели, чтобы соответствовать разным требованиям к производительности и задачам обнаружения объ- ектов, обеспечивая возможность выбора подходящей модели для кон- кретных сценариев использования. Ниже в таблице представлен обзор вариантов моделей YOL()v8, подчерки- вающий их применимость в конкретных задачах и совместимость с различными рабочими режимами, такими как Inference, Validation, Training и Export. Она де- монстрирует универсальность и надежность моделей серии YOLOv8, что делает их подходящими для различных приложений в области компьютерного зрения. Модель Размер (пикселей) mAPval 50-95 Скорость CPU ONNX(mc) Скорость Al 00 TensorR 1 (Mp Params (M) FLOPs (B) Y0L0v8n 640 37.4 80.4 0.99 3.2 8.7 Y0L0v8s 640 44.9 128.4 1.2 11.2 28.6 Y0L0v8m 640 50.2 234.7 1.83 25.9 78.9 Y0L0v81 640 52.2 375.2 2.39 43.7 165.2 Y0L0v8x 640 53.9 479.1 3.53 68.2 257.8 Рассмотрим YOLOv8 на практике. 8.5.3. Практическое применение YOLO Для функционирования программы с применением алгоритмов YOLO необходимо выполнить следующие шаги: I. Установить необходимые зависимости, включая библиотеку Ultralytics и OpenCV. 2. Загрузить предварительно обученную модель YOLO (например, ’yolov81.pt'). 3. Интегрировать модель в программу, указав путь к файлу модели. 4. Запустить программу, передав ей изображение в качестве входных дан- ных (например, «Gorod.jpg»). 5. Обработать результаты обнаружения объектов на изображении, если это необходимо. Ниже приведен код, демонстрирующий работу алгоритма YOLO. from ultralytics import YOLO import cv2 # Инициализация модели YOLO с использованием предварительно обу- ченной модели ’yolov81.pt’ model = YOLO(’yolov8'.pt')
# Применение модели к изображению 'Gorod.jpg' с отображением ре- зультатов на изображении results = model (« 'orodрср/, show=True) # Ожидание нажатия клавиши на клавиатуре для завершения про- граммы cv2.waitKey(0) Данная программа использует алгоритм обнаружения объектовyolov8l для анализа изображения «Gorod.jpg» и вывода на экран результатов обнаружения, таких как рамки вокруг объектов. С трока from ultralytics import YOLO является инструкцией Python для им- порта класса YOLO из модуля ultralytics. В контексте данною кода модуль ultralytics содержит реализацию обертки для работы с моделью YOLOvS, предо- ставляя удобный интерфейс для ее использования. После выполнения этой строки класс YOLO будет доступен для использования в текущем файле. Стоит заметить, что вместо модели YOLOv81, можно использовать любые версии восьмой версии; YOLOv8n, YOLOv8s, YOLOv8m, YOLOv81, YOLOv8x, которые представлены в предыдущем разделе. Также можно и поменять версию модуля, например, YOLOv5L Строка model = YOLOCyolov8l.pt) инициализирует модель YOLO, исполь- зуя предварительно обученные веса, указанные в файле 'yolov8l.pt'. В этой строке происходит создание экземпляра класса YOLO с параметрами, которые опреде- ляют модель. В данном случае, 'yolov8l.pt' представляет собой файл, содержащий веса модели YOLOv81. Это может быть файл с предварительно обученными весами, который был загружен из официального репозитория YOLOv8 или предвари- тельно обученный вами на собственных данных. Строка results = model («Gorod.jpg», show=True) вызывает метод_call_() объекта model, который применяет модель YOLO к изображению 'Gorod.jpg' с парамет ром show-True. Здесь model - переменная, которая содержит экземпляр класса YOLO, ко- торый был создан на предыдущем шаге. Этот объект содержит методы и атри- буты для работы с моделью YOLOv8/. «Gorod.jpg» - путь к изображению 'Gorod.jpg', па котором будет произво- диться обнаружение объектов. В данном случае, модель будет применена к этому изображению для обнаружения объектов на нем. show=True - параметр, указывающий на то, что результаты обнаружения объектов должны быть отображены на изображении. Если этот параметр уста- новлен в True, после обработки изображения модель отобразит изображение с обнаруженными объектами. После выполнения этой строки, переменная results будет содержать ре- зультаты обнаружения объектов, которые могут быть использованы для дальней- шей обработки или анализа. Результат программы представлен на рисунке 8.19.
Рисунок 8.19 - Результат выполнения программы с применением модели yolov8l ПРАКТИЧЕСКОЕ ЗАДАНИЕ Задание /. Повторите текст программы, предложенной в разделе 8.2 на компьютере. Примените ядра фильтров, которые предложены в разделе 5.6.2. Исследуйте полученный результат и сделайте вывод. Задание 2. Повторите текст программы, предложенной в разделе 8.3 на компьютере. Подключите другие модули, которые способны распознавать дру- гие объекты на изображении. Адаптируйте программу, таким образом, чтобы в качестве исходного изображения был видеопоток с веб-камеры. Исследуйте ра- боту всех функций в программе. Задание 3. Напишите программу с использованием метода YOLO8 разных моделей для видео, полученного с веб-камсры. Проанализируйте работу данных методов и проведите их сравнение. Задание 4. Напишите программу с использованием метода YOLO8. На кадре оператор выбирает зону многоугольником. Попадая в обозначенную зону, объект идентифицируется красным прямоугольником, за пределами - зеленым. Задание 5*. Напишите программу для микрокомпьютера с использованием метода YOLO8 для видео, полученного с MIPl-камеры. Проанализируйте работу метода.
9. КОМПЬЮТЕРНОЕ ЗРЕНИЕ НА МИКРОКОМПЬЮТЕРАХ 9.1. Выбор микрокомпьютера Микрокомпьютер - это компьютер, который обладает компактным разме- ром и низким энергопотреблением, но при этом способен выполнять различные вычислительные задачи. Он часто используется во встраиваемых системах, ро- бототехнике, медицинском оборудовании, умных домах, в военных технологиях и БПЛА, а также в других областях, где требуется небольшой, но достаточно мощный компьютер. Микрокомпьютеры часто оснащены различными входными и выходными портами, такими как USB. HDMI, Ethernet, GPIO (общий вход-выход), что поз- воляет им взаимодействовать с различными устройствами и сенсорами. Они также могут быть оснащены различными модулями беспроводной связи, такими как Wi-Fi и Bluetooth. Примеры популярных микрокомпьютеров достаточно подробно рассмот- рены в разделе «1.2 Аппаратные ресурсы» данной книги. Эти устройства часто используются для создания прототипов, DIY (сделай сам) проектов, учебных це- лей и реализации различных систем автоматизации и управления. 11ри реализации систем компьютерного зрения в различных областях, та- ких как беспилотная авиация, железнодорожный транспорт, автотранспорт и другие, выбор подходящего микрокомпьютера играет ключевую роль в обес- печении эффективной работы системы. При выборе микрокомпьютера необхо- димо учитывать несколько ключевых критериев. Производительность', микрокомпьютер должен обладать достаточной вычислительной мощностью для обработки изображений в реальном времени и выполнения сложных алгоритмов компьютерного зрения. Надежность: в контексте применения в транспортных системах микро- компьютер должен быть надежным и обеспечивать стабильную работу даже в условиях вибраций, температурных изменений и других экстремальных фак- торов. Малые размеры и низкое энергопотребление: важно выбирать компакт- ные и энергоэффективные микрокомпьютеры, которые легко можно интегриро- вать в транспортные средства без значительного увеличения их габаритов или энергопотребления. Поддержка необходимых интерфейсов и дополнительных устройств: микрокомпьютер должен иметь необходимые порты и интерфейсы для подклю- чения камер, сенсоров и других устройств, необходимых для работы системы компьютерного зрения. Нена: выбранный микрокомпьютер должен соответствовать бюджету про- екта и обеспечивать оптимальное соотношение цены и качества.
При выборе конкретного микрокомпьютера для системы компьютерного зрения в транспортной отрасли необходимо провести тщательное сравнение до- ступных моделей и учесть специфические требования и условия эксплуатации в конкретной области применения. Важно также учитывать возможность расши- рения и дальнейшего развития системы, чтобы обеспечить ее долгосрочную эффективность и актуальность. При написании программ компьютерного зрения для микрокомпьютеров далее будем использовать две популярные на 2024 год модели: Raspberry Pi 5 и Jetson Nano. Raspberry Pi 5 представляет собой доступный и надежный вариант, подхо- дящий для широкого спектра задач компьютерного зрения. С другой стороны, Jetson Nano обладает высокой производительностью и специализированными возможностями для работы с нейросетевыми алгорит- мами. Выбор между этими моделями зависит от требований конкретного проекта: Raspberry Pi 5 подходит для общих задач, в то время как Jetson Nano, если использовать его видеопроцессор, может быть предпочтительным для более сложных проектов, требующих высокой производительности. Для начала работы с этими уст ройствами необходимо рассмотреть их ком- плект выходов и интерфейсов на плате. Это поможет правильно распорядиться ресурсом микрокомпьютера. Raspberry Pi 5 (рис. 9.1) оснащен процессором ВСМ2712 Cortex-A76 с так- товой частотой 2,4 ГГц и видеокартой VideoCore VII, работающей на частоте 800 МГц и поддерживающей OpenGL ES 3.1 и Vulkan 1.2, обеспечивая вывод на два HDMI пор га с разрешением 4К@60 с HDR, при этом доступны варианты оперативной памяти от 1 до 8 ГБ типа LPDDR4X-4267 SDRAM, расширяемой через microSD или М.2 NVMe SSD через М.2 НЛТ; интерфейсы USB включают 2 порта USB 2 и 2 порта USB 3, а также имеются гигабитный Ethernet, поддержка Wi-Fi 802.1 lac и Bluetooth 5 / BLE, кнопка включения и различные порты для подключения различных устройств, питание осуществляется через USB-C, РоЕ через РоЕ+ HAT или по GPIO. GPIO (General-Purpose Input/Output - общий ввод/вывод)-это 40-пиновый разъём позволяет подключать цифровые устройства, такие как датчики, свето- диоды, дисплеи, моторы и многое другое. Распиновка его выводов представлена на рис. 9.2. Сам по себе GPIO является дискретным портом. То есть он мо- жет управлять двоичным состоянием объектов (включить/выключить двигатель) или контролировать их двоичное состояние (контроль состояния кнопки или тумблера).
RAM (4 или Я 1I CPI Bruadcoin ВС M2712 I6hm четыре o4-0innui я 1|>м Anil C ertrt \ 76 C TdklODOH ЧИСТОТОЙ 2*4 I I II PI I о Ks.H-p (охлаж iriine) P< Ie 2.0 Gigabit Etheniri 2 x I sH 2.0 2x USB Л.0 USB С п иг а пне мнкрокомпьюггра 2*4 J arir CAMLRA DISPLAY (MJ Pl камера) 2 x micro HDMI uupi (4 К 60) UART (последовательный часов рсалыпп u времени (RIC) Рисунок 9.1 - Устройство платы Raspberry Pi 5 GPIO шгкрггныг порты Кнопка выктючепня 5B SA интерфейс) У 3V3 power о—— GPI0 2 (SDA) о— GPIO 3 (SCL) о— GPI0 4(GPCLKO) о- Ground о— GPIO 17 о— GPIO 27 и— GPIO 22 о— 3v3 power — GPIO 10 (MOSl) о- GPIO 9 (MISO) o— GPIO 11 (SCLK) о- Ground o~ GPIOO(ID_SD) о— GPIO 5 о— GPIO 6 o— GPIO13(PWM1) o— GPIO 19 (PCM.FS) o- GPlO 26 о— Ground o— О о о о о о О Ф ф ф ф ф ф ф ф ф ФФ ф ф ф ф © © ФФ Ф • Ф ® ФФ Ф © Ф Ф ФФ 5V power 5V power Ground GPIO14(TXD) GPIOIS(RXD) GPIO 18 (PCM. CLK) Ground GPIO 23 GPIO 24 Ground GPIO 25 GPIO 8 (CEO) GPIO 7 (CEI) GPIO 1 (ID_SC) Ground GPIO12(PWM0) Ground GP1OI6 GPIO 20 (PCM.DlN) GPIO 21 (PCM.DOUr) Рисунок 9.2 - Распиновка выводов GPIO Raspberry Pi 5 Однако выводы GPIO Raspberry Pi 5 имеют множество альтернативных назначений, а именно интерфейсов для взаимодействия с внешними устрой- ствами: 1. UART (Universal Asynchronous Receiver/Transmitter) -3 порта. Исполь- зуется для последовательной св>ви с другими устройствами, такими как микроконтроллеры, датчики, модемы и т. д. 2. SPI (Serial Peripheral Interface)-2 порта. Позволяет подключать перифе- рийные устройства с последовательным интерфейсом, такие как дис- плеи, сенсоры, намят ь и другие.
3.I2C (Intcr-lntegratcd Circuit) - 1 порт. Используется для подключения к устройствам, работающим по шине I2C, таким как сенсоры, дисплеи, EEPROM и другие. 4. PWM (Pulse Width Modulation). Позволяет изменять ширину импульсов для управления интенсивностью света светодиодов, скоростью враще- ния моторов и другими аналоговыми устройствами. Для задач компьютерного зрения важнейшим узлом платы является интер- фейс CS1 для подключения MIPI- камеры. В модели Raspberry Pi 5 разработчики отошли от стандартного интерфейса CSI в пользу интерфейса двойного назначе- ния CSI/DSI, включив дополнительные линии для подключения дисплеев. Для подключения камеры важно верно подключить шлейф к камере и к плате микро- компьютера. На рис. 9.3 представлен пример правильного подключения MIPI- камеры к плате микрокомпьютера. Рисунок 9.3 - Соединения MIPI-камеры с платой Raspberry Pi 5 Стоит заметить, что на настоящий момент уже стало стандартом оборудо- вать платы микрокомпьютеров двумя разъемами для подключения MIPI-камер. Это дает возможность реализовывать проекты на базе стерсозрения. Что качается Jetson Nano (рис. 9.4), то он оснащен процессором NVIDIA Carmel четырсхядерным Cortex-A57 с тактовой частотой до 1,43 ГГц и мафиче- ским процессором NVIDIA Maxwell со 128 ядрами CUDA, работающим на ча- стоте до 921 МГц. Он обеспечивает поддержку вывода видео с разрешением до 4К с частотой до 60 Гц через интерфейсы HDMI и DisplayPort. Память Jetson Nano представлена вариантами от 4 ГБ LPDDR4X-3200 SDRAM, обеспечивая высокую производительность и эффективность в работе с данными. Помимо этого, он также поддерживает расширение памяти через microSD слот. Устройство обладает богатым набором интерфейсов, включая 4 порта USB 3.1 Genl, порт Gigabit Ethernet для быстрого подключения к сети, а также Wi-Fi 802.1 lac и Bluetooth 5.0 для беспроводного соединения. Для удобства управления и включения имеется кнопка питания, а также разнообразные порты „для подключения периферийных устройств, таких как ка- меры, дисплеи и датчики. Питание Jetson Nano осуществляется через разъем USB-С, а также воз- можно использование РоЕ (Power over Ethernet) через соответствующий адаптер.
Рисунок 9.4 - Устройство платы Jetson Nano NVIDIA мудро решила сохранить расположение GPIO на Jetson Nano та- ким же, как у Raspberry Pi 4В и у Raspberry Pi 5 (рис. 9.2). Этот стратегический ход обеспечивает легкую совместимость с широким спектром модулей расшире- ний и аксессуаров для Raspberry Pi, что дает NVIDIA конкурентное преимуще- ство в захвате рынка. Кроме того, они разместили разъем GPIO J41 таким обра- зом, что модули расширения могут выступать наружу, поскольку на плате недо- статочно места для их размещения, в отличие от Raspberry Pi. Также разъемы интерфейсов CS1 для подключения MIPI-камер и сами ка- меры у моделей Raspberry Pi 4 и Jetson Nano одинаковые. Это позволяет исполь- зовать весь ассортимент камер на обеих платформах. Правильное подключение MIPI-камеры к микрокомпьютеру Jetson Nano представлено на рис. 9.5. Рисунок 9.5 - Подключение MIPI-камеры к плате Jetson Nano НО не стоит забывать, что все микрокомпьютеры, как и ПК, способны ра- ботать с любыми камерами, включая веб-, JP-камеры, которые подключаются че- рез интерфейс USB или Ethernet.
9.2. Установка и настройка окружения Raspberry Pi 5 поддерживает несколько операционных систем, включая офи- циальную Raspberry Pi OS (ранее Raspbian), Ubuntu, Fedora, Arch Linux ARM, и Gen- too. Они предоставляют разные уровни гибкости и функциональности, позволяя вы- брать наиболее подходящи!! вариант в зависимости от потребностей. Варианты включают как общедоступные, так и более настраиваемые исходные коды, обеспе- чивая широкий спектр возможностей для разработки и использования Raspberry Pi 5. Далее рассмотрено практическое руководство по установке операционной! системы на микрокомпьютер. Предварительно необходимо подготовить и подключить к компьютеру чи- стую SD- каргу. Для установки операционной системы на Raspberry Pi необходимо загру- зить и установить специальную утилиту, известную как Raspberry Pi Imager (рис. 9.6). Наличие данной утилиты является еще одним достоинством примене- ния микрокомпьютеров Raspberry Pi. Её можно скачать с официального сайта. Если вы используете Ubuntu, вы можете установить её непосредственно из репо- зитория командой: sudo apt install rpi-imager. < мрсм Ш — Q X ф Raspberry Pi Рисунок 9.6 - Внешний вид утилиты Raspberry Pi Imager После установки запустите Imager. В открывшемся окне программы необ- ходимо выбрать устройство, с которым планируется работа (рис. 9.7). • tAl — OX Рисунок 9.7 - Выбор микрокомпьютера
Затем необходимо указать тип операционной системы, которую вы хотите установить (например, Raspberry Pi OS (64-битный)) (рис. 9.8). Рисунок 9.8 - Выбор операционной системы для установки Затем необходимо указать SD-карту, на которую предусмотрена установка операционной системы (рис. 9.9). После чего нажать кнопку «Записать» и до- ждаться завершения процесса установки. Рисунок 9.9 - Выбор SD-карты для установки операционной системы После этих манипуляций карту можно подключить в разъем Raspberry Pi. Также необходимо подключить клавиатуру, мышь и монитор к микрокомпью- теру и включить устройство. Дальнейшая настройка операционной системы заключается в выборе реги- она, временной зоны, языковых параметров, подключение к сети Wi-Fi. После чего можно установить другие пользовательские программы. Для Jatson Nano процедура установки операционный системы отличается лишь тем, что специальной программы для ее установки на момент написания книги не было. По процедура нс становится сложнее. Образ операционной си- стемы нужно предварительно записать из файла, который напрямую скачав
из официальных источников, например, https://developer.nvidia.com/. Затем запи- сать образ на карту памяти посредством утилиты Win32 Diskimager. 9.3. Работа с камерой Когда речь идет о разработке алгоритмов компьютерного зрения, предпочти- тельнее использовать MIPI-камеру вместо USB-камеры с микрокомпьютером. Напомним, М1 PI (Mobile Industry Processor Interface) - это стандартный протокол для передачи данных изображения от камеры к процессору в мобильных устрой- ствах и встраиваемых системах. Использование MIPI-камеры обеспечивает более надежную и эффективную передачу изображений непосредственно в микропроцес- сор, минимизируя задержки и упрощая процесс обработки изображений. В отличие от USB-камер, подключаемых через стандартный интерфейс USB, MIPI-камеры интегрированы более тесно с аппаратными ресурсами микро- компьютера, что обеспечивает более высокую производительность и качество обработки изображений. Это особенно важно при решении задач компьютерного зрения, таких как распознавание объектов, отслеживание движения или анализ сцен. Таким образом, при разработке алгоритмов компьютерного зрения реко- мендуется отдавать предпочтение использованию MIPI-камеры с микрокомпью- тером Raspberry Pi5 и Jatson Nano для достижения оптимальной производитель- ности и качества обработки изображений. Для работы с USB- и MIPI-камерами на микрокомпьютерах существует не- сколько популярных библиотек на языке Python. pieameru: это официальная библиотека для работы с камерами Raspberry Pi. Она обеспечивает простой и гибкий интерфейс для управления камерой, съемки фотографий и записи видео. Поддерживает как стандартные камеры, так и модули камер с интерфейсом MIPI. from picamera import Pi Camera camera = PiCamera() camera.resolution = (640, 480) camera.start_preview() OpenCV: это широко используемая библиотека компьютерного зрения, ко- торая поддерживает работу с изображениями и видео из различных источников, включая камеры. С синтаксисом открытия камеры мы уже знакомы из прошлых тем с работой веб-камеры на ПК. import cv2 cap = cv2.VideoCapture(0) Pygame: это библиотека для создания компьютерных игр, но опа также мо- жет быть использована для работы с видео и захвата изображений с камер.
import pygame.camera import pygame.image pygame.camera.init() cam = pygame.camera.Camera(« », (64C, 480)) cam. start () Эти библиотеки предоставляют различные возможности для работы с ка- мерами на Raspberry Pi 5 и Jatson Nano в Python и выбор зависит от конкретных требований проекта и уровня вашего опыта. Остановимся на библиотеке PiCamera. Библиотека PiCamera была разра- ботана командой Raspberry Pi Foundation. Эта организация является создателем и разработчиком микрокомпьютеров Raspberry Pi, включая Raspberry Pi 5, и ак- тивно работает над поддержкой программного обеспечения и инструментов для их использования. PiCamera предоставляет простой и удобный интерфейс для работы с камерами на микрокомпьютерах Raspberry Pi, что делает их доступ- ными для широкого круга пользователей, включая начинающих разработчиков и энтузиастов. Л в конце 2022 года Raspberry Pi Foundation выпустила более про- двинутую версию библиотеки под названием PiCamera2. Это обновление вклю- чает в себя дополнительные функции и улучшения, которые расширяют возмож- ности работы с камерами на микрокомпьютерах Raspberry Pi (https://datasheets. raspberrypi.com/cainera/ picamera2-manual .pdf). Разработчик библиотеки PiCamera2 рекомендует начать с обновления до последней версии Raspberry Pi OS. Самым простым способом сделать это явля- ется загрузка образа Raspberry Pi OS с помощью инструмента Raspberry Pi Imager (рассмотрен в предыдущем разделе) для записи на micro SD карты. С середины сентября 2022 года Picamera2 предустановлен во всех образах Raspberry Pi OS. Вы можете обновить его с помощью полного обновления си- стемы или через терминал с помощью команды: sudo apt install -у python3-picamera2 Для пользователей Raspberry Pi OS в этом пакете будут содержаться все зависимости для GUI, но они будут опущены в Raspberry Pi OS Lite. Если поль- зователи OS Lite хотят использовать эти функции, они должны выполнить сле- дующую команду: sudo apt install -г python3-pyqt5 python3-opengl Если вы столкнулись с системой без предустановленного Picamera2, пожа- луйста, используйте: sudo apt install -г python3-picamera2 для его установки со всеми зависимостями GUI, или: sudo apt install -у python3-picamera2 —no-install-recommends для установки без них. Библиотеку Picamera2 также можно установить с помощью pip. Однако разработчик не рекомендует это, потому что основная библиотека libcamera не
стабильна в отношении АВ1 (бинарного интерфейса приложений), поэтому воз- можны несовместимости версий Picamera2 и libcamera, Если вы всегда устанав- ливаете через apt, то все эти зависимости управляются за вас. Если вы всё же хотите продолжить, обратите внимание, что версии Picamera2 после 0.3.12 не совместимы с Raspberry Pi OS Bullseye, если вы не хотите также компилировать свою собственную версию libcamera, что выходит за рамки этого руководства. В какой-то момент даже это может перестать рабо- тать, если ядро Linux продолжит развиваться. Гак что в краткосрочной перспек- тиве процесс будет намного безопаснее, если вы используете самую последнюю версию Raspberry Pi OS. Если вы всё равно хотите продолжить, сначала убедитесь, что у вас есть необходи м ые зависи мости: sudo apt install -у python3-libcamera python3-kms++ sudo apt install -y python 3-prctl Ubatlas-base-dev ffmpeg python3-pip sudo apt install -y python3-pyqt5 python3-opengl pip3 install numpy —upgrade а затем выполните: pip3 install picamera2 PiCamera2 предоставляет еще больше гибкости и контроля при работе с изображениями и видео, что делает ее еще более привлекательной для разработ- чиков, занимающихся проектами, связанными с компьютерным зрением, робо- тотехникой и машинным обучением. Рассмотрим некоторые функции и атрибуты этой библиотеки: resolution этот атрибут позволяет установить разрешение (ширину и вы- соту) кадра видео. camera.resolution = (1920, 1080) # Установка разрешения 1920x1080 framerate', этот атрибут позволяет установить кадровую частоту видео, то есть количество кадров в секунду. camera.framerate = 30 #Установка кадровой частоты видео 30кад/с start_preview: этот метод запускает превью сигнал с камеры, который можно использовать для настройки кадра и других параметров перед началом записи. camera.start preview () stop preview этот метод останавливает превью сигнал с камеры. camera.stop preview() start recording: это метод для запуска записи видео. camera.start_recording(' rideo.h2 4’) stop recording: это метод для остановки записи видео. camera.stop recording()
startjpreview(fullscreen=False, window=(0, 0,1024, 768))'. метод для запуска превью сигнала с камеры. Можно указать параметры для отображения превью в полноэкранном режиме или в окне с определенными размерами. camera.start_preview(fullscreen=True) # Запуск превью на пол- ном экране previewconfiguration.inain.fonnat: эта конструкция представляет собой часть объекта preview configuration, который используется для настройки пара- метров превью (предварительного просмотра) в библиотеке PiCamera. В данном случае мы обращаемся к полю formal, которое определяет форма1 отображения превью на экране или другом устройстве вывода. Название main в этой конструкции указывает на основное окно превью, если таковое существует. В некоторых случаях может быть несколько окон пре- вью с различными параметрами, но обычно основное окно называется main. Теперь давайте разберемся с параметромуЬ/тия/. Этот параметр определяет формат, в котором будет отображаться превью. Например, значение «rgb» ука- зывает на использование формата RCJB для превью. previewconfiguration.main.size: это полелтде в объекте preview configuration представляет собой размеры превью (предварительного просмотра) в главном окне. В библиотеке PiCamera главное окно превью обычно представляет собой основное окно, в котором отображается изображение с камеры. Значение этого параметра определяет размеры превью, то есть его ширину и высоту. Например, значение (640, 480) указывает на размер превью в 640 пик- селей по ширине и 480 пикселей по высоте. Настройка размеров превью позволяет пользователю контролировать ка- чество и размер изображения, которое будет отображаться на экране в процессе предварительного просмотра. Это полезно для адаптации превью к требуемым размерам и разрешениям экрана, а также для оптимизации производительности и эффективности работы с камерой Raspberry Pi. Используя preview configuration.main.size, мы можем настроить размеры превью в соответствии с нашими потребностями и предпочтениями, обеспечивая тем самым удобство и оптимальное качество предварительного просмотра при работе с камерой. Эти и другие функции позволяют настраивать различные параметры ви- деозаписи с камеры на микрокомпьютере Raspberry Pi с помощью библиотеки PiCamera2, обеспечивая гибкость и контроль над процессом записи видео. Рассмотрим применения этой библиотеки на примере следующего кода: import cv2 from picamera2 import Picamera2 # Импорт модуля Picamera2 для ра- боты с камерой MIPI # Создание объекта для работы с камерой MIPI picam2 = Picamera2()
# Запуск камеры picam2 . start () while True: # Захватываем кадр из видеопотока frame = picam2.capture_array() fl Показываем кадр на экране cv2 . imshow (' rid< St rec n' , frame) # Ожидаем нажатие клавиши для выхода (например, q) if cv2.waitKey(1) & OxFF == ord(«q>4 : break ff Освобождаем ресурсы picam2.close() # Закрытие ресурсов камеры cv2.destroyAllWindows() Данная программа является минимальным набором инструкций для ра- боты с MIPI-камерой. Она представляет собой функции захвата изображения и циклического считывания кадров с камеры. Если есть необходимость в более тонкой настройке кадра, за основу можно взять следующий код import cv2 from picamera2 import Picamera2 # Импорт модуля Picamera2 для ра- боты с камерой MIPI resolution = (1280,720) # Разрешение видео (ширина, высота) frame_rate = 30 # Частота кадров в секунду # Создание объекта для работы с камерой MIPI picam2 = Picamera2() # Настройка формата и размера превью камеры picam2.preview_configuration.main.format=('L3 >8 ’) picam2.preview_configuration.main.si ze=(resolution) # Установка частоты кадров picam2.set_controls({«F: ameR e»: frame_rate}) # Выравнивание конфигурации превью камеры picam2.preview_configuration.align() # Запуск камеры picam2 . start () # Создаем цикл для захвата и отображения видеопотока while True: # Захватываем кадр из видеопотока frame = picam2.capture_array()
# Показываем кадр на экране cv2.imshow('' dec St earn’, frame) # Сжидаем нажатие клавиши для выхода (например, q) if cv2.waitKey(1) & OxFF == ord(« p>) : break # Освобождаем ресурсы picam2. close () # Закрытие ресурсов камеры cv2.destroyAllWindows() Данная программа захватывает видеоноток с камеры М1Р1 с разрешением 1280x720 и частотой кадров 30 кадров в секунду. Она использует библиотеки OpenCV и Picamera2 для управления видеопотоком и отображения его в реаль- ном времени на экране компьютера. Данный пример может служить в качестве основы для наращивания программы входными данными которой является дан- ные с MIPI-камеры. Ниже представлен еще один шаблон программы, который может быть ис- пользован уже для микрокомпьютера Jatson Nano. Основой этого шаблона явля- ется применение фреймворка GStreame. В предложенной ниже программе GSTREAMER PIPELINE - это строка, которая описывает последовательность обработки видеопотока с помощью GStreamer, который является мощным фреймворком для обработки мультиме- дийных данных в реальном времени. В этой строке указываются различные эле- менты GStreamer и их параметры, которые определяют, как видео будет захва- тываться, обрабатываться и передаваться программе для дальнейшей обработки. Каждый элемент в этой строке выполняет определенную функцию. Напри- мер, nvarguscanierasrc указывает на использование камеры Nvidia Jetson Nano, video/x-raw определяет формат входного видеопотока, nvvidconv выполняет кон- вертацию формата видео, a appsink представляет собой элемент, который позво- ляет программе получать кадры из видеопогока для их дальнейшей обработки в OpenCV. import cv2 # Настройка GStreamer Pipeline для Raspberry Pi камеры GSTREAMER_PIPELTNE = ’nvarguscamerasrc 1 vidco/x- raw(memory:NVMM), wrdth=1920, height=1080, format=(string)NV12, framerate=30/l ! nvvidconv flip-method=0 ! v.i deo/x-raw, width=1280, height=800, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink wait-on-eos=false max- buffers^ drop=True‘ cap = cv2.VideoCapture(GSTREAMER_PIPELINE, cv2.CAP_GSTREAMER) while True: ret, frame = cap.read() cv2.imshow(’Camera’, frame)
if cv2.waitKey(1) & OxFF == ord(’ V) • break cap.release () cv2.destroyAllWindows () Эта программа использует библиотеку OpenCV для захвата видеопотока с камеры Raspberry Pi, подключенной к Jetson Nano. Она устанавливает GStreamer Pipeline (потоковую конвейерную схему GStreamer) для обработки видеопотока от камеры. А вот ниже пример также использует библиогеку OpenCV для захвата ви- деопотока. но теперь для двух камер одновременно. import cv2 #первая камера GSTREAMER_PIPELINE_O » 'nvarguscamerasrc sensor-id=0 ! video/x- raw(memory:NVMM), width=1920, height=1080, format=(string)NV12, framerate=30/l ! nvvidconv flip-method=0 ! video/x-raw, width=640, height=430, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink wait-on-eos=false max- buffers=l drop=True’ #вторая камера GSTREAMER_PIPELINE_1 = ’nvarguscamerasrc sensor-id=l ! video/x- raw (memory:NVMM), width=1920, herght=1080, format=(string)NV12, framerate-30/1 ! nvvidconv flip-method-0 ! video/x-raw, width=640, he .ght=480, formats (string)BGRx ! videoconvert 1 video/x-raw, format=(string;BGR ! appsink wait-on-eos=false max- buffers^ drop=True’ capO = cv2.VideoCapture(GSTREAMER_PIPELINE_O, cv2.CAP_GSTREAMER) capl = cv2.VideoCapture(GSTREAMER_PIPELINE_1, cv2.CAP_GSTREAMER) while True: ret, frameO = capO.readO ret, framel = capl.read() cv2.imshow(' ame:a O’, frameO) cv2.imshow(’Camera , framel) if cv2.waitKey(1) & OxFF == ord(’q’): break capO. release () capl. release () cv2.destroyAllWindows() В программе две переменные GSTREAMER PIPELINE 0 и GSTREAMER PIPELINE /, каждая из которых содержит GStreamer Pipeline для каждой камеры. Каждый поток обрабатывает видео с определенной камеры (sensor-id=0 для первой и sensor-id=\ для второй).
В целом MIPI-камеры обычно предпочтительнее USB камер из-за своей высокой пропускной способности, скорости передачи данных и низкой за- держки, что делает их идеальным выбором для приложений реального времени. Эти камеры обеспечивают стабильную и надежную передачу видеопотоков вы- сокого разрешения и частоты кадров даже в условиях высокой нагрузки. В срав- нении с USB камерами, MIPI камеры показывают более высокую производитель- ность и меньшую задержку, что особенно важно для приложений, где даже не- большая задержка может быть критичной. 9.4. Программно-аппаратная архитектура CUDA CUDA (Compute Unified Device Architecture) - это программно-аппаратная платформа параллельных вычислений, разработанная компанией NVIDIA для использования их графических процессоров (GPU) в качестве вычислительных устройств. Она позволяет программистам писать программное обеспечение, ко- торое может эффективно использовать вычислительные ресурсы GPU для уско- рения различных вычислительных задач. Представьте GPU как мощный двигатель автомобиля, который может вы- полнять множество задач одновременно. CUDA - это специальный язык про- граммирования. который позволяет вам «написать инструкции» для этого двига- теля таким образом, чтобы он мог решать сложные задачи быстрее, чем обычный цензральный процессор (CPU). В контексте компьютерного зрения, CUDA позволяет разработчикам со- здавать и оптимизировать алгоритмы обработки изображений таким образом, чтобы они могли выполняться параллельно на GPU. Это позволяет обрабатывать большие объемы данных, такие как видеопотоки или высокоразрешенные изоб- ражения, с высокой скоростью и эффективностью. Как результат, алгоритмы компьютерного зрения могут работать быстрее и эффективнее, что делает их применимыми в реальном времени и в более сложных сценариях. Такая эффективность достигается за счет наличия огромного количества процессорных ядер (например, 128 для Jelson Nano). II если все они задейство- ваны, это означает, что программа или алгоритм использует полную вычисли- тельную мощность графического процессора. Каждое ядро GPU представляет собой небольшой вычислительный движок, способный выполнять операции од- новременно с другими ядрами. Использование всех 128 ядер означает, что задача или программа разбива- ется на множество маленьких частей, которые могут быть выполнены парал- лельно на каждом ядре. Это позволяет значительно ускорить вычисления, по- скольку множество операций может быть выполнено одновременно, в отличие от последовательного выполнения на центральном процессоре (CPU). Таким образом, когда CUDA использует все 128 ядер, это означает, что программа оптимально использовала возможности параллельных вычислений на GPU, что привело к более быстрой и эффективной обработке данных. Сравним производительность выполнения алгоритма компьютерного зре- ния на Jetson Nano без использования CUDA и с использованием CUDA.
Предположим, реализуется алгоритм обнаружения объектов на изображе- нии с использованием нейронной сети YOLO. Этот алгоритм требует интенсив- ных вычислений, поскольку он анализирует каждый пиксель изображения для обнаружения объектов. Без CUD A, Jetson Nano будет использовать свой центральный процессор (CPU) для выполнения вычислений. Предположим, что его CPU может выпол- нить 0.5 GFLOPS (0.5 миллиарда операций с плавающей запятой в секунду). Л если использовать CUDA на Jetson Nano, который имеет GPU с произво- дительностью около 472 GFLOPS, можно значительно ускорить вычисления. Для примера, допустим, что алгоритм обнаружения объектов на изображе- нии без CUD А занимает I секунду на Jetson Nano. А если переписать этот алгоритм, используя CUDA, то он будет работать на GPU в сотни раз быстрее, а время выполнения сократится до 0.01 секунды. Таким образом, использование CUDA на GPU позволяет существенно уве- личить производительность алгоритмов компьютерного зрения, делая их быст- рее и более эффективными в обработке изображений в реальном времени. Однако стоит заметить, что параллельные процессоры, поддерживаемые СТО А, доступны далеко не на всех микрокомпьютерах. Наиболее распростра- нёнными микрокомпьютерами с поддержкой CUDA являются устройства от NVIDIA, такие как серия Jetson (например. Jetson Nano, Jetson Xavier). Они спе- циально разработаны для использования в задачах компьютерного зрения, ма- шинного обучения и других высокопроизводительных вычислений. Однако многие другие микрокомпьютеры, такие как Raspberry Pi, не имеют встроенных GPU с поддержкой CUDA. Вместо этого они обычно оснащены ин- тегрированными графическими процессорами (GPU), которые могут быть ис- пользованы для некоторых видов параллельных вычислений, но без поддержки CUDA. Для микрокомпьютеров без поддержки CUDA, программисты могут ис- пользовать альтернативные инструменты и библиотеки, такие как OpenCL или библиотеки машинного обучения, специально адаптированные для работы на центральном процессоре (CPU) или на других доступных вычислительных устройствах. Эти альтернативы могут обеспечить некоторую степень паралле- лизма и ускорения, но обычно не такую высокую, как при использовании CUDA на специализированных устройствах, таких как устройства Jetson. Именно наличие поддержки CUDA на микрокомпьютерах, таких как устройства Jetson от NVIDIA, делает их весьма востребованными в области вы- сокопроизводительных вычислений, особенно в контексте компьютерного зре- ния и машинного обучения. Такие устройства находят применение в различных областях, включая же- лезнодорожный транспорт (автоведение и обнаружения опасных ситуаций), ав- томобильную промышленность для разработки автономных транспортных средств, медицину для обработки медицинских изображений и анализа данных, а также в научных исследованиях для выполнения вычислительно сложных экс- периментов.
Благодаря высокой производительности и эффективности обработки дан- ных, микрокомпьютеры с поддержкой CUBA остаются важным инструментом в сфере высокопроизводительных вычислений, привлекая внимание различных индустрий и исследовательских групп. 93. Настройка CUDA на микрокомпьютере Jetson Nano Как было отмечено выше, Jetson Nano один из немногих одноплатных мик- рокомпьютеров, который поддерживает CUDA. CUDA - это архитектура парал- лельных вычислений, разработанная NVIDIA, которая позволяет использовать графические процессоры для ускорения обработки данных. Jetson Nano, осна- щенный графическим процессором NVIDIA, поддерживает эту технологию. Чтобы начать использовать CUDA на Jetson Nano, потребуется установить необходимые библиотеки и инструменты, которые можно загрузить с официаль- ного сайта NVIDIA. После установки можно писать и компилировать про- граммы, использующие CUDA. и выполнять их на Jetson Nano для ускоренных вычислений. Для включения CUDA следует выполнить такие пункты. 1. Выбрать репозиторий, содержащий инструкции и скрипты для сборки библиотеки OpenCV на Jetson Nano. Этот репозиторий содержит скрипты, которые помогут собрать и установить OpenCV с поддержкой CUDA на Jetson Nano. Для этого следует перейти на сайт и скопировать актуальную ссылку (рис. 9.10); https://github.com/mdegans/nano_build_ openev Рисунок 9.10 - Внешний вид странички репозитория 2. Следующий таг позволит клонировать репозиторий с необходимыми скриптами для сборки OpenCV на Jetson Nano. Для этого следует ввести команду git clone в терминале и вставить в нее с буфера, скопированную ссылку (рис. 9.11).
git clone https://gitliub.com/nulegans/tutno build opencv.git jinjetsonhacks: $ git clone https://github.com/mdegans/nano bull d opencv.git Cloning into 'nano build opencv*... remote: Enumerating objects: 469. done. remote: Counting objects: 166\ (76/76), done. remote: Compressing objects: 1694 (42/42), done. remote: Total 469 (delta 44), reused 66 (delta 33), pack-reused 3 93 Receiving objects: 166\ (469/469), 79.61 KiB | 668.66 KiB/s, done Resolving deltas: 166X (266/266), done. jim^jetsonhacks:-S И_______________________________________________ Рисунок 9.11 - Клонирование необходимого репозитория Клонирование репозитория позволит легко получить доступ к скриптам и инструкциям, которые нужны для успешной сборки OpenCV с поддержкой CUDA. После выполнения этой команды появится локальная копия репозитория, с которой можно работать. После того как операция клонирования завершится, вы сможете перейти в склонированную директорию и приступить к следующим шагам в инструкциях. 3. Далее в терминале следует ввести команду cd nano build opencv. Это переведет в директорию nano build opencv, которая была создана после клони- рования репозитория. После перехода в эту директорию все будет готово для вы- полнения следующих шагов, связанные с сборкой OpenCV на в Jetson Nano. 4. На этом этапе можно убедиться в каком статусе CUDA на компьютере: включен/выключен. Команда jtop или sudo jtop запускает инструмент монито- ринга ресурсов для Jetson, который позволяет отслеживать использование CPU, GPU, памяти и других ресурсов. Она также может отображать информацию о использовании CUDA. После выполнения этой команды вы сможете увидеть, используется ли CUDA в процессах, связанных с OpenCV (рис. 9.12). Если CUDA успешно под- ключен к OpenCV, вы увидите, что процессы OpenCV используют GPU для уско- рения вычислений. jtop 4.2.3 - (с) 2023. Raffaello Bonghl 1 raff••lloernext.it] Website: https://rnext.it/jetsoa_etats Platform Serial Hueber: ls|XX C LICK TO READ XXX]4 Hardware Systee: Linux Node!: NVIDIA Jetson Distribution: Ubu'tu IB 04 Bionic hr,ver 699-level Part Ntnber : Release: 4 9 337-tegra P-Hueber: p3448 0000 Python: 36.9 BoardIDs: p3448 Nodule: NVIDIA Jet sat Libraries Sot: tegra2lD CUDA: 10 2.300 CUDA Arch BIN: 5.3 cuDNN: 8 2.1.32 Codename: Porg TensorRT: 8.2 1 8 L4T: 32.7.4 VPI: 1 2.3 Jetpack: 4.6.4 Vulkan: 1 2.70 OpenCV: 4 1.1 with CUDA Hostnaae: jetsonbacks Interfaces ethO. 192.168.1.12 dockerO: 1 Рисунок 9.12 - Проверка подключения CUDA в программе ЛОР
Если Л ОР не был установлен, это можно сделать, выполнив команды в терминале sudo apt-get update sudo apt-get installpython3-pip python3-setuptools python3-wheel sudo pip3 install jetson-stats sudo jtop 5. Далее командой gedit build opencv.sh открываем скрипт build opencv.sh в текстовом редакторе Gedit. Этот скрипт содержит инструкции для сборки библиотеки OpenCV с поддержкой CUDA на Jetson Nano. После открытия файла build opencv.sh следует ознакомиться с его содер- жимым. Этот скрипт содержит команды для загрузки необходимых зависимо- стей, конфигурации OpenCV с поддержкой CUDA и его последующей сборки. В этот скрипт нужно внести изменения. 6. Находим строки и вносим изменения (рис. 9.13). Строку - D CUDA ARCH BIN=5.3,6.2,7.2,8.7 следует заменить на стро- ку- D CUDA _ARCH_BIN=5.3,6.2,7.2. Строку - D CUDNN VERSION-S.O’ следует заменить на строку - D CUDNN_VERSION='8.2’ Г BUIlO. (UV»lLS«*»F 0 CWUt •UnO.r*FZ>mtAft 0 СлАа! WImSIHUIx) d cutM_A»ot_ariu' м.гжГ.гл.7 • о сиы.м<н/п. 0 CUMJaIT .МАПММ G «,« _ _ _ О ПМЛ H41U0C О 0НК» .1* ,CU>**OT • 0 OPfWOl.tMail I ItMCilUTL IM JawitMTu im О fXIIU ЯХМП МТМж/Гяр/ЬмНв.оРМКУ/врФМУ.ГОМНВ/ПООЬ p owkvumiwu 0 WITH CU»|*'X* О ЫГГН CUOA.OM 0 WITH CUCNHOM .о •P WtTW*Lllv4l4H e wi т.ор(№.нж- iwnfljvfe () ( C HAKI ILAU-* 0 »UU0 CMAKltS-Off 0 BUllO <ф«ПСV_ру1ПОП*«СК • o guiu> opmcv ₽»tNonJ4* □ CMUl WHO 'lYTt-etlLASt 0 RAU |ЙМЛЫ. ИН|».$(Г«Ц|) 0 (UP* MtH «•».$. J.♦.}.».J ► .UtM Ml" Hx. t> CUM Щ1МПЫЖ •o cuM*_vt«cio*u «.»• • LlCUt'lMCLUM jtaclude/etgwJ o txuii mut-<* P 0HJKV 0МЧ CUM*P4 a oPCMCw.tMPii. чсмг*п«Ря >0 urtacw tux* лоишх! *ATH>/iRp/buttd opencw/opmcv conic tb/mxdxrt • p <Ж1ЖХ С1тжАТ1^ы.1Ж»1С~<ж P 0 M|IH •D WITH CUPNIMM О МПН 04ГЖ1АЛ1Я-СТ1 . WITH. ltBv4l«O( • 0 WITH l»IXCj JM" Рисунок 9.13 - Замена строк в скрипте build.opencv.sh Эти изменения позволят настроить сборку OpenCV с поддержкой нужных версий архитектуры CUDA и библиотеки cuDNN. После этого можно запустить скрипт сборки для обновления OpenCV с новыми параметрами. 7. Далее производим проверку замены в файле git diff. Git покажет разницу между текущим состоянием файлов и их последней фиксацией. Если вы внесли изменения, как описано вами в шагах 6, вы увидите соответству- ющие изменения в выводе git diff. 8. Далее следует запустить скрипт сборки build opencv.sh с указанием вер- сии OpenCV (в вашем случае 4.8.0), команда: ,/build_opencv.sh 4,8,0. Этот скрипт будет компилировать и устанавливать OpenCV с поддерж- кой CUDA на Jetson Nano. Сборка OpenCV может занять некоторое время, в зависимости от производительности вашего устройства и вы- бранных опций сборки.
Обычно ожидаемый промежуток времени для сборки OpenCV составляет около 5-7 часов. Может потребоваться вводить пароль периодически, особенно если требуется установить пакеты или выполнить действия, требующие приви- легий суперпользователя. Кроме того, важно позаботиться, чтобы Jetson Nano был подключен к источнику питания и имел достаточно свободного места на диске для сборки OpenCV. Также следует не забывать периодически проверять процесс сборки, чтобы убедиться, что он проходит успешно. 9. На данном этапе следует повторить пункт 4 и убедиться в каком статусе CUDA находится теперь на компьютере: включен/выключен. При успешной установке CUDA будет включен (рис. 9.14). jtop 4.2.3 - (с) 2023, Raffaello Bonghi Website: https://rnext.it/jetson_stats i [raffaelloQrnext.it] Platfora LICK TO READ XXX14 Systea: Linux Serial Hueber: [s|XX C Hardware Model: NVIDIA Jetson Distribution: Ubuntu 18.04 Bionic Beaver 699-level Part Hueber : Release: 4.9.337-tegra P-Hueber: p3448-e809 Python: 3 6.9 BoardIDs: p3448 Module: NVIDIA Jetson Libraries SoC: tcgra219 CUDA: 10.2.300 CUDA Arch BIN: 5.3 cuDNN: 8.2.1.32 Codenaae: Porg TensorRT: 8.2.1.8 L4T: 32 7.4 VPI: 1.2.3 Jetpack: 4.6.4 U..1 I™ . 1 J Lb OpenCV: 4.8.0 with CUDA: YES ke: jetsonhocks aces ethO: 192.168.1.12 dockerO: 172 17.0 1 Рисунок 9.14 - Проверка подключения CUDA в программе ЛОР После установки CUDA и проверки, что он успешно включен, у вас откры- ваются широкие возможности для разработки и запуска приложений, использу- ющих GPU для ускорения вычислений. Вот несколько рекомендаций о том, что можно сделать дальше. Важно изучить документацию по CUDA. доступно на официальном сайте NVIDIA. Это поможет понять основные концепции, архитектуру и функциональ- ные возможности CUDA. Также рассмотреть другие обучающие материалы и примеры кода, предоставляемые NVIDIA и сообществом, чтобы освоить навыки написания и запуска программы на CUDA. Множество ресурсов доступно он- лайн, включая официальные примеры и учебные курсы. Кроме того, следует начать разработку собственных приложений, исполь- зующих CUDA для ускорения вычислений. Это может быть что угодно от науч- ных вычислений и обработки данных до графических приложений и машинного обучения. Следует изучить другие методы оптимизации программ для работы на GPU. Эффективное использование ресурсов GPU может значительно увеличить производительность приложений. Важно уделять внимание тестированию и отладке CUDA-приложений. Ис- пользуйте инструменты, такие как NVIDIA Nsight и CUDA-GDB, для профили- рования, отладки и оптимизации вашего кода.
Т акже следует отмстить хороший опыт обращения за помощью в сообще- ство разработчиков CUDA. Форумы NVIDIA и другие онлайн-ресурсы могут предложить поддержку и советы по различным аспектам разработки на CUDA. Также необходимо рассмотреть возможность участия в исследовательских проектах или соревнованиях, которые используют CUDA. Это отличный способ применить навыки и получить опыт в разработке высокопроизводительных при- ложений. Следует экспериментировать и искать новые способы использования CUDA в проектах. Хорошо изучив основы и практические аспекты разработки на CUDA, можно создавать мощные и эффективные программы для различных целей. ПРАКТИЧЕСКОЕ ЗАДАНИЕ Задание 1. Напишите программу для микрокомпьютера, которая отобра- жает два окна с видео: первое - захват с веб-камеры, второе - MIPI-камеры. Задание 2. Напишите программу для микрокомпьютера с использованием алгоритма трекинга: обозначения объекта и автоматическое слежение за ним. Задание 3. Напишите программу для микрокомпьютера с использованием алгоритмов распознавания люден и автомобилей на видео стриме с MIPI-камеры. Задание 4. Произведите настройку и подключения CUDA, рассмотрен- ную в разделе 9.5. Найдите и запустите пример программы с использованием CUDA-процессора. Задание 5. Провести сравнительный анализ работы программы на базе ал- горитмов компьютерного зрения с применением и без применения видеопроцес- сора.
ЗАКЛЮЧЕНИЕ Заключая рассмотрение принципов компьютерного зрения, необходимо подчеркнуть важность его для студентов вуза. Область науки и технологий ста- новится все более востребованной в современном мире, охватывая широкий спектр отраслей, начиная от промышленности и медицины и заканчивая развле- кательными приложениями и автоматизированными системами. В данном учебном пособии автор постарался предоставить как базовые, так и продвинутые знания в области компьютерного зрения. От основных опера- ций работы с изображениями до использования нейронных сетей и алгоритмов машинного обучения, рассмотрены широкий спектр методов и техник. Практические задания, включенные в каждую главу, помогут закрепить полученные знания и развить навыки работы с изображениями на практике. За- дания призваны подготовить к решению реальных задач в сфере компьютерного зрения. Кроме того, рассмотренные функции и методы, представленные в прило- жении к пособию, позволят использовать его как подручный справочник при ра- боте со программными проектами. Автор надеется, что данное пособие станет надежным ресурсом в изучении и практическом применении компьютерного зрения, поможет расширить знания и достичь новых успехов в учебе и будущей карьере.
СЛОВАРЬ ТЕРМИНОВ Агрегация информации - это процесс объединения или сбора различных данных или фрагментов информации для создания более общею или совокупного представле- ния. В контексте нейронных сетей агрегация информации обычно происходит в слоях пу- динга после сверточных слоев. Антиалиасинг (англ, anti-aliasing) это техника, применяемая в компьютерной трафике для уменьшения ступенчатости и других артефактов, которые могут возник- нуть при дискретизации изображения или при рендеринге объектов с высокочастотными де- талями. Эта техника направлена на сглажива- ние краев изображений и создание более есте- ственного и мят кого визуального восприятия. Аугментация данных - это процесс создания разнообразных вариаций трениро- вочного набора данных путем применения различных преобразований к изображениям или данным. Эти преобразования могут включать в себя вращение, изменение раз- мера, отражение, изменение яркости и другие трансформации. Аугмен тированная реальность - тех- нология, объединяющая виртуальные объ- екты с реальным окружением, создавая улуч- шенный опыт восприятия. Пример включает использование AR-очков для отображения дополнительной информации на изображе- нии окружающего мира. Аффинное преобразование - это гео- метрическое преобразование, которое сохра- няет прямые линии и параллельность между ними. Оно включает в себя комбинацию враще- ния, масштабирования (изменение размера) и сдвига (перемещение) объекта. Аффинные пре- образования широко применяются в компью- терном зрении и компьютерной графике для Iрансформации изображений. Библиотека компьютерного зрения - программный инструментарий, обеспечиваю- щий набор функций и алгоритмов для обра- ботки и анализа изображений. Эти библиотеки предназначены для упрощения разработки про- грамм и приложений, связанных с компьютер- ным зрением, в том числе распознавание обра- зов, обнаружение объектов, трекинг, сегмента- цию и дру1 ие задачи. Библиотеки NumPy - это библиотека для языка программирования Python, предо- ставляющая поддержку для работы с много- мерными массивами и матрицами, а также математические функции для их обработки. Она является основой для многих других биб- лиотек в области научных вычислений и ком- пьютерного зрения. Библиотека OpenCV - это библио- тека с открытым исходным кодом, специали- зирующаяся на компьютерном зрении и обра- ботке изображений. Она предоставляет об- ширный набор инструментов и алгоритмов, позволяющих разрабатывать приложения, связанные с распознаванием образов, анали- зом изображений, обработкой видео и дру- гими задачами, святанными с визуальным восприятием. Билатеральный фильтр (Bilateral Filter) - это метод фильтрации изображений, который используется для сглаживания изоб- ражений, уменьшения шума, но при этом со- храняет рёбра и грани. Этот фильтр применя- ется в обработке изображений с целью улуч- шения их визуального восприятия, сохране- ния деталей и устранения шума. Бинарное изображение. Изображе- ние. в котором каждый пиксель может прини- мать только два значения: черный или белый. Бинарные изображения используются для представления форм и контуров объектов без деталей. Вейвлет-анализ в компьютерном зре- нии - это метод, использующий короткие волны (вейвлеты) для анализа изображений на различных уровнях детализации. Позво- ляет выделять и анализировать различные струк1уры и детали изображения, что по- лезно. например, при сжатии данных или об- работке изображений.
Видеокодек (кодек для видео) - это программа или устройство, которое сжимает и декодирует видеоданные для передачи, хра- нения или воспроизведения. Он используется для уменьшения размера видеофайлов без значительной потери качества изображения, позволяя эффективно передавать видео через интернет или хранить на устройствах с огра- ниченным местом. Видеокодеки могут быть стандартными (например, Н.264, Н.265, VP9) или проприетарными, и они играют ключе- вую роль в современных мультимедийных технологиях. Виджет - эго элемент пользователь- ского интерфейса, который представляет со- бой небольшое приложение или компонент, обеспечивающий определенную функцио- нальность или отображающий определенную информацию. В контексте веб-разработки ви- джеты могут быть интерактивными компо- нентами, добавляемыми на веб-страницу для предоставления различных возможное гей пользователям, таких как формы, кнопки, чаты, календари и т. д. Гигофлопс (GFLOPS) - это единица измерения производительности, используе- мая для оценки скорости вычислений в мил- лиардах операций с плавающей запятой в се- кунду. GOPS (Giga Operations Per Second) - это единица измерения производительности, которая измеряет скорость выполнения опе- раций в миллиардах операций в секунду. Эта метрика оценивает общее количество опера- ций, включая операции с плавающей запятой (FLOPS), операции без плавающей запятой (TOPS) и другие вычислительные задачи, ко- торые процессор может выполнять за одну се- кунду. Гистограмма изображения - это i ра- фическое представление распределения ин- тенсивности пикселей на изображении. Ги- стограммы используются для анализа кон- трастности и яркости изображений, а также для коррекции цветового баланса. Голова (head) (в контексте нейронной сети) служит для обнаружения объектов, обычно относится к последней части сеги, ко- торая отвечает за вывод предсказаний о нали- чии и координатах объектов на изображении. Голова сети обычно состоит из нескольких слоев, которые преобразуют признаки, извле- ченные из позвоночника и обработанные шеей, в предсказания. Эти предсказания мо- гут включать в себя координаты ограничива- ющих рамок (bounding boxes) объектов, их классы и вероятности принадлежности клас- сам. Глубокое обучение - технология, ис- пользующая искусственные нейронные сети для обучения системы на основе большого объема данных. Пример включает обучение си- стемы распознаванию речи на основе аудио- записей для более точною и эффективного распознавания речи. Гомография изображений - это пре- образование плоскости, которое используется для преобразования одного изображения в другое. Она обычно применяется в компью- терном зрении, обработке изображений, а также в компьютерной графике, особенно в контексте сопоставления изображений или стереозрения. Гомогенные координаты - это способ представления точек в пространстве, который обеспечивает унифицированный подход к описанию сдвигов, масштабирования и пер- спективных искажений. В трехмерной гео- метрии гомогенные координаты представ- лены гройками чисел (х, у, z), где эти числа могут быть любыми, но нс равными нулю. Однако при выполнении операций с этими координатами важно учитывать их пропорци- ональность. Дескрипторы представляют собой компактные векторные представления ок- рестности каждой ключевой точки. Эти век- торы содержат информацию об интенсивно- сти, цвете и структуре вокруг ключевой точки. Дескрипторы служат для описания уникальных особенностей окрестности каж- дой ключевой точки и позволяют сравнивать эти особенности между разными и зображени- ями. Они создают устойчивое и компактное представление для сопоставления объектов. Дилатация - это одна из основных операций в математической морфологии, ис- пользуемая для обработки изображений!. Она применяется к бинарным изображениям (где каждый пиксель может быть либо черным,
либо белым) и служит для увеличения раз- мера объектов на изображении. Извлечение признаков. Процесс выде- ления характеристических черт изображения для последующего анализа. Например, при распознавании лиц извлечение признаков мо- жет включать определение расположения глаз, носа и рта для точного определения лич- ности. Инверсия изображения - это процесс изменения цветовых значений пикселей изоб- ражения на противоположные. То есть, если изначально цвет пикселя был черным, после инверсии он станет белым, и наоборот. Про- цесс инверсии визуально приводи! к тому, что темные области становятся светлыми, а светлые - темными. Камера глубины. Тип камеры, способ- ной измерять расстояние до объектов, созда- вая трехмерное изображение. Пример вклю- чает использование камер глубины в вирту- альной реальное !и для точною отслеживания движений и взаимодействия пользователя с виртуальным окружением. Карта признаков (feature map) - это результат применения сверточного слоя в сверточной нейронной сети к входным дан- ным. Каждая карга признаков представляет собой двумерный массив, где каждый эле- мент (пиксель) отражает активацию опреде- ленного нейрона в сверточном слое на кон- кретном участке входного изображения. Конструктор класса - это метод (функция), который автоматически вызыва- ется при создании объекта (экземпляра) этого класса. Он выполняет начальную инициали- зацию объекта, устанавливает его начальное состояние и может принимать аргументы для передачи значений в объект. Классификация изображений. Про- цесс присвоения и зображению одной или не- скольких категорий в зависимости от его со- держания. Например, система компьютер- ною зрения может классифицировать фото- графии животных, разделяя их на категории, такие как кошки, собаки или птицы. Ключевые точки представляют собой уникальные и выдающиеся точки в изображе- нии. которые являются заметными особенно- стями. Это могут быть углы, узоры, вершины и другие места, где происходят существенные изменения в интенсивности цвета или струк- туре изображения. Ключевые точки служат как ориентиры для описания и сопоставления объектов в различных изображениях. Они об- ладают уникальными характеристиками, ко- торые делают их легко обнаруживаемыми и отслеживаемыми. Кривые Безье представляют собой ма- тематические кривые, описываемые парамет- рическим уравнением. Они используют управляющие точки для определения формы кривой. Кривые Безье широко применяются в компьютерной графике и дизайне, где они используются для создания гладких и краси- вых криволинейных форм. Они обладают свойствами гладкости, контролируемости и легкости анимации. Линейное объединение двух изобра- жений - это процесс создания нового изобра- жения путем комбинирования пикселей двух входных изображений с использованием ли- нейной комбинации. Это позволяет контро- лировать яркость и контраст обоих изображе- ний, создавая таким образом новое изображе- ние. Локальные бинарные шаблоны (Local Binary Patterns, I BP) - это метод анализа тек- стур в компьютерном зрении. Он описывает каждый пиксель изображения, сравнивая его яркость с яркостью его соседей и кодируя ре- зулы ат ы в бинарные числа. Эти числа затем объединяются для создания текстурных шаб- лонов. которые можно использовать для за- дач, таких как распознавание объектов и клас- сификация изображений. LBP обладает инва- риантностью к изменениям яркости и кон тра- ста, что делает его полезным инструментом для работы с различными условиями освеще- ния, тАР (mean Average Precision) - это метрика, используемая в компьютерном зре- нии для оценки качества моделей обнаруже- ния объектов. Она предоставляет среднее зна- чение точности но всем классам объектов, что позволяет оценить общую эффективность мо- дели.
Маркеры и трекинг. Использование маркеров или особых точек для отслеживания объектов в видеопотоке. Пример включает распознавание маркеров на карточной иг ре для создания интерактивных виртуальных элементов. Матрица пикселей - это двумерный массив чисел, где каждое число представляет собой значение интенсивности цвета или яр- кости для соответствующего пикселя на изоб- ражении. Каждый элемент матрицы пикселей содержит информацию о цвете (или оттенке серого), что в совокупности формирует ви- зуальное представление изображения. Таким образом, матрица пикселей является базовой структурой данных, используемой для хране- ния и обработки цифровых изображений в компьютерном зрении. Область интересов ROI (Region of Interest) - выделенная часть изображения, подлежащая анализу или обработке. Исполь- зование RO1 позволяет сосредоточить вычис- лительные ресурсы на конкретных областях изображения, оптимизируя процесс анализа и улучшая эффективность алгоритмов компью- терного зрения и обработки изображений. Обнаружение объектов. Принцип компьютерного зрения, направленный на вы- явление и распознавание конкретных объек- тов или паттернов на изображении. Напри- мер, в автомобильной промышленности си- стемы компьютерного зрения могут обнару- живать и распознавать другие транспортные средства или препятствия на дороге, что поз- воляет автомобилю принимать решения для безопасного движения. Оптическое распознавание символов (OCR). Технология, позволяющая компьюте- рам читать текст с изображений и преобразо- вывать его в текстовый формат. Пример ис- пользования OCR включает автоматическое распознавание текста на отсканированных документах. Отслеживание движущихся объек- тов. Технология, позволяющая системе ком- пьютерного зрения следит ь за перемещением объектов на видео или последовательности изображений. Пример применения включает системы видеонаблюдения, которые отсле- живают движущиеся люди или автомобили для обеспечения безопасности в определен- ной зоне. Паттерны - это проверенные ре- цепты для решения проблем в программиро- вании. Они помогают разработчикам созда- вать программы таким образом, чтобы они были легче понимаемыми, изменяемыми и масштабируемыми. Пиксель (от англ, «picture element») - это минимальный элемент изображения, об- ладающий определенной цветовой и яркост- ной характеристикой. Он является базовым строительным блоком для создания изобра- жения. Позвоночник (backbone) (в контексте обнаружения объектов) - это часть нейрон- ной сети, которая отвечает за извлечение при- знаков из входных изображений. Позвоноч- ник обычно состоит из серии сверточных слоев, которые постепенно уменьшают про- странственные размеры изображения, сохра- няя важные признаки. Хорошо разработан- ный позвоночник способен эффективно из- влекать признаки объектов различных форм и размеров. Полносвязные слои нейронной сети - это один из типов слоев, где каждый нейрон в слое соединен с каждым нейроном предыду- щею слоя. Эти слои играют ключевую роль в архитектуре нейронных сетей и часто ис- пользуются в конце сети для выполнения за- дач. таких как классификация, регрессия или другие виды обработки данных. Проприетарное программное обеспе- чение - это программа, чей исходный код за- крыт для общественности и контролируется ее создателем или владельцем. Доступ к коду и использование программы обычно ограни- чены лицензионным соглашением, и пользо- ватели могут использовать программу в соот- ветствии с условиями этого соглашения. Обычно такие программы являются коммер- ческими продуктами, за которые требуется оплата, и предоставляются компаниями или разработчиками с целью заработка прибыли. Пулинг (Pooling) - это операция в сверточных нейронных сетях, которая выпол- няется после применения сверточных слоев. Ее целью является уменьшение размерности
пространства признаков путем агрегации ин- формации из различных областей. Распознавание лиц. Процесс иденти- фикации и анализа уникальных характери- стик лица на изображении или видео. Пример включает использование технологии распо- знавания лиц для разблокировки устройств или обеспечения безопасности в зоне до- ступа. Распознавание образов. Способность определения объект ов или образов на изобра- жении на основе изученных шаблонов. При- мер включает распознавание букв и цифр на сканированных документах для автоматиче- ской их обработки. Рекуррентные нейронные сети (RNN). Тип нейронных сетей, способных обрабаты- вать последовательные данные и сохранять информацию о предыдущих шагах. RNN ча- сто применяются в анализе временных рядов и обработке текста. Сверточные нейронные сети (CNN). Тип нейронных сетей, специально разрабо- танный для обработки и анализа визуальных данных, таких как изображения. CNN эф- фективно распознают образы, выделяя клю- чевые признаки и позволяя более точные про- гнозы. Сегментация изображения. Основ- ное понятие в компьютерном зрении, означа- ющее разделение изображения на отдельные сегменты или объекты для более глубокого анализа. Например, при распознавании кон- туров лиц на групповом фотосистема прово- дит сегментацию для выделения каждого лица. Это помогает более точно анализиро- вать каждый элемент изображения и прини- мать соответствующие решения на основе этого анализа. «Соль-перец» - это термин, использу- емый в обработке изображений для обозначе- ния видов шума на фотог рафиях. Этот вид шума характеризуется появлением случай- ных ярких (светлых) и темных пикселей на изображении, напоминающих зерна соли и перца. Эти «зерна» представляют собой слу- чайные, изолированные пиксели с аномаль- ной интенсивностью, которые могут по- явиться из-за различных факторов, таких как электромагнитные помехи, дефекзы камеры, ошибки при передаче данных и т. д. Спектр света - это разложение света на его составляющие части по частотам или длинам волн. Свет представляет собой элек- 1рома1нитную волну, которая может иметь различные длины волн. Когда свет проходит через прозрачные среды или рассеивается на поверхностях, его составляющие части с раз- личными длинами волн могут распростра- няться с рашой скоростью или отражаться под разными углами, что приводит к разделе- нию света на различные цвета или спектраль- ные компоненты. Спектр свез а обычно вклю- чает в себя видимый диапазон (цвета радуги), а также инфракрасный и ультрафиолетовый диапазоны, которые невидимы для человече- ского глаза. Стереозрение - это способности ком- пьютерных систем воспринимать и анализи- ровать трехмерное пространство, используя информацию из нары изображений, получен- ных с разных точек обзора, как это делают два глаза у человека. Это позволяет компьютеру оценивать глубину сцены и расстояние до объектов, что является важным для многих приложений, таких как виртуальная реаль- ность, робототехника, медицинское оборудо- вание и многое другое. Стереозрение обычно основывается на алгоритмах компьютерного зрения, которые анализируют различия между изображениями и используют их для вычисления глубины. Тензор - многомерный массив дан- ных, представляющий собой основную струк- туру данных в глубоком обучении. Тензоры используются для представления изображе- ний, звука и других форм данных в нейрон- ных сетях. Тепловизионное изображение. Изоб- ражение. отображающее тепловое излучение объектов. Пример включает использование тепловизоров для обнаружения тепловых уте- чек в зданиях или поиска людей в темное время суток. TOPS - это сокращение от «тераонера- ций в секунду» (Тега Operations Per Second). Это единица измерения производительности для специализированных вычислительных устройств, таких как нейронные процессоры
(NPU) или графические процессоры (GPU), которые используются в задачах искусствен- ного интеллекта, машинного обучения и глу- бокого обучения. Фильтр Гаусса. Математический фильтр, сглаживающий изображение .цля уменьшения шума. Применяется для улучше- ния качества изображений, устранения мел- ких деталей и улучшения общей визуальной четкости. Функция в программировании пред- ставляет собой блок кода, который имеет имя. выполняет определенную задачу и может быть вызван из других частей программы для выполнения этой задачи. Функции использу- ются для структурирования кода, повторного использования и улучшения читаемости про- граммы. Цвет - это физическая и воспринима- емая характеристика света, обусловленная частотой ег'о волны. Для человеческого вос- приятия цвет обычно описывается тремя ос- новными характеристиками: оттенок (какой именно цвет), насыщенность (чистота или ин- тенсивность цвета) и яркость (светимость или темнота цвега). Цветовая коррекция - это процесс из- менения цветовой палитры статического изображения или видео с целью улучшения ее визуального восприятия. Шея (neck) (в контексте нейронной сети) - это часть нейронной сети, которая находится между позвоночником и головой (head) сети. Шея обычно состоит из дополни- тельных слоев или операций, которые помо- гают объединить и аг регировать признаки, извлеченные из позвоночника. Это позволяет сети получить более высокоуровневые при- знаки, что улучшает точность обнаружения объектов.
список рекомендуемой литературы 1. Алго, Э. Python кратко. Пер. с англ. - М.: ДМК Пресс, 20J 8. - 336 с. 2. Варне, Т, Arduino: Программирование и проектирование. Пер. с англ. - М.: ДМК Пресе, 2013. - 336 с. 3. Ьреп, Г., & Каан, П. (2013). Введение в микроконтроллеры. Пер. с англ. - М.: Бином. Лаборато- рия знаний, 2013. -352 с. 4. Гари, Э. Raspberry Pi: Полное руководство. Пер. с англ. - М.: Эксмо, 2017.-480 с. 5. Марк Лутц. Изучаем Python. 4-е издание. Пер. с англ. - М.: Вильямс, 2019. - 1264 с. 6. Матвеев. А. 1 Графическое руководство по микроконтроллерам. - СПб.: БХВ-Петербург, 2019. - 512с. 7. Печатников. В. Программирование микрокон гроллеров на языке С. - М.: ДМК Пресс, 2018. - 464 с. 8. Рейнхард К., Компьютерное зрение: теория и алгоритмы. М.: ДМК Пресс, 2019. - 506 с. 9. Forsyth, D. A.. Ponce, J. Введение в компьютерное зрение. Пер. с англ. - М.: ДМК 1 Ipccc, 2012. - 704 с. 10. Girshick, R., Donahue. J., Darrell. T.. & Malik. J. (2014) Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 580-587. 11. Gonzalez, R. C., & Woods, R. E. Цифровая обработка изображений и компьютерное зрение. Пер. с ан!л. - М.: Бином. Лаборатория знаний. 2018. - 1070 с. 12. Goodfellow, I., Bengio, Y., Courville, А. Глубокое обучение. Пер. с англ. - М.: Издательский дом «Вильямс», 2016. - 798 с. 13. Joseph Redmon, Ali Farhadi. (2018). YOLOv3: An Incremental Improvement. arXiv preprint arXiv: 1804.02767. 14. OpenCV: A Library for Computer Vision / Gary Bradski, Adrian Kaehler - Dr. Dobb's Journal, 2008. - https://www.drdobbs.com/epp/openev-al ibrary-for-computer-vision/184400632 15. Smith, J. (2023). Deep Learning for Object Detection in Autonomous Vehicles. IEEE Transactions on Pattern Analysis and Machine Intelligence, 45( 10), 2500-2515. New York: IEEE. 16. Shapiro, L. G., & Stockman, G. С. Распознавание объектов в изображениях. Пер. с англ. - М.: Бином. Лаборатория знаний, 2002. - 744 с. 17. Szeliski, R Визуальное распознавание образов. Пер. с англ. - М.: ДМК Пресс, 2010. - 624 с.
ПРИЛОЖЕНИЕ Основные функции, используемые в компьютерном зрении - обработка изображений геометрические преобразования - обнаружение и анализ объектов - визуализация и взаимодействие - загрузка и сохранение данных И cv2.absdiff() Назначение: функция, в библиотеке OpenCV используется для вычисления абсолютной разности между двумя массивами или изображениями. Описание формата функции: cv2.absdiff(srcl, src2, dst), где srcl и src2 - входные массивы или изображения, между которыми необхо- димо вычислить абсолютную разность. Они должны иметь одинаковый размер и тип данных; dst (опционально) - массив или изображение, в которое будет сохранен ре- зультат вычисления абсолютной разности. Если не указано, функция создает но- вый массив. Пример: image 1 = cv2.imreadf image I. jpg') image2 = cv2. imreadf image2.jpg) diff= cv2.absdiff(image I, image2) cv2.addWeighted() Назначение: функция, предназначенная для создания взвешенной суммы двух изображений. Описание формата функции: cv2.addWeighted(srcl, alpha, src2, beta, gamma, dst), где srcl - первое изображение; alpha — весовой коэффициент для sre 1 [0, 11; src2 - второе изображение; beta - весовой коэффициент для src2 [О, I]; gamma — коэффициент добавления (смешение). Может быть представлено любым вещественным числом;
dst (опционально) - результирующее изображение. Если нс указано, функ- ция создает новое изображение. Формула для вычисления взвешенной суммы: dst — sr cl • alpha + src2 • beta + gamma. Пример: result = cv2.addWeighted(frame 1, 0.7,frame2, 0.3, 0) И cv2.bilateralF)lter() Назначение: функция библиотеки OpenCV, выполняющая билатеральную фильтрацию изображения. Описание формата функции: cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst, borderType), где sre - исходное изображение; d - диаметр каждого пикселя окрестности вокруг центрального пикселя. sigmaColor - стандартное отклонение в цветовом пространстве. Чем выше значение, тем меньше эффект фильтрации по цвету; sigmaSpace - стандартное отклонение в физическом пространстве. Чем выше значение, тем больше пиксели учитываются при фильтрации; dst (опционально) - результирующее изображение. Если не указано, функ- ция создает повое изображение; borderType (опционально)-способ обработки краев. Но умолчанию исполь- зуется cv2. В ORDER DEFA UL Т. Пример: d = 20 sigma color = 100 sigma space = 120 blurred image = cv2.bilateralFilter(image, d, sigma color, sigma space) cv2.bitwise_and() Назначение: функция библиотеки OpenCV, которая выполняет побитовое «и» между двумя изображениями. Описание формата функции: cv2. bitwise and(srcl, src2, dst, mask), где srcl - первое изображение; src2 - второе изображение; dst (опционально) - результирующее изображение. Если не указано, функ- ция создаст новое изображение; mask (опционально) - маска, определяющая области, в которых применя- ется операция «и». Пример: result = cv2.bitwise_and(frame, frame, mask-mask)
cv2.bitwise_not() Назначение: функция библиотеки OpenCV, которая выполняет побитовое отрицание для каждого пикселя изображения. Описание формата функции: cv2, bitwise notfsrc, dst, mask), где sre - исходное изображение; dst (опционально) - результирующее изображение. Если не указано, функ- ция создает новое изображение; mask (опционально) - маска, определяющая области, в которых применя- ется операция отрицания. Пример: inverted frame = cv2. bitwise not(frame) cv2.boxFilter() Назначение: функция библиотеки OpenCV, выполняющая фильтрацию изображения с использованием прямоугольного (box) ядра. Описание формата функции: cv2.boxFilter(src, ddepth, ksize, dst, anchor, normalize, borderType), где sre - исходное изображение; ddepth - глубина результирующего изображения. Если -1, то используется та же глубина, что и у входного изображения; ksize (опционально) - размер прямоугольного ядра. Должен быть нечетным и положительным; dst (опционально) - результирующее изображение. Если не указано, функ- ция создает новое изображение; anchor (опционально) - центр прямоугольного ядра. По умолчанию (-1, -1), что означает центр ядра; normalize (опционально) - флаг, указывающий, следует ли выполнять нор- мализацию ядра. 11о умолчанию True; borderType (опционально) - способ обработки краев. По умолчанию исполь- зуется cv2.BOR.DER DEFAULT. Пример: filtered image— cv2.boxFilter (image, -1, (5, 5)) cv2.boxPoints() Назначение: функция библиотеки OpenCV, которая используется для вы- числения вершин прямоугольника на основе информации, полученной от функ- ции с v2. min A reaRectf). Описание формата функции: points = cv2.boxPoints(box),
где box - кортеж, представляющий прямоугольник, как его центр, размеры и угол поворота, как возвращается функцией cv2.minAreaR.ect(); Возвращаемое значение points представляет собой массив из четырех вер- шин прямоугольника. Пример: points = cv2.boxPoints(rect) # Отрисовка прямоугольника по его вершинам points = np.intO(points) cv2.drawContours(img, [points], 0, (0, 0, 255), 2)) M cv2.calcHist() Назначение: функция библиотеки OpenCV, которая используется для вы- числения гистограммы изображения Описание формата функции: cv2.calcHist(images, channels, mask, histSize, ranges, hist, accumulate), где images - список изображений, для которых вычисляется гистограмма; channels - индексы каналов, для которых вычисляется гистограмма. Напри- мер, для изображения в оттенках серого это может быть |0], для цветного - [0,1,2]; mask - маска изображения. Гистог рамма будет вычисляться только для пик- селей, соответствующих ненулевым значениям маски; histSize — количество корзин в гистограмме; ranges - диапазон значений пикселей. Обычно это [0, 256], но может быть настроено на конкретный диапазон значений; hist (опционально) - результирующая гистограмма; accumulate (опционально) - если установлено в True, гистограмма будет накапливаться. Пример: hist = cv2.calcHist([gray], [0], None, [256], [0, 256]) cv2.Canny() Наш а чем не: функция библиотеки OpenCV, для обнаружения границ на изображении с использованием алгоритма Саппу. Описание формага функции: cv2.Canny( image, threshold I, threshold2, edges, apertureSize, L2gradient), где image - исходное изображение в опенках серого; threshold! - первый порог для гистерезиса; threshold2 - второй порог для гистерезиса; edges (опционально) - результирующее изображение границ. Если не ука- зано, функция создает новое изображение;
apertureSize (опционально) - размер ядра Собеля для вычисления производ- ных. По умолчанию 3; L2gradient (опционально) - флаг, указывающий, следует ли использовать более точное вычисление градиента (True) или менее точное (False). По умолча- нию False. Пример: edges = cv2.Саппу (image, 50, 150) cv2.CascadeClassifier() Назначение: функция из библиотеки OpenCV, которая используется для за- грузки каскадов Хаара или каскадов ЛБП (локальных бинарных шаблонов) для обнаружения объектов на изображения Описание формата функции: cv2. Cascaded ass ifier (filename), где filename - путь к %Л/С-файлу, содержащему описание каскада Хаара или ЛБП; Этот метод возвращает объект классификатора каскада, который можно ис- пользовать для дальнейшего обнаружения объектов на изображениях с помощью метода detect Mult iScale(). Пример: # Загрузка каскада Хаара для обнаружения лии face cascade =cv2.CascadeClassifierfhaarcascade frontalface default.xml) image = cv2.imread('people.jpg') # Обнаружение лиц ни изображении faces =face cascade.detectMultiScale(image, scaleFactor=l.l, minNeighbors-5) ® cv2.circle() Назначение: функция библиотеки OpenCV, которая используется для отри- совки круга. Описание форма!а функции: cv2.circle(img, center, radius, color, thickness, lineType, shift), где img - изображение, на котором будет производиться отрисовка круга; center - координаты центра круга (х, у); radius - радиус круга; color - цвет круга в формате BGR (синий, зеленый, красный); thickness - толщина границы круга. Если значение отрицательное, круг бу- дет закрашен; ИпеТуре - тип линии границы. По умолчанию используется cv2.LINE 8. Другие возможные значения включают cv2.LINE 4 и cv2.LINE АА (антиали- асинг);
shift - количество битовых сдвигов при вычислении координат. Обычно устанавливается в 0. Пример: center = (150, 150) radius = JOO color = (0, 0, 255) thickness = 2 cv2.circle(frame, center, radius, color, thickness) cv2.convertScaleAbs() Натачение: функция библиотеки OpenCV, которая выполняет абсолютное масштабирование и преобразование типа данных для каждого пикселя изобра- жения. Описание формата функции: cv2.convertScaleAbs(src, dst, alpha, beta), где sre - исходное изображение; dst (опционально) - результирующее изображение. Если не указано, функ- ция создает новое изображение: alpha (опционально) - масштабный коэффициент. Если не указан, по умол- чанию равен 1; beta (опционально) - аддитивный коэффициент. Если не указан, по умолча- нию равен 0. Формула для вычисления каждого пикселя: dst(x, у) = saturate cast<uint8 t>(\src(x, у) 'alpha + beta) Пример: frame4 - cv2.convertScaleAbs(frame, 2.0, 50) 11 cv2.createTrackbar() Назначение: функция используется для создания ползунка (trackbar) на окне изображения. Ползунок предоставляет пользователю интерактивный спо- соб управления парамеч рами приложения, такими как яркость, контраст, или лю- быми другими числовыми значениями. Описание формата функции: cv2.createTrackbar(trackbarName, windowName, min Value, max Value, onChange), где trackbarName — строковый параметр, представляющий название ползунка: windowName - строковый параметр, представляющий название окна, к ко- торому будет привязан ползунок; minValue, maxValue- числовые параметры, представляющие минимальное и максимальное значения, которые может принимать ползунок:
onChange - функция обратного вызова (callback), которая будет вызываться при изменении положения ползунка. Функция должна иметь один аргумент, ко- торый будет содержать текущее положение ползунка. Пример: cv2.createTrackbar(«Tracccc», 'Video Frame', 0, 255, lambda x: None) cv2.namedWindow('My Window', cv2. WINDOW NORMAL) def onChange(value): print(value) H Получение значения ползунка trackbar value = cv2.getTrackbarPos(«Tracccc», 'Video Frame) # Вызов функции обратного вызова onChangeftrack bar value) cv2.cvtColor() Назначение: функция библиотеки OpenCV используется для изменения цветового пространства изображения. Описание формата функции: cv2. cvtColor(sre, code, dst, dstCn), где sre - исходное изображение, которое нужно преобразовать; code — код цветового пространства для преобразования. Например, cv2.COLOR BGR2GRAY: Преобразование из BGR в оттенки серого; cv2.COLOR BGR2RGB: Преобразование из BGR в RGB; cv2. COLOR BGR2HSV: Преобразование из BGR в HSV; cv2.COLOR BGR2LAB: Преобразование из BGR в LAB; cv2.COLOR BGR2YUV: Преобразование из BGR в YUV; cv2.COLOR BGR2HLS: Преобразование из BGR в HLS; cv2.COLOR BGR2XYZ: Преобразование из BGR в XYZ; cv2. COLOR BGR2LUV: Преобразование из BGR в LUV; cv2.COLOR BGR2YCrCb: Преобразование из BGR в YCrCb; cv2.COLOR BGR2HSV FULL: Полная версия преобразования из BGR в HSV; cv2.COLOR BGR2HLS FULL: Полная версия преобразования из BGR в HLS; cv2.COLOR BGR2YUVJ420: Преобразование из BGR в YUV 1420; cv2.COLOR BGR2YUV_YV12: Преобразование из BGR в YUV YVI2. dst (необязательный) - выходное изображение. Если нс указан, функция со- здаст новый массив для хранения результата; dstCn (необязательный) - количество каналов в выходном изображении. Если dstCn равен 0 (по умолчанию), то количество каналов в выходном изображении будет равно количеству каналов в исходном изображении (sre). Если dstCn установлен в 1, то результатом будет одноканальное (черно- белое) изображение (например, оттенки серого). Если dstCn установлен в 3, то результатом будет трехканальное цветное изображение (например, RGB).
Пример: gr= cv2.cvtColor (frame, cv2.COLOR BGR2GRAY) cv2.destroyAI)Windows() Назначение: функция библиотеки OpenCV используется для закрытия всех окон, которые были созданы библиотекой OpenCV. Описание формата функции: cv2. destroy All Windows () 11ри.мер: cv2.destroyAllWindowsQ cv2.detectMultiScale() Назначение: функция из библиотеки OpenCV, используемая для обнаруже- ния объектов на изображении с использованием каскадов Хаара. Эта функция позволяет обнаруживать объекты разного размера и расположения на изображе- нии. Описание формата функции: detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize), где image - входное изображение, на котором производится обнаружение объ- ектов; scaleFactor - параметр, указывающий, на сколько уменьшается размер окна при каждой попытке обнаружения объекта. Этот параметр определяет, на сколько уменьшается размер окна на каждой итерации. Значение scaleFactor должно быть больше 1.0. Меньшие значения scaleFactor увеличивают количе- ство окон, в которых выполняется поиск, что может привести к большему коли- честву обнаруженных объектов, но также может увеличить время выполнения. Обычно scaleFactor выбирают в диапазоне от 1.01 до 1.5; minNeighbors - параметр, указывающий, сколько соседей должно иметь кан- дидат в объект, чтобы его можно было считать действительным. Этот параметр используется для фильтрации ложных положительных результатов. Большие значения minNeighbors уменьшают количество обнаруженных объектов, но мо- гут увеличить вероятность пропуска реальных объектов. Обычно minNeighbors выбирают в диапазоне от 3 до 6; flags (опционально) - дополнительные флаги, которые могут быть исполь- зованы в процессе обнаружения объектов; minSize (опционально) - минимальный размер объекта, который может быть обнаружен; maxSize (опционально) - максимальный размер объекта, который может быть обнаружен. Пример: # Загрузка каскада Хаара для обнаружения лиц face cascade =cv2.CascadeClassifier(,haarcascadeJrontalface_default.xml')
image = cv2. imreadf 'people.jpg') # Обнаружение лиц на изображении faces =face cascade, detect MuitiScalef image, scaleFactor^l.l, minNeighbors=5) -1 cv2.dilate() Назначение: функция библиотеки OpenCV, используемая для расширения белых областей в изображении (бинарной маске) путем применения морфологи- ческой операции дилатации. Описание формата функции: cv2.dilate(src, kernel, dst, anchor, iterations, borderType, border Value), где sre - исходное изображение (входное одноканальное бинарное изображение или изображение с яркостью в одном канале). kernel - прямоугольное или квадратное ядро (маска), которое опреде- ляет форму расширения. Оно должно быть небольшого размера и иметь значе- ние 1 внутри него. Это может быть создано с помощью функции cv2.getStriicturingElement(). с/л! (опционально) - массив для сохранения результата дилатации. anchor (опционально) - позиция якоря в ядре. По умолчанию (-1, -1) озна- чает, что якорь находится в центре ядра. iterations (опционально) - количество итераций дилатации, по умолчанию 1. borderType (опционально) - тип т ран ины, который будет применяться в слу- чае выхода за границы изображения. По умолчанию используется cv2. BORDER CONSTANT. borderValue (опционально) - значение, которое будет использоваться для граничных пикселей, если тип границы cv2.BORDER CONSTANT. По умолча- нию 0. Пример: kernel = np.ones((3,3), np.uint8) dilated image = cv2.dilate(image, kernel) I cv2.drawContours() Назначение: функция библиотеки OpenCV, используемая для рисования контуров на изображении. Описание формата функции: cv2.drawContours( image, contours, contourldx, color, thickness, UneType, hierarchy, maxLevel, offset), где image - изображение, на котором будут отображены контуры; contours - список конт уров, которые необходимо нарисовать; contourldx - индекс контура из списка contours, который нужно нарисовать. Чтобы нарисовать все контуры, можно передать -1;
color - цвет контура. Это может быть кортеж или список в формате BGR, например, (255, 0, 0) для синего цвета; thickness (необязательно) - толщина контура. Если параметр не указан, кон- тур будет нарисован без заполнения; ИпеТуре (необязательно) - тип линии. Может быть использован один из сле- дующих вариантов: cv2.LINE 4, cv2.LINE 8, cv2.LINE А А (антиалиасинг) hierarchy (необязательно) - иерархическая структура контуров; maxLevel (необязательно) - максимальный уровень иерархии, который бу- дет использоваться для рисования контуров; offset (необязательно) - дополнительное смещение точек контуров. Пример: image = cv2.drawContours(image, contours, -I, (0, 255, 0), 2) Я cv2.ellipse() Назначение: функция библиотеки OpenCV, которая используется для отри- совки эллипса. Описание формата функции: cv2.ellipse(img, center, axes, angle, st art Angle, end Angle, color, thickness, lineType, shift), где: img - изображение, на котором будет производиться отрисовка эллипса; center - координаты центра эллипса (х, у); axes - длины полуосей эллипса (major axis, minor axis); angle - угол поворота эллипса в градусах; startAngle - начальный угол дуги эллипса в градусах; endAngle- конечный угол дуги эллипса в градусах; color- цвет эллипса в формате BGR; thickness-толщина границы эллипса. Если значение отрицательное, эллипс будет закрашен; ИпеТуре - тип линии границы. По умолчанию используется cv2.L!NE 8; shift - количество битовых сдвигов при вычислении координат. Обычно устанавливается в 0. Пример: center = (300, 350) axes = (200, 50) angle = 30 startAngle = О endAngle = 360 color = (0, 255, 0) thickness = 2 cv2.ellipse(frame, center, axes, angle, startAngle, endAngle, color, thickness)
cv2.erode() Назначение: функция библиотеки OpenCV, используемая для сужения бе- лых областей в изображении (бинарной маске) путем применения морфологиче- ской операции эрозии. Описание формата функции: cv2. erode (sre, kernel, dst, anchor, iterations, horderType, borderVahie), где sre - исходное изображение (входное одноканальное бинарное изображение или изображение с яркостью в одном канале). kernel — прямоугольное или квадратное ядро (маска), которое опреде- ляет форму сужения. Оно должно быть небольшого размера и иметь значе- ние I внутри него. Это может быть создано с помощью функции cv2. getStructuringElement(). dst (опционально) - массив для сохранения результата эрозии. anchor (опционально) - позиция якоря в ядре. По умолчанию (-1, -1) озна- чает, что якорь находится в центре ядра. iterations (опционально) - количество итераций эрозии, по умолчанию 1. horderType (опционально) - тип границы, который будет применяться в слу- чае выхода за границы изображения. По умолчанию используется cv2.BORDER CONSTANT borderVahie (опционально) - значение, которое будет использоваться для граничных пикселей, если тип границы cv2.BORDER CONSTANT По умолча- нию 0. Пример: # Создание структурирующего элемента (ядра) для эрозии kernel = np.ones((5,5), np.uint8) # Чтение изображения image = cv2.imreadfimage.jpg', cv2.IMREAD GRAYSCALE) # Применение эрозии к изображению eroded image = cv2.erode(image, kernel) cv2.filter2D() Назначение: функция, библиотеки OpenCV выполняющая двумерную свертку изображения с ядром (фильтром). Описание формата функции: cv2Jilter2D(src, ddepth, kernel, dst, anchor, delta, horderType), где sre - исходное изображение; ddepth — глубина результирующего изображения. Если -1. то используется та же глубина, что и у входного изображения; kernel - ядро (фильтр), с которым выполняется свертка: dst (опционально) - результирующее изображение. Если не указано, функ- ция создает новое изображение;
anchor (опционально) - центр ядра. По умолчанию (-1, -1), что означает центр ядра; delta (опционально) - смещение добавляемое к вычисленным значениям. По умолчанию 0; borderType (опционально) - способ обработки краев. По умолчанию исполь- зуется cv2.BORDER DEFAULT. Пример: # Определение ядра (пример: усиление границ) kernel = np.array([[0, -I, 0], [-1, 5, -I], [0, -I, 0]]) # Применение свертки filtered image = cv2.filter2D(image, -I, kernel) cv2.findContours() Назначение: функция библиотеки OpenCV, используемая для поиска кон- туров в бинарном изображении или изображении с каналом контура. Описание формата функции: cv2.findContours (image, mode, method, contours, hierarchy, offset), где image - исходное изображение, на котором производится поиск контуров. Должно быть бинарным изображением (обычно после пороговой обработки) или изображением с каналом контура; mode - определяет режим поиска контуров. Может быть одним из следую- щих значений: cv2 RETR EXTERNAL - возвращаются только внешние контуры; cv2.RETR LIST - возвращается список всех контуров без иерархии; cv2.RETR ССОМР - возвращается иерархический список контуров с двумя уровнями иерархии; cv2.RETR TREE - возвращается полное дерево контуров всех уровней; method - определяет метод аппроксимации контуров. Может быть одним из следующих значений: cv2. CHAIN APPROX NONE - возвращаются все точки контура; cv2.CHAIN APPROX SIMPLE - сжимает все горизонтальные, вертикаль- ные и диагональные сегменты и оставляет только конечные точки; cv2.CHAlN APPROX ТС89 LI, cv2.CHAIN_ APPROX ТС89 KCOS - ап- проксимирует контуры при помощи алгоритма Teh-Chin; contours (необязательно) - список контуров; hierarchy (необязательно) - иерархическая структура контуров; offset (необязательно) - дополнительное смещение точек контуров. Функция cv2.findContours() возвращает кортеж из трех элементов: исходное изображение, contours - список контуров, hierarchy - иерархия контуров. Пример 1: contours, hierarchy = cv2ffindContours (image, cv2.RETR TREE, cv2. CHAIN AP- PROX SIMPLE)
Пример 2: kontur, = cv2.flndContours(binar,cv2.RETR EXTERNAL,cv2.CHAIN APPROX NONE) cv2.flip() Назначение: функция библиотеки OpenCV, которая выполняет отражение (зеркальное отражение) изображения в указанном направлении Описание фирма!а функции: cv2 fl ip(src, flipCode), где src - исходное изображение; flipCode- код направления отражения. Может принимать одно из трех зна- чений: 0: отражение по вертикали (переворачивание изображения вверх-вниз); I: отражение по горизонтали (зеркальное отражение); - 7. отражение и по вертикали, и ио горизонтали. Пример: flipped horizontal = cv2.flip(image, 1) cv2.GaussianBlur() Назначение: функция библиотеки OpenCV, применяющая размытие по Гауссу к изображению. Описание форма!а функции: cv2.GaussianBlur(src, ksize, sigmaX, dst, sigmaY, borderType), где src - исходное изображение; ksize- размер ядра филыра Гаусса. Должен быть нечетным и положительным; sigmaX- стандартное отклонение по оси X; dst (опционально) - результирующее изображение. Если не указано, функ- ция создает новое изображение; sigma К (опционально) - стандартное отклонение по оси Y. Если не указано, оно считается равным sigmaX; borderType (опционально) - способ обработки краев. По умолчанию исполь- зуется cv2.BORDER DEFAULT. Пример: kernel size — (15, 15) sigma x = 0 blurred image = cv2.GaussianBlur(image, kernel size, sigma x) cv2.getRectSubPix() Назначение: функция библиотеки OpenCV используется для извлечения прямоугольной области (подокна) из изображения с подпиксельной точностью. Это означает, что вы можете указать координаты центра подокна с дробными значениями.
Описание формата функции: cv2.getRectSubPix(image, patchSize, center), где image - исходное изображение, из которого нужно извлечь подокно; patchSize- размеры подокна, указанные в формате (ширина, высота); center - координаты центра подокна на исходном изображении. Эти коор- динаты могут быть указаны с подпиксельной точностью, то есть с дробными зна- чениями. Функция возвращает извлеченное подокно изображения. Пример: # Загрузка изображения image = cv2. imreadfimage.jpg') # Размеры и координаты центра подокна patchSize = (50, 50) center - (100.5, 100.5) # Извлечение подокна из исходного изображения patch - cv2. getRectSubPixfimage, patchSize, center) cv2.getRotationMatrix2D() Назначение: функция библиотеки OpenCV возвращает матрицу преобразо- вания для выполнения вращения изображения вокруг определенного центра, за- данного угла и масштаба. Описание формата функции: cv2.getRotationMatrix2D(center, angle, scale), где center - координаты центра вращения в формате (х, у); сш^/е-угол вращения в градусах: scale- масштабирование (необязательный параметр). Если scale > 1.0. изоб- ражение увеличится после вращения. Если scale < 1.0, изображение уменьшится после вращения. Если scale = 1.0, размер изображения не изменится после вра- щения. Пример: rotation matrix = cv2.getRotationMatrix2D((width / 2,height / 2), angle, 1) rotated image = cv2.warpAffine(original image, rotation matrix, (width, height)) W cv2.getT rackbarPos() Назначение: функция используется для получения текущего положения ползунка в окне. Опа позволяет получить текущее числовое значение, установ- ленное пользователем с помощью ползунка. Описание формата функции: cv2.getTrackbarPos(lrackharname, winname), где trackharnamc — строковый параметр, представляющий имя ползунка;
winname-строковый параметр, представляющий имя окна, к которому при- вязан ползунок; value - числовое значение, представляющее текущее положение ползунка. Пример: cv2.createTrackbar («Тгасссс», 'Video Frame', 0, 255, lambda х: None) cv2.namedWindow('MyWindow', cv2. WINDOW NORMAL) def onChange(value): print (value) # Получение значения ползунка trackbar value = cv2.getTrackbarPos(«Tracccc», 'Video Frame') # Вызов функции обратного вызова onChangeftrack bar value) ___ cv2.imread() Назначение: Функция библиотеки OpenCV используется для чтения изоб- ражения с диска. Описание формата функции: ev2. imread(filename, flags), где filename — строка, представляющая путь к файлу изображения; flags (необязательный) - этот параметр указывает способ чтения изображения. Он может принимать различные значения, но наиболее часто используемые это cv2.IMREAD COLOR, cv2.IMREAD GRAYSCALE, и cv2.IMREAD UNCHANGED. По умолчанию используется cv2.1MREAD COLOR, который загружает изобра- жение в цвете. Пример: image = cv2.imread('C:/Users/kartinka.jpg) И cv2.imshow() Назначение: функция библиотеки OpenCV используется для отображения изображения в окне. Описание формата функции: cv2. imshow(winname, mat), где winname - строка, представляющая название окна, в котором будет отобра- жено изображение; mat - изображение в виде массива (например, NumPy-массив), которое вы хотите отобразить в окне. Пример: ev2. imshow('Image', image) ___ cv2. imwrite() Назначение: Функция библиотеки OpenCV используется для сохранения изображения в файл.
Описание формата функции: cv2.imwrite(filename, image, params), где filename - имя файла (включая путь), в который будет сохранено изображение; image- изображение, которое нужно сохранить; params (необязательный) - параметры сохранения изображения. 11апример, можно указать качество для формата JPEG. Пример: cv2. imwrite('output image.jpg', inverted image) cv2.inRange() Назначение: функция библиотеки OpcnCV, предназначенная для создания бинарного изображения, выделяя пиксели из исходного изображения, находящи- еся в заданном цветовом диапазоне, и устанавливая их в белый цвет, в то время как остальные пиксели устанавливаются в черный цвет. Описание форма1а функции: cv2.inRange(src, lower, upper, dst), где src - исходное изображение; lower - нижняя граница цветового диапазона в формате (В, G, R); upper - верхняя граница цветового диапазона в формате (В, G, R); dst (опционально) - результирующее изображение. Если не указано, функ- ция создает новое изображение. Пример: mask = cv2.inRange(frame, np.array([40, 40, 40]), np.array([80, 255, 255])) О cv2.Laplacian() Назначение: функция библиотеки OpenCV, выполняющая операцию Лапласа на изображении. Описание формата функции: cv2.Laplacian(src, ddepth, dst, ksize, scale, delta, borderType), где src - исходное изображение; ddepth - глубина результирующего изображения. Если -1, то используется та же глубина, что и у входного изображения; dst (опционально) - результирующее изображение. Если не указано, функ- ция создает новое изображение; ksize (опционально) - размер ядра оператора Лапласа. По умолчанию 1; scale (опционально) - масштабный коэффициент для вычисленных значе- ний. По умолчанию 1; delta (опционально) - смещение добавляемое к вычисленным значениям. 11о умолчанию 0; borderType (опционально)-способ обработки краев. По умолчанию исполь- зуется cv2. BORDER DEFA UL T
Пример: laplacian image = cv2. Laplacian! image, cv2.CV 64F) # Конвертация результата в изображение с глубиной в uint8 laplacian image = npMint8(np.abs(laplacian image)) И cv2Jine() Назначение: функция библиотеки OpenCV. которая используется для отри- совки линий. Описание формата функции: cv2.Hne(img, ptl, pt2, color, thickness, lineType, shift), где img - изображение, на котором будет производиться отрисовка линии; ptl - координаты первой точки (х, у); pt2 - координаты второй точки (х, у); color - цвет линии в формате BGR (синий, зеленый, красный). Например, (255. О, 0) представляет собой синий цвет; thickness - толщина линии. Если значение отрицательное (например, -1), то линия будет закрашена; ПпеТуре - тип линии. Это параметр, который определяет форму концов ли- нии. По умолчанию используется cv2.LINE_8. Другие возможные значения включают cv2.L!NE 4 и cv2.L1NE АА (антиалиасинг); shift - количество битовых сдвигов при вычислении координат. Обычно устанавливается в 0. Пример 1: ptl = (50, 50) pt2 = (200, 200) color = (О, 255, 0) thickness = 2 cv2.line(frame, ptl, pt2, color, thickness) Пример 2: cv2,line(frume, (60,100), (260,350), (0,0, 255), 2) cv2.magnitude() Назначение: функция библиотеки OpenCV, которая используется для вы- числения магнитуды (величины) комплексного числа, представляющего вектор, в двумерном пространстве. Описание формата функции: cv2.magnitude(x, у, magnitude), где х- массив с компонентами вектора по оси X. у - массив с компонентами вектора по оси У. magnitude (опционально) - массив для сохранения результатов вычисления магнитуды. Если нс указан, функция создает новый массив.
Этот Mei од возвращает массив с вычисленными магнитудами для каждого вектора, заданного компонентами х и у. Пример: # Создание массивов с компонентами векторов х = пр.аггау([1, 2, 3]) у = пр.аггау([4, 5, 6/) # Вычисление магнитуды векторов magnitude result = cv2. magnitude(x, у) cv2.medianBlur() Назначение: функция библиотеки OpenCV, применяющая медианный фильтр к изображению. Описание формата функции: cv2.medianBlur(src, ksize, dst), где sre - исходное изображение; ksize — размер квадратного окна для вычисления медианы. Должен быть не- четным и положительным; dst (опционально) - результирующее изображение. Если не указано, функ- ция создает новое изображение. Пример: blurred image - cv2.median Blur (image, 5) cv2.merge() Назначение: функция библиотеки OpenCV, используется для объединения отдельных каналов цвета в одно многоцветное изображение. Описание формата функции: cv2. merge(channels), где channels - список или кортеж отдельных изображений, представляющих от- дельные каналы цвета (например, каналы В, G и R). Пример: b = cv2.imread('blue channel.jpg'. cv2.IMREAD GRAYSCALE) g = cv2.imread('green channel.jpg', cv2.IMREAD GRAYSCALE) r = cv2.imread('red channel.jpg', cv2.IMREAD GRAYSCALE) merged image = cv2.merge([b, g, r]) cv2.minAreaRect() Назначение: функция библиотеки OpenCV, которая используется для по- иска минимальной ограничивающей прямоугольной области вокруг заданного набора точек или контура на изображении. Эта функция возвращает прямоуголь- ник, который описывает минимальную ограничивающую область.
Описание формата функции: rect -cv2. minAreaRect(points), где points - массив точек или контур, вокруг которых требуется построить ми- нимальную ограничивающую прямоугольную область. Возвращаемое значение rect представляет собой кортеж, содержащий ин- формацию о прямоугольнике, включая центр, размеры, угол поворота. Пример: rect = cv2. minAreaRectfcontour) # Отрисовка минимальной ограничивающей прямоугольной области box = cv2. boxPoints(rect) box = np.intO(box) cv2.drawContours(img, [box], 0, (0, 0, 255), 2) 1 cv2*moveWindow() Назначение: функция библиотеки OpenCV, которая используется для пере- мещения окна с изображением на экране. Эта функция принимает два аргумента: имя окна и координаты, куда следует переместить окно. Описание формата функции: cv2.moveWindow(windowName, х, у), где windowName - название окна, которое вы хотите переместить; х - координата X (горизонтальная позиция) на экране, куда следует переме- стить окно; у - координата Y (вертикальная позиция) на экране, куда следует переме- стить окно. Пример: cv2. moveWindow ('Image', 100, 100) cv2. М ultiT racker () cv2. MultiTracker0 или cv2.MultiTracker_create()) - это конструктор класса в библиотеке OpenCV для создания объекта множественного трекера. Множе- ственный трекер предназначен для отслеживания нескольких объектов одновре- менно на видеопотоке или в потоке изображений. • cv2.namedWindow() Назначение: функция библиотеки OpenCV. которая используется для со- здания окна с заданным именем. Это окно предназначено для отображения изоб- ражений или визуализации видео. Описание формата функции: cv2. namedWindow(winname, flags), где winname— строковый параметр, представляющий имя окна;
flags (необязательный) - флаг, который определяет поведение окна. По умолчанию уетановлен флаг cv2.WIND0W AUTOSIZE, который автоматически изменяет размер окна в соответствии с размером отображаемого изображения. Можно использовать флаг cv2. WINDOW NORMAL для возможности изменения размера окна вручную. Пример: cv2. па medWindow ('Му Window cv2. WIN DO W NORMAL) cv2.polylines() Назначение: функция библиотеки OpenCV. которая используется для отри- совки многоугольника. Описание формата функции: cv2.polylines(img, pts, isClosed, color, thickness, ПпеТуре, shift), где img - изображение» на котором будет производиться отрисовка полигона; pts - список точек, задающих вершины полигона. Массив, в котором пере- числены вершин многоугольника; isClosed - флаг, указывающий, замкнут ли полигон. Если True, то полигон замкнутый (первая и последняя вершины соединены линией); color - цвет линии полигона в формате BGR; thickness - толщина линии полигона. Если значение О1рицательное, полигон будет закрашен; ПпеТуре-тип линии границы. Но умолчанию используется cv2.LINE 8. Дру- гие возможные значения включают cv2.LINE 4 и cv2.LINE А А (антиалиасинг); shift - количество битовых сдвигов при вычислении координат. Обычно устанавливается в 0. Пример: cv2.polylines(frame, [np.array([[50, 50], [150, 280], [210, 250], [250, 130], 1150, 50]], np.int32)],True,(0,255,0), 2) ® cv2.putText() Назначение: функция библиотеки OpenCV, которая используется для отри- совки текста. Описание формата функции: cv2.putText(img, text, org, font Face, font Scale, color, thickness, ПпеТуре, bottomLeftOrigin), где img — изображение, па котором будет производиться отрисовка текста; text - строка с текстом, который вы хотите отобразить; org-координаты начальной точки текста (левый верхний угол) в формате (х, у); fontFace- шрифт текста. Он может быть одним из предложенным ниже: cv2.FONT HERSHEY PLAIN: простой шрифт без засечек; cv2.FONT_HERSHEY_SIMPLEX: пропорциональный шрифт без засечек;
cv2.F0NT HERSHEY DUPLEX: пропорциональный шрифт с поддержкой двойной высоты символов; cv2.FONT HERSHEY COMPLEX: шрифт с засечками; cv2.FONT HERSHEY TRIPLEX: пропорциональный шрифт с тройной вы- сотой символов; cv2.FONT HERSHEY COMPLEX SMALL: шрифт с засечками и малыми символами; cv2.FONT HERSHEY SCRIP!' SIMPLEX: рукописный простой шрифт; cv2.FONT HERSHEY_ SCRIP!' COMPLEX: рукописный сложный шрифт; cv2.FON 1 ITALIC: константа для указания наклонного шрифта (например, CV2.FONT HERSHEY SIMPLEX | cv2.FONT ITALIC). fontScale - масштаб текста; color - цвет текста в формате BGR; thickness - толщина линии (если отрицательная, текст будет отображен с за- крашенным фоном); UneType- тип линии. По умолчанию используется cv2.LINE_AA\ bottomLeftOrigin - флаг, который указывает, что начальная точка текста - левый нижний угол (если True). Пример: text - 'Привет. МИР!' org = (100, 100) font Face = cv2.FONT HERSHEY COMPLEX fontScale = 1 color - (0, 255. 0) thickness — 2 cv2.putText (frame, text, org, font Face, fontScale, color, thickness) cv2.rectangle() Назначение: функция библиотеки OpenCV, которая используется для отри- совки прямоугольников. Описание формата функции: cv2.rec t angle (img, ptl, pt2, color, thickness, UneType, shift), где img - изображение, на котором будет производиться отрисовка прямоуголь- ника; ptl - координаты верхнего левого угла прямоугольника (х. у); pt2 - координаты нижнего правого угла прямоугольника (х, у); color - цвет прямоугольника в формате BGR (синий, зеленый, красный); thickness — толщина границы прямоугольника. Если значение отрицатель- ное, прямоугольник будет закрашен; UneType - тип линии границы. По умолчанию используется cv2.LINE_8. Другие возможные значения включают cv2.L1NE 4 и ev2.LINE_AA (анти- алиасинг);
shift - количество битовых сдвигов при вычислении координат. Обычно устанавливается в 0. Пример 1: ptl = (150, 200) pt2 = (300, 350) color = (0, 255, 0) thickness - 2 cv2.rectangle(frame, pt/, pt 2, color, thickness) Пример 2: cv2.rectangle(frame,(300, 400), (400, 450), (0, 0, 255), 12) cv2.resize() Назначение: функция библиотеки OpenCV используется для изменения размера изображения. Описание формата функции: cv2.resize(src, dsize, cist, fa, fa, interpolation), где src - исходное изображение; dsize-размер выходного изображения; может быть кортежем (width, height) или None (в этом случае параметры fa и fa должны быть установлены); dst (опционально) — выходное изображение. Если указано, изображение из- меняется в этот объект. Если не указано, создается новое изображение; fa (опционально) - коэффициент масштабирования по оси X; fa (опционально) - коэффициент масштабирования по оси Y; interpolation (опционально) - метод интерполяции для изменения размера. По умолчанию используется cv2.INTER LINEAR: Пример: resized image = cv2.resize (original image, new_size) cv2.selectROI() Назначение: функция библиотеки OpenCV, которая позволяет пользова- телю выбирать интерактивно прямоугольную область (RO1) на изображении. Описание формата функции: cv2.selectR01(windowName, img, showCrossllair, fromCenter), где windowName - название окна, в котором отображается изображение; img - изображение, на котором пользователь будет выбирать ROI; showCrossHair (опционально) - флаг, указывающий, следует ли отображать перекрестие в центре выбранной области. По умолчанию True; fromCenter (опционально) - флаг, указывающий, следует ли начинать выбор ROI от центра. По умолчанию False.
Функция возвращает кортеж, представляющий координаты и размер вы- бранной области.- (х, у, и’, Л/ Пример: х, у, и*. /? = cv2.select ROI(frame,fromCenter~ False) I cv2.setMouseCallback() Назначение: используется для установки функции обратного вызова (callback function) для обработки событий мыши в определенном окне. Она обес- печивает взаимодействие с изображением через мышь, позволяя пользователю определить свою собственную функцию обратного вызова, которая будет вызы- ваться при определенных событиях мыши. Описание формата функции: cv2.setMouseCallback(windoxvName, on Mouse, param =None), где windowName - строковый параметр, представляющий название окна, к ко- торому привязывается функция обратного вызова; onMouse - функция обратного вызова, которая будет вызываться при собы- тиях мыши. Эта функция должна иметь определенный формат: def on Mouse (event, х, у. flags, param): где event - тип события (например, cv2.EVENT_LBUTTONDOWN); х, у - координаты мыши; flags ~ флаги состояния клавиш мыши. Вот их список: cv2. EVENT MOUSEMOVE - движение мыши; cv2.EVENT LBUTTONDOWN - нажата левая кнопка мыши: cv2.EVENT LBUTTONUP - отпущена левая кнопка мыши; cv2.EVENT RBUTTONDOWN- нажата правая кнопка мыши; cv2.EVENT R BUTTON UP - отпущена правая кнопка мыши; cv2.EVENT MBUTTONDOWN и cv2.EVENT MBUTTONUP - нажата и от- пущена средняя кнопка мыши (если она есть). cv2.EVENT MOUSEWHEEL и cv2.EVENT MOUSEHWHEEL - прокрутка колеса мыши вперед и назад. cv2.EVENT MOUSEHWHEEL - горизонтальная прокрутка колеса мыши (если поддерживается). ev2. EVENT FLAG SHIFTKEY - нажата клавиша Shift. ev2.EVENT FLAG CTRLKEY- нажата клавиша Ctrl. cv2. E VEN T FLA G A LT KEY - н ажата кл а в и ша Л11. param (необязательный) - дополнительный параметр, который будет пере- дан в функцию обратного вызова. Пример: def onMouse(event, х, у, flags, param): if event == cv2.EVENT LBUTTONDOWN: print(fLeft button down at ({x}, {y})’) cv2. setMouseCallbackfImage \ onMouse)
S cv2.setWindowProperty() Назначение: в библиотеке OpenCV используется для установки свойств окна, таких как размер, положение и др. Описание формам функции: cv2.setWindowProperty(windowName, prop id, prop value), где windowName - имя окна, для которого нужно установить свойство; prop id - идентификатор свойства, которое нужно установить. Это может быть одно из следующих значений: ev2. WND PROP FULLSCREEN: устанавливает полноэкранный режим окна (значение; cv2 WINDOW FULLSCREEN или cv2. WINDOW NORMAL); cv2.WND PROP AUTOSIZE: устанавливает автоматический размер окна (значение: cv2. WINDOW AUTOSIZE или cv2.WINDOW NORMAL); cv2.WND PROP TOPMOST: устанавливает окно поверх всех других окон (значение: cv2.WINDOW NORMAL mucv2.WINDOW FULLSCREEN); prop value - значение свойства, которое нужно установить. Для большин- ства свойств это булево значение (True или False), указывающее, следует ли уста- новить свойство включенным или выключенным. Пример: cv2.setWindowProperty(windowName, cv2.WND PROP FULLSCREEN, cv2,WINDOW FULLSCREEN) cv2.Sobel() Назначение: функция библиотеки OpenCV, применяющая оператор С обеля к изображению для выделения градиентов. Описание формата функции: cv2.Sobel (sre, ddepth, dx, dy, ksize, scale, delta, borderType), где sre - исходное изображение; ddepth - глубина результирующего изображения. Если -1. то используется та же глубина, что и у входного изображения; dx - порядок прои вводной по х; dy - порядок производной по у; ksize (опционально) - размер ядра Собеля. Должен быть нечетным и поло- жительным. Если нс указано, используется 3; scale (опционально) - масштабный коэффициент для вычисленных значе- ний. По умолчанию 1; delta (опционально) - смещение, добавляемое к вычисленным значениям. По умолчанию 0; borderType (опционально)-способ обработки краев. По умолчанию исполь- зуется cv2.BORDERDEFAULT.
Пример: sobel х — су2.Sobel (image, cv2.CV_64F, /, 0, ksize—3) sobel_y = су2.Sobel (image, су2.СГ 64F. О, 1, ksize=3) # Конвертация результатов в изображения с глубиной в uint8 sobel х = np.uint8(np.abs(sobel х)) sobel _у = np.uint8(np.abs(sobel_y)) cv2. imshow('Sobel X', sobel x) cv2.imshow('Sobel Y', sobel y) cv2.split() Назначение: функция библиотеки OpenCV, используется для разделения многоцветного изображения на отдельные каналы цвеза. Это позволяет получить отдельные изображения для каждого цветового канала, таких как красный (R), зеленый (G) и синий (В) каналы в случае изображений в формате BGR. Описание формата функции: су 2. split (src), где src - исходное изображение. Пример: b. g. г - су 2. split (image) су2. imshow('Blue Channel', b) су2.imshow('Green Channel', g) cv2.imshow('Red Channel', r) cv2.threshold Назначение: функция библиотеки OpenCV, используемая для преобразова- ния изображения в изображение с бинарными значениями (черно-белое изобра- жение), основываясь на пороговом значении. Описание форма!а функции: cy2.threshold(src, thresh, maxxal, type, dst), где src - исходное изображение: thresh - пороговое значение, используемое для преобразования пикселей; maxval- значение, присваиваемое пикселям, значения которых превышают пороговое значение; type - тип бинаризации, указывающий, как применять порог. Это может быть одно из следующих значений: су2. THRESH BINARY: Если значение пикселя превышает порог, ему при- сваивается maxval, в противном случае - 0; су2.THRESH BINARY INV: Если значение пикселя превышает порог, ему присваивается 0, в противном случае - maxval;
cv2. THRESH TRUNC: Если значение пикселя превышает порог, ему при- сваивается пороговое значение, в противном случае - значение остается неизменным; cv2.THRESH TOZERO: Если значение пикселя превышает порог, ему присваивается значение пикселя, в противном случае - 0; cv2. THRESH TOZERO INI': Если значение пикселя превышает порог, ему присваивается 0, в противном случае - значение пикселя остается неизменным; dst (опционально) - результирующее изображение. Если не указано, функ- ция создает новое изображение. Пример: gray'Jrame = cv2. cvtColor (frame, cv2.COLOR BGR2GRAY) binary frame = cv2.threshold(gray frame, 127, 255, cv2. THRESH BINARY) cv2.T rackerCSRT () cv2.TrackerCSRT() или cv2.TrackerCSRT create!) - это конструктор класса для создания объекта трекера CSR Г (Channel and Spatial Reliability 1 racker) в биб- лиотеке OpenCV. Этот трекер предназначен для отслеживания объектов на видео и в реальном времени, обеспечивая высокую точность и устойчивость к раз- личным условиям, таким как изменения освещения и частичные блокировки объекта. Пример: tracker = cv2. Tracker CSR T create() cv2.Ti rackerKCF() cv2. TrackerКСF() или cv2.Tracker КС Fer eat e() - это конструктор класса в библиотеке OpenCV для создания объекта трекера KCF (Kemelized Correlation Filters). Этот трекер предназначен для отслеживания объектов в видеопотоке или на изображении с использованием корреляционных фильтров с ядром. Пример: tracker — cv2. Tracker KCF createf) cv2.TrackerMedianFlow() cv2.TrackerMedianFlow() или cv2.Tracker Media nF low_createf) - это конструктор класса в библиотеке OpenCV для создания объекта трекера Median- Flow. Трекер MedianFlow предназначен для отслеживания объектов в видеопо- токе или на изображении с использованием метода оптического потока и меди- анных фильтров. Пример: tracker = cv2. TrackerMedianFlow _create()
cv2.TrackerMIL() cv2.Tracker MILQ или cv2.Tracker MIL createQ - это конструктор класса в библиотеке OpenCV для создания объекта трекера MIL (Multiple Instance Learning). Трекер MIL предназначен для отслеживания объектов в видеопо- токе или на изображении с использованием метода множественного обучения экземпляра. cv2.T rackerMOSSE() cv2. Tracker MOSSEQ cv2. Tracker MOSSE createQ - это конструктор класса в библиотеке OpenCV для создания объекта трекера MOSSE. Трекер MOSSE (Minimum Output Sum of Squared Error) предназначен для отслеживания объектов в видеопотоке или на изображении с использованием минимизации суммы квад- ратичных ошибок. Пример: tracker = cv2. TrackerMOSSE createQ cv2.VideoCapture() Назначение: функция библиотеки OpenCV используется для захвата видео- потока с устройства захвата, такого как камера или видеофайл. Описание формата функции: cv2. J 4deoCapture(index), где index - целочисленный параметр, определяющий устройство захвата (id ка- меры). Обычно 0 соответствует веб-камере на компьютере или MIPI-камере на микрокомпьютере. Если у вас есть несколько устройств захвата, вы можете ис- пользовать различные значения, чтобы выбрать конкретное устройство. Если index указывает на файл (например, «video.mp4»), то функция читает видеопоток из файла. Пример 1: cap = cv2. VideoCapture(O) Пример 2: cap = cv2. VideoCapture(«,C:/Users/video.mp4») ___ cv2.VideoWriter() Назначение: функция библиотеки OpenCV предоставляет возможность за- писи видео. Он используется для создания объекта, который отвечает за запись последовательности изображений в видеофайл. Описание формата функции: cv2. VideoWriter(filename, fourcc, fps, frameSize, isColor), где filename - имя файла, в который будет записано видео; fourcc - кодек, используемый для сжатия видео. Например, 'XVID' или 'MJPG';
fps - количество кадров в секунду (частота кадров); frameSize — размер кадра в видеопотоке; isColor (необязательный) - флаг, указывающий, являются ли кадры цвет- ными (True) или черно-белыми (False). По умолчанию - True. Пример: out = cv2.VideoWriter(toutput video.avi', fourcc, 20.0, (640, 480)) ___ cvZ.VideoWriter fourcc() Назначение: функция библиотеки OpenCV используемая для определения четырехсимволыюго кода (FourCC) кодека, который будет использоваться при записи видео с помощью cv2. Video Writer. FourCC - это четырехсимвольный идентификатор, который определяет формат видеокодирования. Описание формата функции: cv2. Video Writer fourccfcl, с2, сЗ, с4), где: cl, с2, сЗ, с4: Четыре символа, определяющих кодек. В OpenCV четырехсимвольные коды (fourcc) представлены строками, где каждый символ представляет собой ASCll-код. Ниже приведены некоторые ча- сто используемые кодеки и их соответствующие строковые представления: XV1D (кодек Xvid М PEG-4) - cv2. Video Writer fourcc(*'XVID); MJ PG (кодек Motion-JPEG) - cv2. VideoWriter Jourcc^'MJPG); DIVX (кодек DivX MPEG-4) - cv2. VideoWriter Jourcc(*’DIVX); H264 (кодек H.264) - cv2. VideoWriter_fourcc(*'H264); X264 (кодек x264 H.264) - cv2. VideoWriter fourcc(*'X264); \¥МУ1(кодек Windows Media Video 7) - cv2. Video Writer fourccP'WMVl'f WMV2 (кодек Windows Media Video 8) - cv2. VideoWriter fourcc(*'WMV2'). Пример: fourcc = cv2. Video Writer fourcc(*'XVID) Й cv2.waitKey() Назначение: функция библиотеки OpenCV используется для ожидания нажатия клавиши. Описание формата функции: cv2. waitKey (delay), где delay — это целочисленный параметр, указывающий время ожидания в мил- лисекундах. Если delay равно 0 или отрицательно, функция ожидает бесконечно. Если delay положительно, функция ждет указанное количество миллисекунд и возвращает код клавиши, которая была нажата в это время. Пример 1: key = cv2. waitKey(0) ^бесконечное ожидание нажатия любой кнопки Пример 2: key = cv2.waitKey(l)
if key == ord('q'): # проверка нажатия клавиши 'q', чтобы выйти из г^икла break cv2.warpAffine() Назначение: функция библиотеки OpenCV, которая выполняет аффинное преобразование изображения с использованием заданной матрицы преобразова- ния. Описание формата функции: cv2.warpAffine(src, М, dsize, dst, flags, border Mode, border Value}, где sre - исходное изображение. M- матрица преобразования (например, от cv2.getRotationMatrix2D); dsize - размер выходного изображения в формате (ширина, высота); dst (необязательный) - выходное изображение. Если не указан, будет со- здано новое изображение; flags (необязательный) - дополнительные флаги. По умолчанию использу- ется cv2.INTER LINEAR, что означает линейную интерполяцию; border Mode (необязательный) - режим обработки граничных пикселей. По умолчанию используется cv2.BORDER CONSTANT; borderValue (необязательный) - значение для граничных пикселей при ис- пользовании режима cv2.BORDER CONSTANT. Пример: rotation matrix = cv2.getRotationMatrix2D((width / 2,height / 2), angle, 1) rotated image = cv2.warpAffine (original image, rotation matrix, (width, height)) numpy.arrayO Назначение: функция библиотеки NumPy, используется для создания массива. Описание формата функции: пр.array (object, dtype, copy, order, subok, ndmin), где object - обязательный аргумент. Может быть списком, кортежем, другим массивом или любым объектом, который может быть интерпретирован как мас- сив; dtype — (опционально) тип данных для элементов массива. Если не указан, тип данных будет определен автоматически на основе типа данных объекта; сору-(опционально) если True, создается копия объекта; если False, массив создается ссылаясь на объект. По умолчанию True; orde - (опционально) указывает на порядок хранения элементов в памяти. Может быть 'С (по умолчанию) для C-style, ’F’ для Fortran-style или ’А1 для авто- матического выбора порядка; subok - (опционально) если True, подклассы будут передаваться, если это возможно; если False, передается только базовый массив. По умолчанию False;
ndmin - (опционально) минимальное количество измерений в результирую- щем массиве. По умолчанию 0). Пример 1: ar г list = np.array([l, 2, 3. 4, 5]) Пример 2: ar г 2d = пр.аггау([[1, 2, 3], [4, 5, 6], [7, 8, 9//) Пример 3: arr float = пр.array ([ /, 2, 3, 4. 5], dtype=float) numpy,arange() Назначение: функция библиотеки NumPy, используется для создания по- следовательности чисел, которая может быть использована, например, для гене- рации координат пикселей в изображении или для создания массива индексов. Описание формата функции: питру. arangefstart, stop. step. dtype=None), где: start - начальное значение последовательности (включительно). stop - конечное значение последовательности (исключительно). step - шаг, с которым значения генерируются. По умолчанию равен 1. dtype (опционально) - тип данных для элементов массива. Если не указан, тип данных выводится автоматически. Пример: arr = np.arange(lO) print(arr) #Вывод: [0123456789] numpy.emptyO Назначение: функция библиотеки NumPy, используется для создания но- вого массива указанной формы и типа данных, но не инициализирует его значе- ниями. Вместо этого она оставляет массив неинициализированным, что озна- чает, что его значения могут быть произвольными и зависят от состояния памяти в момент создания массива. Описание формата функции: питру.empty (shape, dtype-float, order='C’), где shape - форма создаваемого массива, заданная в виде кортежа целых чисел. Каждое целое число определяет размерность массива. dtype (необязательно) - тип данных элементов массива. По умолчанию ис- пользуется тин данных float. order (необязательно) - порядок расположения элементов в памяти. Это мо- жет быть 'С (C-style, по умолчанию) или F' (Fortran-style). Функция возвращает новый массив указанной формы и типа данных, но без инициализации его значениями.
Пример: # Создание массива размером 3x3, но не инициализирует его значениями ar г = np.empty((3, 3)) print(arr) numpy.flip() Назначение: функция библиотеки NumPy, используется для отражения (пе- реворота) массива вдоль указанной оси. Описание формата функции: numpy. flip(т, axis -None), где т — исходный массив, который нужно отразить. axis (опционально) - ось, вдоль которой нужно выполнить отражение. Если не указана, массив отражается вдоль всех осей. Этот метод возвращает новый массив, который является результатом отра- жения исходного массива. Пример: ar г = пр.аггау([[1, 2. 3J, [4, 5, 6]]) # Отражение массива по горизонтальной оси (ось 1) flipped arr = np.flip(arr, axis-1) I numpy.full() Назначение: функция библиотеки NumPy, используется для создания мас- сива, в котором все элементы инициализируются одним и тем же заданным зна- чением (в контексте компьютерно! о зрения, цветом). Описание формата функции: numpy.Jill I (shape, Jill value, dtype, order), где shape - это кортеж, определяющий размеры массива. Например, для одно- мерного массива (5,), для двумерного массива (3. 4), и так далее; fill value - значение, которым будут заполнены элементы массива; dtype (необязательный)-тип данных элементов массива. По умолчанию ис- пользуется None, что означает использование типа данных по умолчанию. Мо- жет принимать значения, такие как int, float, np.uint8, и другие; order (необязательный) - опциональный аргумент, который определяет по- рядок размещения элементов в памяти. Может быть 'С’ (по умолчанию) для по- рядка C-style (по строкам) или Т7'для порядка Fortran-style (по столбцам). Пример: image = np.full((500, 500, 3), 255, dtype=np.uint8)
numpy.hstack() Назначение: функция библиотеки NumPy, используется для вертикальной стыковки (конкатенации) массивов. Она принимает список или кортеж массивов и объединяет их вдоль вертикальной оси, создавая новый массив. Описание формата функции: питру. hstack(tup) где тир — список или кортеж массивов, которые нужно горизонтально стыковать. Этот метод возвращает новый массив, который является результатом гори- зонтальной конкатенации входных массивов. Пример: array 1 ~ np.array([[l, 2], 13- 4]]) array2 = np.array([[5, б/, # Горизонтальная стыковка массивов result = np.hstack((array 1, array2)) numpy.meanO Назначение: функция библиотеки NumPy, используется для вычисления среднего значения элементов массива. Описание формаiа функции: питру. теап(а, axis=None, dtype=None, out=None, keepdims—<no value>), где a - массив, для которого нужно вычислить среднее значение. axis (опционально) - ось или оси, вдоль которых будет вычисляться среднее значение. Если не указана, среднее значение будет вычислено по всем элементам массива. dtype (опционально) - тип данных, используемый для вычисления среднего значения и возвращаемого массива. out (опционально) — массив, в который будут записаны результаты. keepdims (опционально) - если True, размерность возвращаемого массива будет сохранена для осей, но которым производилось усреднение. Этот метод возвращает среднее значение элементов массива. Пример: аг г = np.array([[ 1, 2, 3/, 14, 5. 6]]) # Вычисление среднего значения всех элементов массива mean value = np.mean(arr) numpy.ones() Назначение: функция библиотеки NumPy, предназначенная для создания массива, элементы которого инициализированы единицами.
Описание формата функции: питру.ones(shape, dtype, order) где shape - это кортеж, определяющий размеры массива. Например, для одно- мерного массива (5,), для двумерного массива (3. 4), и так далее; dtype (необязательный)-тип данных элементов массива. По умолчанию ис- пользуется None, что означает использование типа данных по умолчанию. Мо- жет принимать значения, такие как int, float, np.uint8, и другие; order (необязательный) - опциональный аргумент, который определяет по- рядок размещения элементов в памяти. Может быть 'С' (по умолчанию) для по- рядка C-style (по строкам) или 'Л'для порядка Fortran-style (по столбцам). Пример: image = np.ones((500, 500, 3), dtype=np.uint8) *255 numpy.reshape() Назначение: функция библиотеки NumPy, используется для изменения формы массива без изменения его данных. Она позволяет переформатировать массив, изменяя его размерность или форму. Описание фирма 1 а функции: питру.reshape! a, newshape, order-'С), где а - исходный массив, который нужно переформатировать. newshape - новая форма (размерность) массива. Это может быть целочис- ленный кортеж или список, задающий желаемую форму массива. order (опционально) - порядок, в котором элементы массива должны быть прочитаны. Может быть ’С’ (порядок строк) или ’F’ (порядок столбцов). По умол- чанию используется порядок ’С’. Этот метод возвращает новый массив с указанной формой. Пример: arr = np.array([[l, 2, 3], [4. 5. 6]]) И Изменение формы массива reshaped arr = np.reshape(arr, (3, 2)) numpy.stdO Назначение: функция библиотеки NumPy, используется для вычисления стандартного О1клонсния значений элементов массива. Описание формата функции: питру.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=<no value>), где a - массив, для которого нужно вычислить стандартное отклонение. axis (опционально) - ось или оси, вдоль которых будет вычисляться стан- дартное отклонение. Если не указана, стандартное отклонение будет вычислено по всем элементам массива.
city ре (опционально) - тип данных, используемый для вычисления стандарт- ного отклонения и возвращаемого массива. out (опционально) - массив, в который будут записаны результаты. ddof{опционально) - степень свободы, используемая при вычислении стан- дартного отклонения. Значение по умолчанию равно 0. keepdims (опционально) - если True, размерность возвращаемого массива будет сохранена для осей, по которым производилось вычисление. Пример: arr = np.array([l, 2, 3, 4, 5]) # Вычисление стандартного отклонения всех элементов массива std value = пр. std(arr) numpy.vstack() Назначение: функция библиотеки NumPy, используется для вертикальной стыковки (конкатенации) массивов. Она принимает список или кортеж массивов и объединяет их вдоль вертикальной оси, создавая новый массив. Описание форма!а функции: numpy. vstack(tup), где tup - список или кортеж массивов, которые нужно вертикально стыковать. Этот метод возвращает новый массив, который является результатом верти- кальной конкатенации входных массивов. Пример: array I = np.array([[l, 2,3/ 14. Л 6]]) ar г ay 2 = пр. array/[[7, 8, 9], [10, 11, 12]]) # Вертикальная стыковка массивов result = np.vstack((array 1, array2)) numpy .zeros() Назначение: функция библиотеки NumPy, предназначенная для создания массива, элементы которого инициализированы нулями. Описание формата функции: numpy.zerosfshape, dtype, order), где shape - это кортеж, определяющий размеры массива. Например, для одно- мерного массива (5), для двумерного массива (3, 4), и так далее; dtype (необязательный) - опциональный аргумент, указывающий тип дан- ных элементов массива. По умолчанию используется float. Может принимать значения, такие как int, float, np.uint8, и другие;
order (необязательный) - опциональный аргумент, который определяет по- рядок размещения элементов в памяти. Может быть 'С (по умолчанию) для по- рядка C-style (но строкам) или 'F* для порядка Fortran-style (по столбцам). Пример: image - np.zeros((500, 500, 3), dtype) tracker. init() Назначение: Метод в библиотеке OpenCV используется для инициализа- ции трекера объектов перед его использованием. Описание формата метода: tracker, init(frame, bbox), где frame - текущий кадр, в котором необходимо инициализировать трекер. bbox - ограничивающий прямоугольник (bounding box) вокруг объекта, ко- торый требуется отслеживать. Он может быть представлен в виде кортежа (х, у, и; /?), где (х, у) - координаты верхнего левого угла прямоугольника, а (и; /?) - его ширина и высота соответственно. Метод tracker init() инициализирует трекер с заданным ограничивающим прямоугольником в первом кадре видсопотока или последовательное!и кадров. После инициализации трекер готов к отслеживанию объекта на последующих кадрах. Пример: trucker = cv2. TrackerKCF_create()# Инициализация трекера KCF frame = cv2.imread('frameljpg) # Чтение первого кадра bbox = (100, 100, 50, 50) # Определение ограничивающего прямоугольника tracker, init frame, bbox) # Инициализация трекера tracker.update() Назначение: Метод в библиотеке OpenCV используется для обновления со- стояния трекера объектов на новом кадре видсопотока. Описание формата метода: success, bbox = tracker, update(frame), где frame - новый кадр видеопотока, на котором необходимо обновить состо- яние трекера. success - логическое значение, указывающее на успешность обновления трекера. Если трекер обнаружил объект на новом кадре, то success будет равно True, в противном случае - False. bbox — новый ограничивающий прямоугольник (hounding box) вокруг объ- екта, который был обнаружен на новом кадре. Этот прямоугольник представлен в виде кортежа (х, у, и; Л), где (х. у) - координаты верхнего левого угла прямо- угольника, а (и1. /?) - его ширина и высота соответственно.
Метод tracker. update() обновляет состояние трекера на новом кадре и воз- вращает новый ограничивающий прямоугольник вокруг объекта, а также инфор- мацию о том, удалось ли трекеру успешно обновить состояние на новом кадре. Пример: # Обновление состояния трекера на новом кадре success, bbox = tracker, updatetframe) tracker.get() Назначение: Метод в библиотеке OpenCV используется для получения те- кущего состояния трекера объектов. Описание формата метода: value = tracker, get (param), где param - параметр трекера, значение которого необходимо получить. Метод tracker.get() позволяет получить значение определенного параметра трекера. Например, можно получить текущее положение объекта (ограничиваю- щий прямоугольник вокруг объекта), скорость движения объекта и другие харак- теристики трекера. Пример: # Получение текущего положения объекта bbox - tracker.get(cv2.Tracker. BBOX) # Получение текущей скорости движения объекта velocity - tracker.get(cv2. Tracker. VEL) print («Current bounding box:», bbox) prim («Current velocity:», velocity) tracker.release() Назначение: Метод в библиотеке OpenCV используется в библиотеке OpenCV для освобождения ресурсов, занимаемых трекером объектов. Описание формат метода: tracker. release О, Этот метод освобождает память, выделенную для объекта трекера, и закры- вает его. После вызова этого метода объект прекера больше не будет доступен, и для дальнейшего использования потребуется повторная инициализация.
Инфра-Инженерия \ v Is'' / Издательство технической литературы Издательство предлагает учебную литературу последующим направлениям: • IT. Информатика • Авиационная и ракетно-космическая техника • Автоматизация • Автомобильная техника • Арматура. Трубопроводы • Бетоны • Бурение нефтяных и газовых скважин • Вооружение. Радиоэлектронные системы • Газовое хозяйство • Геодезия, картография и маркшейдерское дело • Геология. Геофизика. Геохимия • Горное дело • Железнодорожный транспорт • Лесная промышленность • Логистика • Машиностроение • Медицина и биоинженерия • Металлургия • Нефтегазовая промышленность • Педагогика. Психология • Пищевая промышленность • Промышленная безопасность. Охрана труда • Разработка и эксплуатация нефтяных и газовых месторождений • Сварочное дело • Словари • Сети и коммуникации. Волоконно-оптическая техника • Строительство • Судостроение • Транспортное строительство. Дороги. Мосты. Тоннели • Физико-математические науки • Химия. Химические технологии • Экология. Безопасность жизнедеятельности • Экономика. Управление. Электронная коммерция • Электроника • Электро- и теплоэнергетика Интернет-магазин intra-e.ru WhatsApp VK Telegram Телефон 8-800-250 66 01 8 911-512-48-48 Более 2000 выпущенных книг по 30 темам и направлениям ; Доставляем наши книги по ; ; всей России от Калининграда ; ; до Камчатки, а также в ; ; страны СНГ : Нам доверяют более 90 учебных заведений в России и за рубежом
Учебное издание Сацюк Александр Владимирович КОМПЬЮТЕРНОЕ ЗРЕНИЕ. ПРАКТИКА Учебное пособие ISBN 978-5-9729-2346-5 Подписано в печать 30.09.2024 Формат 60x84/16. Усл. печ. л. 15,81. Печать по требованию. Бумага офсетная. Гарнитура «Таймс». Издательство «Инфра-Инженерия» 160011, г. Вологда, ул. Козленская, д. 63 Тел.: 8 (800) 250-66-01 E-mail: booking(^infra-e.ru https://infra-e.ru Издательство приглашает к сотрудничеству авторов научно-технической литературы