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