Как выровнять изображения лица С++ opencv
Я разрабатываю приложение С++ для проверки подлинности лиц. Во-первых, я должен определить лицо и предварительно обработать изображение.
- Для обнаружения лица я использовал HaarCascadeClassifier. Проблема в том, что этот инструмент или этот алгоритм дает мне область лица, обнаруженную небольшим большим прямоугольником, который захватывает волосы и некоторые фон. Есть ли решение изменить размер этого прямоугольника? Я использовал "frontalfacecascaadclassifier.xml".
- Для предварительной обработки лица я хочу выполнить выравнивание лица точно так же, как этот метод. Как я могу это сделать?
Ответы
Ответ 1
Разве вы не можете использовать другой классификатор Хаара, чтобы найти каждый глаз (глаза очень легко найти), тогда предполагается, что у человека есть два глаза, и мы определяем "ровное" лицо, чтобы глаза были горизонтальными.
Просто измерьте форму между двумя глазами и поверните изображение под этим углом.
angle = atan ( eye1.Y - eye2.Y ) / (eye1.X - eye2.X )
Ответ 2
Поиск точного положения глаз в данном изображении далеко не тривиально. Haar-каскады для поиска глаз в OpenCV создают слишком много ложных срабатываний, чтобы быть полезными, причем этот подход не будет устойчивым к вращению изображения (он может компенсировать небольшое вращение, хотя я не знаю обучающие образы). Если бы я был вами, я бы начал поиск по ширине в http://scholar.google.com для соответствующих статей этой исследовательской области.
Для выравнивания изображений лица вам понадобится прочная оценка позы для головы. Я сделал некоторые исследования самостоятельно, и я думаю, что использование алгоритмов и кода полезно здесь. Наиболее интересные подходы, которые я видел, следующие:
-
Гэри Б. Хуан, Vidit Jain и Эрик Ученый-Миллер. Неконтролируемое совместное выравнивание сложных изображений. Международная конференция по компьютерному видению (ICCV), 2007. (страница проекта), (доступен в формате PDF в Интернете), (Исходный код)
-
X. Zhu, D. Раманана. Обнаружение лиц, оценка позы и локальная локализация в дикой компьютерной зрелости и распознавании образов (CVPR) Провиденс, Род-Айленд, июнь 2012 г. (страница проекта), (доступен в формате PDF в Интернете), (Исходный код)
Ответ 3
Я попробовал следующий код выравнивания лица на странице проекта "Маркированные лица на диком". Он работает очень хорошо и не требует обнаружения черт лица. Код С++ можно скачать с помощью: http://vis-www.cs.umass.edu/faceAlignment/
Если вы все еще хотите найти ключевые точки лица, я обнаружил, что детектор Viola-Jones не очень надежный и точный. Я лично рекомендую использовать детектор ключевой точки лица Flandmark: http://cmp.felk.cvut.cz/~uricamic/flandmark/, который намного более надежный и точный. C-код можно загрузить с вышеуказанного сайта.
Ответ 4
современный подход для выравнивания лица должен быть следующим:
Поддерживаемый метод спуска и его приложение для выравнивания лица
X. Xiong и F. De la Torre
в CVPR 2013
Это очень быстро и эффективно. Вы можете проверить свой веб-сайт проекта IntraFace.
Они обеспечивают простое в использовании программное обеспечение. Однако код основной части, т.е. контролируемый метод спуска (SDM), выпущен не, это просто простая линейная регрессия, которая может быть легко реализована.
Демонстрация, показывающая, что она может обрабатывать наклонное лицо здесь (для проблемы конфиденциальности, добавить размытие и обратить внимание на ось в верхнем левом углу):
https://drive.google.com/file/d/0BztytuqPViMoTG9QaEpZWi1NMGc/edit?usp=sharing
Ответ 5
Обнаружение несогласованных лиц затрудняет распознавание лиц. Иногда вы хотите исправить выравнивание, иногда достаточно исключить те, которые не выровнены правильно (например, если вы обнаруживаете лица в видеопотоке). Я применил последний подход и обучил специальный каскад Хаара, чтобы выявлять правильно выровненные, хорошо освещенные лица. Подробности здесь: http://rwoodley.org/?p=417.
Если вы используете мой каскад, дайте мне знать, как он работает для вас. Мне любопытно, какие результаты получат другие. Он удовлетворил мои потребности.
Ответ 6
Я реализовал его здесь, используя OpenCV & DLib: https://github.com/ManuBN786/Face-Alignment-using-Dlib-OpenCV
Любые наклонные лица могут быть выровнены с использованием моего кода.
Ответ 7
Взгляните на CSIRO face analysis SDK (сайт и демонстрации, исходный код), он выполняет выравнивание, отслеживание с 66 точками доступа. Это быстро и очень точно.
Ответ 8
После того, как весь день был найден алгоритм для этого, я нашел " Обнаружение лица путем поиска лицевых функций и угла наклона наклонного лица " Хемлатой и др. после перехода с Google на DuckDuckGo. Он поддерживает грани, наклоненные под углом более 45 градусов.
Что касается того, как реализовать в коде, это еще одна проблема, над которой я сейчас работаю, но, по крайней мере, это отправная точка.
Ответ 9
Для проверки подлинности лица вы можете использовать dlib или face_recognition, чтобы сделать это, что очень удобно и точнее, чем opencv.
Что касается dlib, выравнивание лица можно найти здесь (код C++) http://dlib.net/face_alignment.py.html
или здесь (код python) https://www.pyimagesearch.com/2017/05/22/face-alignment-with-opencv-and-python/.
Алгоритм работы с именем Face Alignment на 3000 FPS через регрессию локальных двоичных функций реализуется dlib.