Функция определения лиц от 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 отключена, то не забудьте очистить память.