Распознавание образов - это одна из самых интересных областей компьютерной графики. В то же время это и одна из самых сложных областей. В данной статье мы рассмотрим написание небольшой программы способной определять человеческое лицо на фотографии. При этом мы не будем пока углубляться в математику, а воспользуемся уже готовыми реализациями необходимых алгоритмов.

Нам понадобится библиотека OpenCV и необходимые биндинги для Python'а. В стандартных репозиториях Ubuntu 10.04 находится версия 2.0 которая уже устарела, поэтому мы воспользуемся более свежей версией 2.1. Процесс установки довольно прост благодаря готовому PPA от Gijs Molenaar. Достаточно добавить репозиторий ppa:gijzelaar/opencv2, обновить данные о пакетах и установить пакет python-opencv.

Проверим, корректно ли установились нужные нам библиотеки. Для этого запустим интерпретатор Python'а в интерактивном режиме и попробуем сделать что-то простое. Например загрузить изображение и получить его размеры:

  >>> import cv >>> image = cv.LoadImage('charlize_theron.resized.jpg') >>> print cv.GetSize(image) (255, 384) 

Если никаких сообщений об ошибках нет, значит установка прошла успешно. Теперь приступим к написанию собственно программы, которая бы открывала файл с изображением человека и показывала бы его в отдельном окне заключив лицо в зеленый прямоугольник.

  #!/usr/bin/python # -*- coding: utf-8 -*- import sys import cv  image = cv.LoadImage('charlize_theron.resized.jpg') cv.NamedWindow('Face detection', cv.CV_WINDOW_AUTOSIZE)  image_size = cv.GetSize(image) print image_size grayscale = cv.CreateImage(image_size, 8, 1)  storage = cv.CreateMemStorage(0) cascade = cv.Load('haarcascade_frontalface_default.xml') cv.CvtColor(image, grayscale, cv.CV_RGB2GRAY)  cv.EqualizeHist(grayscale, grayscale) faces = cv.HaarDetectObjects(image=grayscale, cascade=cascade,          storage=storage, scale_factor=1.2,          min_neighbors=2, flags=cv.CV_HAAR_DO_CANNY_PRUNING)  if faces:     print 'face detected!'     for i in faces:         print i         cv.Rectangle(image, (i[0][0], i[0][1]),                      (i[0][0]+i[0][2], i[0][1]+i[0][3]),                      (0, 255, 0), 3, 8, 0)  cv.ShowImage('Face detection', image) cv.WaitKey(0) cv.DestroyWindow('Face detection') 

Для работы программы понадобится файл с описанием каскада Хаара. Обычно создание таких файлов - довольно хлопотное занятие. В данном случае можно воспользоваться уже готовым каскадом с сайта http://alereimondo.no-ip.org/OpenCV/34. В нашем случае подойдет файлfrontalFace10.zip. Это архив в котором находится несколько xml файлов из которых нужен haarcascade_frontalface_default.xml.

Здесь нужно сделать несколько пояснений. Поиск лиц осуществляется следующей функцией:

  faces = cv.HaarDetectObjects(image=grayscale, cascade=cascade,          storage=storage, scale_factor=1.2,          min_neighbors=2, flags=cv.CV_HAAR_DO_CANNY_PRUNING) 

Она использует для поиска объектов алгоритм Viola-Jones. Он был предложен в 2001 году Полом Виолой (Paul Viola) и Майклом Джонсом (Michael Jones) для определения объектов в режиме реального времени. Данный алгоритм подходит не только для определения лиц, с его помощью можно определять вообще любые объекты. Выше была приведена ссылка на каскад Хаара предназначенный для поиска лиц. Подробно о создании собственного каскада можно почитать вэтой статье.

Также обратите внимание, что для того чтобы алгоритм мог сработать корректно - изображение нужно обесцветить (cv.CvtColor), а также выровнять его гистограмму (cv.EqualizeHist).

Много дополнительной информации можно почерпнуть из книги Gary Bradski and Adrian Kaehler: Learning OpenCV издательства O'Reilly, а также из статьи Viola, Jones: Robust Real-time Object Detection, IJCV 2001