Умный Видеоплеер Или Просто Распознавание Жестов



Введение Эта статья будет посвящена распознаванию жестов.

Я считаю, что эта тема сегодня очень актуальна, поскольку такой способ ввода информации более удобен для человека.

На YouTube можно увидеть много видео о распознавании и отслеживании объектов, в хабе также есть статьи на эту тему, поэтому я решил поэкспериментировать и сделать что-то свое, полезное и нужное.

Я решил сделать видеоплеер, которым можно управлять жестами, потому что иногда мне самому очень лень схватить мышку, найти этот ползунок и перемотать немного вперед или немного назад, особенно когда смотрю фильмы на иностранном языке (там Мне часто приходится перематывать) .

В статье в основном пойдет речь о том, как я реализовал распознавание жестов, а расскажу только о видеоплеере в целом.



Так чего же мы хотим?

Мы хотим иметь возможность давать следующие команды с помощью жестов:
  1. Быстрая перемотка вперед/назад
  2. Пауза/продолжение
  3. Добавить/уменьшить звук
  4. Следующий/предыдущий трек.

Сравним перечисленные действия с жестами:
  1. Движение слева направо/справа налево
  2. Движение от центра вверх вправо
  3. Движение снизу вверх/сверху вниз
  4. Движение из центра вниз-вправо/из центра вниз-влево
За жестами будем наблюдать через веб-камеру.

У меня на ноутбуке встроенная камера 0,3 Мп.

Он слабенький, но при хорошем освещении его тоже можно использовать для таких целей.

Но я буду использовать внешнюю USB-камеру.

Жесты мы будем показывать каким-то одноцветным стиком, потому что мы выделим его из фона фильтрацией по цвету.

Например, в качестве такого предмета мы будем использовать обычный карандаш.

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



Инструменты

В качестве среды разработки я буду использовать Qt framework 5.2. Для обработки видеопотока с веб-камеры я буду использовать OpenCV 4.6. GUI будет полностью на QML, а блок распознавания — на C++.

Оба инструмента имеют открытый исходный код и являются кроссплатформенными.

Я разработал плеер для Linux, но его можно перенести на любую другую платформу, нужно просто скомпилировать OpenCV с поддержкой Qt для нужной платформы и перекомпилировать и пересобрать плеер.

Я пытался перенести плеер на Windows, но мне не удалось скомпилировать OpenCV с поддержкой Qt. Любой, кто попробует это и добьется успеха, поделитесь руководством или двоичными файлами.



Структура игрока

На рисунке ниже показана структура плеера.

Плеер работает в два потока.

Основной поток содержит графический интерфейс и видеоплеер.

Блок распознавания вынесен в отдельный поток, чтобы предотвратить зависание интерфейса и воспроизведения видео.

Интерфейс я написал на QML, логику плеера на JS, а блок распознавания на C++ (все знают почему).

Игрок «общается» с блоком распознавания с помощью сигналов и слотов.

Я сделал обертку для класса распознавания, чтобы было проще разбить приложение на 2 потока.

На самом деле обертка находится в основном потоке (то есть не так, как показано на картинке).

Оболочка создает экземпляр класса распознавания и помещает его в новый дополнительный поток.

Собственно, это все, что касается игрока; далее я расскажу о распознавании и приведу код.

Умный видеоплеер или просто распознавание жестов



Признание

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

Будем собирать двадцать кадров в секунду (больше веб-камера не позволяет).

Мы будем обрабатывать десять кадров одновременно.

Алгоритм:

  1. получаем кадр с веб-камеры и отправляем его в фильтр;
  2. фильтр возвращает нам бинарное изображение, на котором виден только карандаш в виде белого прямоугольника на черном фоне;
  3. бинарное изображение отправляется в анализатор, где вычисляются вершины карандаша.

    Верхняя вершина вводится в массив.

  4. если массив достигает размера 10 элементов, то этот массив отправляется в вероятностный анализатор, где последовательность пар чисел анализируется методом наименьших квадратов.

  5. Если анализ распознает команду, то эта команда отправляется видеоплееру.

Я приведу только 3 основные функции распознавания.

Следующая функция контролирует камеру, когда включено управление жестами:

   

void MotionDetector::observCam() { m_cap >> m_frame;

Теги: #компьютерное зрение #Qt #qt fast #C++ #Параллельное программирование #Qt #Обработка изображений
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.