Модуль ESP32-CAM - это доступное и компактное решение, которое сочетает в себе микроконтроллер ESP32 и камеру OV2640. Благодаря своей низкой цене и широким возможностям он стал популярным выбором среди разработчиков проектов в области IoT, компьютерного зрения и робототехники.

В данной статье я собрал серию из 15 практических уроков, каждый из которых сопровождается видео и исходным кодом. Вместе мы пройдём путь от базового примера захвата изображения до реализации алгоритмов компьютерного зрения и даже интеграции TensorFlow Lite для классификации объектов прямо на ESP32-CAM.

Материалы организованы по нарастающей сложности: начиная с простого веб-интерфейса и работы с памятью устройства, и заканчивая фильтрацией изображений, преобразованием Хафа и нейронными сетями. Для каждого урока вы найдёте:

  • ? видео с разбором темы

  • ? GitHub-репозиторий с исходным кодом

  • ? текстовое summary с описанием ключевых моментов.

Эта подборка будет полезна всем, кто хочет освоить работу с камерой на ESP32, научиться строить собственные алгоритмы обработки изображений и понять, как реализовать компьютерное зрение на ресурсно-ограниченных устройствах.

? Плейлист из 15 видеоуроков:
VK: https://vkvideo.ru/playlist/63898488_2
YouTube: https://youtube.com/playlist?list=PLU_7Rgz8DWYtQO9BM9VGHVi-471koGOc7&si=UuY-HkdgC4KrlJIk
? Репозиторий с кодом всех уроков:
https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS

ESP32-CAM 01: Захват кадра

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239450?linked=1?t=4s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/001_ESP32-CAM_capture

В этом видео начинается серия уроков по работе с модулем ESP32-CAM — микроконтроллером ESP32 со встроенной камерой. Показан базовый пример захвата изображения и его отображения на компьютере через веб-интерфейс.

Основные моменты ролика:

  • Обзор модуля ESP32-CAM и его возможностей для проектов компьютерного зрения.

  • Подключение платы к ПК через программатор с microUSB.

  • Подготовка Arduino IDE: установка плат ESP32 и необходимых библиотек (WiFi, ESP WebServer, WebSockets, ArduinoJson, ESP32 Camera).

  • Настройка камеры через файл camera_config.h (пины, разрешение кадра, формат JPEG, качество изображения).

  • Подключение ESP32-CAM к локальной Wi-Fi сети и получение IP-адреса.

  • Создание простого веб-сервера с HTML-страницей и кнопкой Capture для захвата кадра.

  • Использование WebSockets для обмена данными между микроконтроллером и браузером.

  • Реализация логики: при нажатии кнопки кадр фиксируется и отображается в браузере.

  • Демонстрация работы: однократный захват кадра и модификация кода для стриминга видео.

ESP32-CAM 02: microSD и SPIFFS

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239451?linked=1?t=3s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/002_ESP32-CAM_memory

Во втором видео серии рассматриваются способы работы с памятью модуля ESP32-CAM. Показано, как сохранять и считывать изображения с камеры на карту microSD и во внутреннюю файловую систему SPIFFS.

Основные моменты ролика:

  • Обзор вариантов памяти в ESP32-CAM:

    • microSD карта (внешняя память, подходит для хранения большого количества изображений).

    • SPIFFS (встроенная файловая система во флеше ESP32).

  • Подключение и инициализация microSD:

    • Использование библиотеки SD_MMC.h.

    • Проверка корректности монтирования карты памяти.

    • Создание и запись файлов (JPEG-кадров) на microSD.

  • Работа со SPIFFS:

    • Подключение библиотеки SPIFFS.h.

    • Форматирование, монтирование и работа с файловой системой.

    • Запись и чтение файлов внутри флеш-памяти микроконтроллера.

  • Сравнение microSD и SPIFFS:

    • microSD удобна для хранения больших объёмов данных,

    • SPIFFS — быстрый и простой вариант для небольших файлов и настроек.

  • Демонстрация работы: сохранение изображений с камеры на microSD и в SPIFFS, чтение и проверка содержимого.

ESP32-CAM 03: элементы управления

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239452?linked=1?t=19s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/003_ESP32-CAM_sensor_control

В третьем видео серии рассматривается, как создать веб-интерфейс для управления параметрами камеры ESP32-CAM. Показано, как реализовать разные элементы управления (радиокнопки, ползунки и переключатели On/Off), которые позволяют изменять настройки изображения в реальном времени.

Основные моменты ролика:

  • Использование встроенного веб-сервера ESP32-CAM для отображения HTML-страницы управления.

  • Подключение к структуре данных сенсора через esp_camera_sensor_get() для изменения параметров камеры.

  • Реализация трёх типов элементов управления:

    • Радиокнопки — выбор фильтров для изображения (например, негатив, красный оттенок и др.).

    • Ползунки — настройка параметров с диапазоном значений (например, яркость и контраст).

    • Переключатели On/Off — включение и отключение функций (например, баланс белого или отражение).

  • Передача данных между веб-страницей и микроконтроллером с помощью WebSockets и JSON-сообщений.

  • Логика синхронизации: изменения с веб-интерфейса применяются к камере, а камера отправляет обновлённое состояние обратно в браузер.

  • Демонстрация работы: выбор фильтров, регулировка яркости и включение/выключение параметров отображаются сразу в итоговом кадре.

ESP32-CAM 04: рисунок поверх изображения

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239453?linked=1?t=8s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/004_ESP32-CAM_draw

В этом видео рассматривается, как работать с изображениями, полученными с камеры ESP32-CAM, и наносить на них графику и текст. Показаны принципы конвертации форматов изображений и использования специальных библиотек для рисования поверх кадра.

Основные моменты ролика:

  • Получение кадра с камеры в формате JPEG и отправка его в браузер.

  • Конвертация изображения в формат RGB888, позволяющий работать напрямую с пикселями.

  • Структура RGB888: каждый пиксель описывается тремя байтами (R, G, B), что позволяет изменять цвет отдельных точек.

  • Демонстрация низкоуровневого доступа к пикселям (закрашивание отдельных областей напрямую).

  • Использование библиотеки FB_GFX для рисования:

    • прямоугольники, линии, буквы и текст;

    • работа с цветами через битовые комбинации.

  • Создание собственных функций:

    • рисование окружности (через расчёт координат по синусу и косинусу),

    • затемнение участка изображения (понижение яркости в выбранном прямоугольнике).

  • Конвертация изменённого кадра обратно в JPEG и передача на веб-страницу через WebSockets.

  • Итог: возможность накладывать графику и текст на изображения с камеры ESP32-CAM в реальном времени.

ESP32-CAM 05: объединение изображений

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239454?linked=1?t=11s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/005_ESP32-CAM_combination

В этом видео разбирается, как объединить два изображения на ESP32-CAM — например, наложить логотип на фотографию, полученную с камеры.

Основные моменты ролика:

  • Инициализация microSD-карты для хранения логотипа.

  • Захват изображения с матрицы камеры в формате JPEG.

  • Чтение логотипа с карты памяти и загрузка его в буфер.

  • Конвертация обоих изображений (фотографии и логотипа) из формата JPEG в RGB888 для работы с пикселями.

  • Реализация функции insertLogo(), которая принимает:

    • исходное изображение,

    • логотип,

    • их размеры,

    • координаты вставки.

  • Итерация по пикселям и замена соответствующих участков исходного изображения пикселями из логотипа.

  • Конвертация итогового изображения обратно в JPEG и отправка в браузер через WebSockets.

  • Демонстрация результата: фото с камеры с наложенным логотипом.

ESP32-CAM 06: обрезка изображения

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239455?linked=1?t=8s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/006_ESP32-CAM_crop

В этом видео показывается, как реализовать обрезку (crop) изображения на ESP32-CAM. Демонстрируется процесс выделения части кадра, её сохранения и последующей отправки в браузер.

Основные моменты ролика:

  • Захват изображения с матрицы камеры в формате JPEG.

  • Инициализация буфера под обрезанное изображение.

  • Реализация функции crop(), которая принимает:

    • исходное изображение и его размеры,

    • координаты верхнего левого угла области обрезки,

    • ширину и высоту новой области.

  • Конвертация исходного кадра из JPEG в RGB888 для доступа к пикселям.

  • Проверка границ: чтобы область обрезки не выходила за пределы исходного изображения.

  • Итерация по пикселям выбранного участка и запись их в новый буфер.

  • Конвертация результата обратно в JPEG и передача изображения на веб-страницу через WebSockets.

  • Демонстрация работы: после захвата кадра автоматически отображается обрезанная часть изображения.

ESP32-CAM 07: масштабирование изображения

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239456?linked=1?t=3m50s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/007_ESP32-CAM_resize

В этом видео рассматривается, как изменить размеры изображения, полученного с камеры ESP32-CAM — увеличить или уменьшить его до любых заданных параметров.

Основные моменты ролика:

  • Захват изображения с камеры в формате JPEG и передача его в браузер.

  • Конвертация изображения из JPEG в RGB888 для работы с пикселями.

  • Реализация функции resizeRGBMatrix(), которая принимает:

    • буфер с исходным изображением,

    • его размеры,

    • буфер для нового изображения,

    • целевую ширину и высоту.

  • Расчёт коэффициентов масштабирования по осям X и Y.

  • Итерация по пикселям нового изображения и сопоставление им соответствующих пикселей исходного кадра.

  • Запись преобразованных данных в новый буфер.

  • Конвертация результата обратно в JPEG и отправка изображения в браузер через WebSockets.

  • Демонстрация работы: увеличение исходного кадра с 640×480 до 1000×1000 пикселей и уменьшение до 199×102.

ESP32-CAM 08: сравнение изображений

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239457?linked=1?t=14m36s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/008_ESP32-CAM_difference_detection

В этом видео рассматривается, как сравнить два изображения на ESP32-CAM и использовать это для детекции движения или изменений в кадре.

Основные моменты ролика:

  • Интерфейс содержит две кнопки:

    • Set Main — захват основного изображения для сравнения,

    • Get Current — получение текущего изображения для анализа.

  • Оба изображения переводятся из JPEG в формат RGB888 для работы с пиксельными данными.

  • Алгоритм сравнения:

    • для каждого пикселя вычисляется разница по красной, зелёной и синей компонентам,

    • значения суммируются по всем пикселям,

    • дополнительно рассчитывается среднее значение.

  • Полученные показатели выводятся в веб-интерфейсе и в последовательный порт.

  • Демонстрация работы:

    • при статичной сцене разница минимальна,

    • при изменении (например, движении руки в кадре) значения резко возрастают, фиксируя факт движения.

ESP32-CAM 09: детекция линии

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239458?linked=1?t=6s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/009_ESP32-CAM_line_borders_detection

В этом видео разбирается алгоритм детекции границ линии на изображении, полученном с камеры ESP32-CAM. Такой подход часто применяется в робототехнике, например в роботах, которые следуют по линии на полу.

Основные моменты ролика:

  • Захват изображения с камеры в формате JPEG и передача его в браузер.

  • Конвертация кадра из JPEG в RGB888, а затем в градации серого (чёрно-белое изображение).

  • Реализация функции jpegToGray(), которая переводит каждый пиксель по формуле:
    Gray = 0.114*Blue + 0.587*Green + 0.299*Red.

  • Анализ чёрно-белого изображения по заданным горизонтальным линиям (Y-координатам):

    • поиск резких перепадов значений пикселей (белый → чёрный и чёрный → белый),

    • определение левой и правой границ линии,

    • вычисление координаты центра.

  • Реализация функции findBorders(), которая возвращает координаты X для найденных границ.

  • Визуализация результата: рисование найденных линий и границ поверх изображения с помощью библиотеки FB_GFX.

  • Демонстрация работы: камера успешно находит и отмечает границы линии на листе с наклеенной полосой.

ESP32-CAM 10: определение цвета

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239459?linked=1?t=13m23s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/010_ESP32-CAM_color_detector

В этом видео рассматривается алгоритм распознавания цвета на выделенном участке изображения с камеры ESP32-CAM.

Основные моменты ролика:

  • Захват изображения с камеры и отображение его в браузере.

  • Определение области (окошка) в центре кадра, в которой вычисляется цвет.

  • Представление каждого пикселя как трёхмерного вектора (R, G, B), где значения варьируются от 0 до 255.

  • Расчёт среднего значения компонент (R, G, B) на выделенной области для уменьшения ошибки (учёт освещённости, шумов и битых пикселей).

  • Сравнение полученного «неизвестного» цвета с набором заранее измеренных эталонных цветов (красный, оранжевый, жёлтый, зелёный, голубой, фиолетовый, белый, чёрный и др.).

  • Использование евклидова расстояния для поиска ближайшего цвета: чем меньше расстояние до эталона, тем выше вероятность совпадения.

  • Реализация функций:

    • colorDifference() — вычисление расстояния между цветами,

    • getColorName() — выбор ближайшего цвета из базы,

    • detectColor() — усреднение по области и определение итогового цвета.

  • Передача результата на веб-страницу через WebSockets и отображение названия цвета в реальном времени.

  • Демонстрация работы: корректное определение разных цветов бумаги (красный, оранжевый, жёлтый, зелёный, голубой, фиолетовый, белый, чёрный).

ESP32-CAM 11: HSV цветовой фильтр

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239460?linked=1?t=24m29s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/011_ESP32-CAM_color_mask

В этом видео мы изучаем, как выделять определённые цвета на изображении, получаемом с модуля камеры ESP32-CAM, используя HSV цветовой формат.

Основные моменты ролика:

  • Выбор диапазона цвета

    • Задание диапазонов оттенка, насыщенности и яркости для выделения красного цвета.

    • Изменение диапазона оттенка для выделения зелёного цвета.

    • Примечание: точные значения зависят от освещённости и сцены.

  • Преобразование изображения из RGB в HSV

    • Кадр сначала переводится из JPEG в формат RGB888.

    • Каждый пиксель преобразуется в HSV:

      • Hue (оттенок) – определяет цвет.

      • Saturation (насыщенность) – интенсивность цвета.

      • Value (яркость) – светлота цвета.

    • Все компоненты нормализованы в диапазон 0–255 для удобства обработки.

  • Алгоритм RGB → HSV

    • Определение минимального и максимального значения RGB-компонент.

    • Вычисление дельты (разницы между максимумом и минимумом).

    • Расчёт яркости, оттенка и насыщенности.

    • Сохранение результата в HSV-буфер.

  • Применение маски цвета

    • Использование функции applyMask для фильтрации цветов.

    • Пиксели в пределах заданного диапазона HSV остаются цветными, остальные становятся белыми.

    • После обработки результат конвертируется обратно в JPEG и отправляется на веб-страницу.

  • Демонстрация работы

    • Успешное выделение объектов заданного цвета (например, красной отвёртки или зелёной полосы).

    • Обсуждение влияния диапазонов и шумов на результат.

Итог: с помощью ESP32-CAM и HSV-фильтра можно выделять определённые цвета на изображении, управлять параметрами через веб-интерфейс и визуализировать выбранные области.

ESP32-CAM 12: операция свёртки

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239461?linked=1?t=24m49s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/012_ESP32-CAM_convolution

В этом видео рассматривается, как применять операцию свёртки (convolution) для обработки изображений с камеры ESP32-CAM.

Основные моменты ролика:

  • Преобразование изображения в чёрно-белое

    • Конвертация кадра из JPEG в RGB888, затем в grayscale.

    • Для вычисления серого пикселя используется формула:

      • Красный × 0.299

      • Зелёный × 0.587

      • Синий × 0.114

    • Чёрно-белое изображение используется как одноканальное для упрощения свёртки.

  • Применение свёртки

    • Функция convolution принимает изображение, ядро оператора и размеры.

    • Примеры используемых операторов:

      • Идентичное преобразование – без изменений.

      • Размытие, резкость, выделение границ.

      • Лаплас, Робертс, Собель, Превит.

    • Алгоритм: проход по каждому пикселю, умножение значений на элементы ядра и суммирование.

    • Для операторов типа Робертс/Собель результат вычисляется как √(X² + Y²).

  • Работа с результатами

    • Результат сохраняется в отдельный буфер.

    • Конвертация обратно в JPEG и отправка на веб-страницу.

    • Учёт уменьшения размера изображения в зависимости от ядра.

  • Демонстрация работы

    • Применение разных операторов и визуализация их эффектов.

    • Объяснение влияния ядра на выделение границ и улучшение резкости.

Итог: с помощью ESP32-CAM и операции свёртки можно реализовать разные фильтры обработки изображений: размытие, повышение резкости и выделение контуров.

ESP32-CAM 13: преобразование Хафа для окружностей

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239462?linked=1?t=23m15s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/013_ESP32-CAM_Hough_transform_circle

В этом видео показано, как детектировать окружности на изображении с камеры ESP32-CAM с помощью алгоритма преобразования Хафа. Захват изображения с объектами разного диаметра (например, монеты).

Основные моменты ролика:

  • Преобразование изображения

    • Конвертация исходного кадра в grayscale.

    • Выделение контуров оператором Лапласа.

    • Удаление шумов функцией DeleteNoise, зануляющей одиночные пиксели.

  • Алгоритм Хафа для окружностей

    • Для каждого белого пикселя изображения строится окружность с заданным радиусом в «пространстве Хафа».

    • При совпадении с окружностью на исходном изображении в центре накапливается максимум яркости.

    • Определяются координаты центров окружностей.

    • Используются порог яркости и проверка расстояния между точками для исключения дублей.

  • Работа с результатами

    • Сохранение координат центров в массивы и вывод их количества в порт.

    • Визуализация найденных окружностей на исходном RGB888 изображении.

  • Демонстрация работы

    • Корректная детекция окружностей одинакового радиуса, игнорирование других объектов.

    • Устойчивость алгоритма при перемещении объектов в кадре.

Итог: алгоритм преобразования Хафа позволяет ESP32-CAM эффективно находить окружности на изображении, отфильтровывать шумы и отображать результат на веб-странице.

ESP32-CAM 14: преобразование Хафа для прямых линий

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239463?linked=1?t=1s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/014_ESP32-CAM_Hough_transform_line

В этом видео показано, как выделять прямые линии на изображении с камеры ESP32-CAM с помощью алгоритма преобразования Хафа.

Основные моменты ролика:

  • Выделение контуров и шумоподавление

    • Использование операции свёртки и оператора Лапласа для выделения границ объектов.

    • Фильтрация шумов: удаление одиночных и изолированных пикселей.

  • Алгоритм Хафа для линий

    • Для каждого белого пикселя с контурами строятся линии под углами от -90° до 90°.

    • Параметры (угол θ и расстояние R) откладываются в «пространстве Хафа».

    • В ярких точках пространства накапливаются линии, соответствующие реальным контурам.

  • Фильтрация и объединение линий

    • Линии, лежащие почти на одной траектории, объединяются.

    • Проверяется евклидово расстояние между линиями для исключения дублей.

  • Визуализация результата

    • Координаты найденных линий преобразуются обратно на исходное изображение.

    • Построение линий поверх объектов (например, зубочисток) для отображения результата.

Итог: алгоритм преобразования Хафа позволяет ESP32-CAM корректно выделять прямые линии, фильтровать шумы и визуализировать контуры объектов на изображениях.

ESP32-CAM 15: TensorFlow Lite — классификация изображений

VK: https://vkvideo.ru/playlist/63898488_2/video63898488_456239464?linked=1?t=1s
GitHub: https://github.com/DenissStepanjuk/ESP32-CAM_TUTORIALS/tree/main/015_ESP32-CAM_Classification

В этом видео показывается, как реализовать классификацию изображений на микроконтроллере ESP32-CAM с использованием TensorFlow Lite.

Основные моменты ролика:

  • Подготовка датасета

    • Захват изображений объектов с помощью ESP32-CAM.

    • Сохранение кадров на microSD-карте.

    • Организация данных по категориям (например, матрёшка, мышь, гаечный ключ).

  • Создание и обучение сверточной нейронной сети (CNN)

    • Использование Python и Jupyter Notebook для подготовки модели.

    • Разделение данных на тренировочные и проверочные (10% для проверки).

    • Применение аугментации изображений для повышения устойчивости модели.

    • Построение CNN с несколькими свёрточными слоями и функцией softmax для классификации.

    • Обучение модели на 150 эпох с контролем точности и ошибки.

  • Конвертация модели в TensorFlow Lite (TFLite)

    • Исходная модель формата H5 (~12 МБ) слишком велика для ESP32-CAM.

    • Преобразование в формат TFLite с 8-битной квантовкой для работы на микроконтроллере.

    • Подготовка representative dataset для конвертации.

    • Проверка точности облегчённой модели (~83%).

  • Загрузка модели на ESP32-CAM и интеграция

    • Использование Arduino IDE и библиотеки TensorFlow Lite для ESP32.

    • Инициализация интерпретатора и выделение памяти под вычисления.

    • Настройка веб-интерфейса для захвата снимков и вывода результатов.

    • Предобработка изображений: изменение размера, нормализация пикселей в диапазон [-128, 127].

    • Вывод вероятностей классов в реальном времени на веб-странице.

  • Демонстрация работы модели

    • Классификация объектов: матрёшка, мышь, гаечный ключ.

    • Отображение распределения вероятностей для каждого класса.

    • Проверка работы модели на реальных изображениях.

Итог: ESP32-CAM успешно классифицирует объекты в реальном времени с помощью оптимизированной CNN в формате TensorFlow Lite. Веб-интерфейс позволяет получать снимки и визуализировать результаты классификации.

Комментарии (0)