четвер, 28 березня 2013 р.

Определение лиц

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

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments