Спец алгоритмы для лиц точно есть. У меня фот в реальном времени находит лица. А проц там хоть и спецовый, но всё равно слабый.
Распознавание же на opencv у меня клинит даже на core2.
он с тем же успехом находит нарисованные лица на шаржах, а так же подозреваю не найдёт лица негра или чувака со смуглой кожей. А так да, можешь и сам написать, как на фотике.
Это элементарная математика, а вот опознать лицо при любой ориентации, да еще и с разной цветностью, да прописать в EXIF фотографий, кто на них изображен - очень сложная задача.
Есть и ещё проще вариант - готовая python-обёртка к gstreamer+opencv, она только запускает конвейер и получает сообщения вида «а вот здесь (x,y) лицо!»
Я занимался вопросом распознавания лиц когда учился в универе.
Вообщем пришел к выводу, что для каждого _конкретного_ случая нужен специализированный алгоритм.
Нет в этом вопросе серебряной пули.
Простой пример. Я реализовал на Matlab модифицированный градиентный метод распознавания лиц. Суть метода вкраце можно описать так:
1) Масштабируем фото с определенным коэффициентом для получения более круглой формы лица.
2) Переводим его в другое пространство цвета (забыл точно какое нужно для этого метода).
3) Наибольший «градиент» по идее будет на границе лица.
4) Далее перебираем точки градиента (можно не все) и строим окружности с центром с данной точке. Радиусы окружностей меняем с заданным шагом.
5) Согласно методу, точка где пересекается наибольшее число окружностей - это и есть центр лица (это просто максимум в hit matrix).
6) Радиус найти не составляет труда.
Короче этот метод работал очень хорошо.
Однако, когда я подсунул ему фотку человека в белом свитере с яркими фигурами, расположенными полукругом, мой алгоритм дал неверный ответ.
Дело в том, что этот полукруг ярких фигур на белом фоне дал куда больший градиент чем человеческое лицо. В итоге лицо было определено с центром на свитере.
Другие алгоритмы без проблем обрабатывали эту фотку, но валились на других, неудобных для них, примерах.
Я не уверен, но думаю что в коммерческих продуктах используется не один алгоритм, а несколько. Наиболее оптимальный из них выдирается исходя из характеристик изображения.
Все сказанное выше IMHO, так как я не профессионал в распознавании лиц.