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