2012-04-13 7 views
16

Я разрабатываю приложение C++ для проверки подлинности лиц. Во-первых, я должен обнаружить лицо и предварительно обработать изображение.Как выровнять изображения лица C++ opencv

  1. Для обнаружения лица я использовал HaarCascadeClassifier. Проблема в том, что этот инструмент или этот алгоритм дает мне область лица, обнаруженную небольшим большим прямоугольником, который захватывает волосы и некоторые фон. Есть ли решение изменить размер этого прямоугольника? Я использовал «frontalfacecascaadclassifier.xml».
  2. Для предварительной обработки лица я хочу сделать выравнивание лица точно так же, как this technique. Как я могу это сделать?
+0

Почему не удается определить ориентацию с помощью PCA, как показано [здесь] (https://robospace.wordpress.com/2013/10/09/object-orientation-principal-component-analysis-opencv/) для применения лица тоже? – Seanny123

+0

Я нашел [dlib] (https://github.com/davisking/dlib), похоже, очень мощная библиотека, и это быстрый, бесплатный и открытый исходный код. – dashesy

ответ

8

Не можете ли вы использовать другой классификатор Хаара, чтобы найти каждый глаз (глаза очень легко найти), тогда предполагается, что у человека есть два глаза, и мы определяем «ровное» лицо, чтобы глаза были горизонтальными.

Просто измерьте форму между двумя глазами и поверните изображение под этим углом.

+0

спасибо за ваш ответ, особенно ваш быстрый ответ. Я согласен с вами в обнаружении первых глаз. Но я не понял, как «определить лицо уровня», чтобы глаза были горизонтальными ». Это объясняет, что этот угол вы определили. Как я могу получить лицо в соответствии с положением глаз – OntoBLW

+0

@louloulili - вы сказали, что уже нашли лицо от Хаара, вам просто нужно было его повернуть? –

+0

Я хочу иметь такое изображение http://www.bytefish.de/_media/blog/arnie_20_20_200_200.jpg?cache=&w=200&h=200, но я нашел изображение, подобное этому http://www.bytefish.de /_media/blog/arnie_30_30_200_200.jpg и прямоугольник лица, обнаруживающего хай, большой. После того, как я поверну его, выровняйте его. Пожалуйста, помогите мне и заблаговременно за ваши ответы. – OntoBLW

18

Поиск точного положения глаз в заданном изображении далеко не тривиально. Haar-каскады для поиска глаз в OpenCV создают слишком много ложных срабатываний, чтобы быть полезными, причем этот подход не будет устойчивым к вращению изображения (он может компенсировать небольшое вращение, хотя я не знаю обучающие образы). Если бы я был вами, я бы начал поиск по ширине в http://scholar.google.com для соответствующих работ в этой области исследований.

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

+0

Я хочу продолжить метод, подобный этому http://www.bytefish.de/blog, и получить iamge вот так: http: /www.bytefish.de/_detail/blog/arnie_20_20_200_200.jpg?id=blog У вас есть идея, как это сделать в C++ – OntoBLW

6

Я попытался следующий код выравнивания лица из Страница «Маркированные лица на диком». Он работает очень хорошо и не требует обнаружения черт лица. Код C++ можно загрузить с: http://vis-www.cs.umass.edu/faceAlignment/

Если вы все еще хотите найти ключевые точки лица, я обнаружил, что детектор Viola-Jones не очень надежный и точный. Я лично рекомендую использовать детектор ключевых точек на лицевой панели Flandmark: http://cmp.felk.cvut.cz/~uricamic/flandmark/, который является гораздо более надежным и точным. Код C может быть загружен с вышеуказанного сайта.

+0

Использование данных 'people.train' на некоторых моих образцовых изображениях тоже не сработало как я надеялся. Он повернул некоторые из моих управляющих изображений и не менял моих тестовых изображений столько, сколько я хотел. Не могли бы вы поделиться образцом вашего тестового набора и результатом, который он дал, дал вам уверенность в том, что бы сделать эту рекомендацию? – Seanny123

+1

Я не знаком с моделью people.train, которую вы упоминаете. Я использовал код застывания, чтобы обучить мою собственную модель, которую я называю face.train для лиц, используя около 1000 лиц. Затем используйте код воронки, чтобы использовать это для выравнивания лиц. Во-первых, первоначальное несоосность в ваших учебных и тестовых изображениях не может быть слишком «далекой». Если они смещены на 40 градусов или если масштаб слишком различен, он не работает. Читать газету. Не просто относитесь к нему как к черному ящику. – lightalchemist

+0

Один из тестовых наборов, которые я пробовал, - это [это] (http://chenlab.ece.cornell.edu/people/Andy/GallagherDataset.html). Обратите внимание, что как вы обрезаете лица и параметры, особенно размер внутреннего и внешнего окон очень важен. Вы хотите, чтобы внутреннее окно просто захватывало от бровей до губ или подбородка. – lightalchemist

1

Обнаружение несогласованных лиц затрудняет распознавание лиц. Иногда вы хотите исправить выравнивание, иногда достаточно исключить те, которые не выровнены правильно (например, если вы обнаруживаете лица в видеопотоке). Я применил последний подход и обучил специальный каскад Хаара, чтобы выявлять правильно выровненные, хорошо освещенные лица. Подробности здесь: http://rwoodley.org/?p=417.

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

0

Посмотрите на анализ интерфейса CSIRO SDK (website and demos, source code), он выполняет выравнивание по лицу, отслеживание с 66 точками. Это быстро и очень точно.

+0

Я использую его для моей диссертации. Я могу сказать, что это одно из лучших программ выравнивания лица, которое я видел. Он отслеживает 66 ориентиров в режиме реального времени. Взгляните на эту статью для более подробной информации «Подгонка деформируемой модели с помощью регуляризованных средних сдвигов». –

+0

Эта программа не работает с изображениями с наклонным лицом. – Seanny123

+0

Он использует детектор лица OpenCV для обнаружения лиц. Вы можете попробовать инициализировать трекер CSIRO с помощью другого детектора лица, который работает с наклоненными лицами. Однако, как правило, для задач аутентификации вам необходимо сузить набор переменных до минимума, сделав каждое обученное изображение максимально похожим на тестовые. –

0

После поиска всего алгоритма для достижения этого, я наконец нашел this paper после перехода с Google на DuckDuckGo. Он поддерживает грани, наклоненные под углом более 45 градусов.

Что касается реализации кода, это еще одна проблема, над которой я сейчас работаю, но, по крайней мере, это отправная точка.

4

состояния современного подходом для выравнивания лица должен быть таким:

Supervised Descent Method and its Application to Face Alignment X. Xiong and F. De la Torre in CVPR 2013

Это очень быстрое и эффективное. Вы можете проверить их веб-сайт проекта IntraFace.

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

демо, чтобы показать, что он может обрабатывать наклонную поверхность здесь (для вопроса о конфиденциальности, добавить размытие и обратить внимание на оси в верхнем левом углу): https://drive.google.com/file/d/0BztytuqPViMoTG9QaEpZWi1NMGc/edit?usp=sharing

+0

Хотя это полезная ссылка, я хотел бы получить более подробную информацию, например, доказательство того, что она обнаруживает наклонные грани и/или степень наклона, прежде чем дать вам щедрость. – Seanny123

+0

Особенно понравился фрагмент кода. – Seanny123

+0

Демонстрация показана на изображении выше. Для кода то, что предоставил автор, является файлом .l-файла matlab, который может быть использован в вашем приложении, но источник неизвестен. Тем не менее, я настоятельно рекомендую вам проверить бумагу, основной алгоритм очень прост. – rookiepig