Функция определения лиц от Apple появилась только в iOS SDK 5.0, сообтветственно для тестирования приведенного ниже примера необходима iOS 5.0 или выше.
Ниже будет пример определения лиц(а также глаз и рта) на заложенной ранее фотографии.
Итак, приступим.
Добавляем в приложение CoreImage.framework, подключаем хидер:
#import <CoreImage/CoreImage.h>
Запускаем метод faceDetector
[self faceDetector];
Сам этот метод берет изображение из проекта и посылает его функции, которая обрабатывает изображение.
-(void)faceDetector
{
// Загрузка изображения для определения лица
UIImageView* image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.jpg"]];
// Добавляем изображение в окно
[self.window addSubview:image];
// Запускаем мотед markFaces в фоновом режиме
[self performSelectorInBackground:@selector(markFaces:) withObject:image];
// Переворачиваем изображение по оси Y для корректного отображения
[image setTransform:CGAffineTransformMakeScale(1, -1)];
// Переворачиваем окно по оси Y для корректного отображения
[self.window setTransform:CGAffineTransformMakeScale(1, -1)];
}
Метод markFaces: получает исходное изображение и обрабатывает его, добавляя контуры лица, глаз и рта, которые были обнаружены.
-(void)markFaces:(UIImageView *)facePicture
{
// Рисуем CI-изображение из ранее загруженного изображения для распознавания лица
CIImage* image = [CIImage imageWithCGImage:facePicture.image.CGImage];
// Создаем распознаватель лица, выставляем ему высокую точность, пренебрегая временем выполнения
CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace
context:nil options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]];
// Создаем массив, содержащий все обнаруженные лица от детектора
NSArray* features = [detector featuresInImage:image];
// Будем повторять каждое обнаруженное лицо. CIFaceFeature дает нам ширину для всего лица, а также координаты для каждого глаза и рта, если они были обнаружены. Кроме того, предоставляется BOOL для глаз и рта, чтобы мы могли проверить существуют ли они.
for(CIFaceFeature* faceFeature in features)
{
// Получаем ширину лица
CGFloat faceWidth = faceFeature.bounds.size.width;
// Создаем UIView по размерам лица
UIView* faceView = [[UIView alloc] initWithFrame:faceFeature.bounds];
// добавляем рамку к UIView
faceView.layer.borderWidth = 1;
faceView.layer.borderColor = [[UIColor redColor] CGColor];
// добавляем UIView в окно
[self.window addSubview:faceView];
if(faceFeature.hasLeftEyePosition)
{
// Создаем UIView по размеру левого глаза
UIView* leftEyeView = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.leftEyePosition.x-faceWidth*0.15, faceFeature.leftEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)];
// Меняем фон на синий
[leftEyeView setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]];
// Устанавливаем правильную позицию, где находится левый глаз
[leftEyeView setCenter:faceFeature.leftEyePosition];
// Закругляем углы
leftEyeView.layer.cornerRadius = faceWidth*0.15;
// Добавляем к окну
[self.window addSubview:leftEyeView];
}
if(faceFeature.hasRightEyePosition)
{
// Создаем UIView по размеру правого глаза
UIView* rightEye = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.rightEyePosition.x-faceWidth*0.15, faceFeature.rightEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)];
// Меняем фон на синий
[rightEye setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]];
// Устанавливаем правильную позицию, где находится правый глаз
[rightEye setCenter:faceFeature.rightEyePosition];
// Закругляем углы
rightEye.layer.cornerRadius = faceWidth*0.15;
// Добавляем к окну
[self.window addSubview:rightEye];
}
if(faceFeature.hasMouthPosition)
{
// Создаем UIView по размеру рта
UIView* mouth = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.mouthPosition.x-faceWidth*0.2, faceFeature.mouthPosition.y-faceWidth*0.2, faceWidth*0.4, faceWidth*0.4)];
// Меняем фон на зеленый
[mouth setBackgroundColor:[[UIColor greenColor] colorWithAlphaComponent:0.3]];
// Устанавливаем правильную позицию, где находится рот
[mouth setCenter:faceFeature.mouthPosition];
// Закругляем углы
mouth.layer.cornerRadius = faceWidth*0.2;
// Добавляем к окну
[self.window addSubview:mouth];
}
}
}
Вот и все.
Внимание: в примере работает система автоматического контроля над памятью ARC. Если в вышем проекте ARC отключена, то не забудьте очистить память.

