Введение Эта статья будет посвящена распознаванию жестов.
Я считаю, что эта тема сегодня очень актуальна, поскольку такой способ ввода информации более удобен для человека.
На YouTube можно увидеть много видео о распознавании и отслеживании объектов, в хабе также есть статьи на эту тему, поэтому я решил поэкспериментировать и сделать что-то свое, полезное и нужное.
Я решил сделать видеоплеер, которым можно управлять жестами, потому что иногда мне самому очень лень схватить мышку, найти этот ползунок и перемотать немного вперед или немного назад, особенно когда смотрю фильмы на иностранном языке (там Мне часто приходится перематывать) .
В статье в основном пойдет речь о том, как я реализовал распознавание жестов, а расскажу только о видеоплеере в целом.
Так чего же мы хотим?
Мы хотим иметь возможность давать следующие команды с помощью жестов:- Быстрая перемотка вперед/назад
- Пауза/продолжение
- Добавить/уменьшить звук
- Следующий/предыдущий трек.
- Движение слева направо/справа налево
- Движение от центра вверх вправо
- Движение снизу вверх/сверху вниз
- Движение из центра вниз-вправо/из центра вниз-влево
У меня на ноутбуке встроенная камера 0,3 Мп.
Он слабенький, но при хорошем освещении его тоже можно использовать для таких целей.
Но я буду использовать внешнюю USB-камеру.
Жесты мы будем показывать каким-то одноцветным стиком, потому что мы выделим его из фона фильтрацией по цвету.
Например, в качестве такого предмета мы будем использовать обычный карандаш.
Конечно, это не лучший способ распознавания объекта, но мне хотелось сосредоточиться на распознавании жеста (движения), а не объекта на рисунке.
Инструменты
В качестве среды разработки я буду использовать Qt framework 5.2. Для обработки видеопотока с веб-камеры я буду использовать OpenCV 4.6. GUI будет полностью на QML, а блок распознавания — на C++.Оба инструмента имеют открытый исходный код и являются кроссплатформенными.
Я разработал плеер для Linux, но его можно перенести на любую другую платформу, нужно просто скомпилировать OpenCV с поддержкой Qt для нужной платформы и перекомпилировать и пересобрать плеер.
Я пытался перенести плеер на Windows, но мне не удалось скомпилировать OpenCV с поддержкой Qt. Любой, кто попробует это и добьется успеха, поделитесь руководством или двоичными файлами.
Структура игрока
На рисунке ниже показана структура плеера.Плеер работает в два потока.
Основной поток содержит графический интерфейс и видеоплеер.
Блок распознавания вынесен в отдельный поток, чтобы предотвратить зависание интерфейса и воспроизведения видео.
Интерфейс я написал на QML, логику плеера на JS, а блок распознавания на C++ (все знают почему).
Игрок «общается» с блоком распознавания с помощью сигналов и слотов.
Я сделал обертку для класса распознавания, чтобы было проще разбить приложение на 2 потока.
На самом деле обертка находится в основном потоке (то есть не так, как показано на картинке).
Оболочка создает экземпляр класса распознавания и помещает его в новый дополнительный поток.
Собственно, это все, что касается игрока; далее я расскажу о распознавании и приведу код.
Признание
Для того чтобы распознать, мы будем собирать кадры и обрабатывать их методами теории вероятностей.Будем собирать двадцать кадров в секунду (больше веб-камера не позволяет).
Мы будем обрабатывать десять кадров одновременно.
Алгоритм:
- получаем кадр с веб-камеры и отправляем его в фильтр;
- фильтр возвращает нам бинарное изображение, на котором виден только карандаш в виде белого прямоугольника на черном фоне;
- бинарное изображение отправляется в анализатор, где вычисляются вершины карандаша.
Верхняя вершина вводится в массив.
- если массив достигает размера 10 элементов, то этот массив отправляется в вероятностный анализатор, где последовательность пар чисел анализируется методом наименьших квадратов.
- Если анализ распознает команду, то эта команда отправляется видеоплееру.
Следующая функция контролирует камеру, когда включено управление жестами:
Теги: #компьютерное зрение #Qt #qt fast #C++ #Параллельное программирование #Qt #Обработка изображенийvoid MotionDetector::observCam() { m_cap >> m_frame;
-
Cpanel Vps-Хостинг Доступен По Цене
19 Oct, 24 -
Ии Для Людей: Простыми Словами О Технологиях
19 Oct, 24 -
«Горячие Планеты» Оказались Звездами
19 Oct, 24 -
Симус.habrahabr.ya.ru
19 Oct, 24 -
Как Мне Искать Новую Работу?
19 Oct, 24