Meefik's Blog

Freedom and Open Source

Выравнивание изображений лиц на JavaScript

В задачах автоматической обработки изображений лиц часто встает вопрос о нахождении и нормализации (выравнивании) изображения лица на фотографии или в видеопотоке. Выравнивание обычно включает в себя поворот, масштабирование и обрезку интересующей части фотографии. В сети можно найти примеры для реализации данной функции на Python или C/C++ с помощью библиотеки компьютерного зрения OpenCV. Здесь я приведу два примера реализации данной функции на JavaScript для NodeJS и для запуска в браузере на чистом JS.

Поиск лиц на изображении

Для работы с изображениями на NodeJS используется модуль node-opencv, основанный на библиотеке компьютерного зрения OpenCV. Для поиска лиц на изображении используется метод Виолы-Джонса и его реализация в OpenCV.

Для реализации метода Виолы-Джонса в браузере используется часть кода из библиотеки tracking.js.

Выравнивание лица

Для выравнивания изображения лица используется информация о центрах глаз. Глаза на изображении находятся тем же методом, что и лицо, но используя другой классификатор. Уточняются примерные области поиска для каждого глаза, затем запускается поиск глаз. Центр глаза вычисляется как центр масс прямоугольников, которые находит метод Виолы-Джонса для каждого глаза. Затем определяется расстояние между центрами и угол наклона головы, после чего выполняется поворот, масштабирование и обрезка лица. На выходе получается выравненная фотография лица.

Запуск на сервере

Исходный код выложен здесь face-alignment. Для запуска на компьютере Debian/Ubuntu нужно выполнить следующее:

sudo apt install nodejs libopencv-dev
git clone https://github.com/meefik/face-alignment
cd face-alignment
npm install

Запуск из командной строки выполняется так:

node detect.js input.png face.png out.png

Здесь файл face.png содержит только лицо, а out.png - исходное изображение с пометками.

Запуск в браузере

Веб-сервер запускается следующей командой:

npm start

После чего в браузере достаточно открыть адрес http://localhost:3000.