2013-07-18 5 views
1

Я пытаюсь добавить обнаружение лица в свое приложение, а добавленный код возвращает мне CGRect, который не имеет никакого отношения к лицу.iOS, обнаружение лица, обнаружение местоположения вдали от лица

Вот код

CIImage *cIImage = [CIImage imageWithCGImage:self.imageView.image.CGImage]; 
CIDetector* faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace 
              context:nil options:[NSDictionary 
     dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]]; 
NSArray *features = [faceDetector featuresInImage:cIImage]; 
for(CIFaceFeature* faceObject in features) 
{ 
    FaceLocation.x = faceObject.bounds.origin.x; 
    FaceLocation.y = faceObject.bounds.origin.y; 
}// Here face location is far off away form the actual face 

Но этот код дает мне место далеко от фактического лица, что я делаю неправильно здесь?

+0

Что о размере границ? Почему бы вам не взглянуть на полные рамки? Конечно, происхождение будет в углу. Вот почему он называется происхождением, а не центром –

ответ

2

Проблема возникает из-за различий между ориентацией в UIImage и CIDetectorImageOrientation. С прошивкой документы:

CIDetectorImageOrientation

Ключ, используемый для определения ориентации дисплея изображения, черты которого вы хотите, чтобы обнаружить. Этот ключ является объектом NSNumber с тем же значением, что и спецификация TIFF и EXIF; значения могут варьироваться от 1 до 8. Значение определяет, где находится начало координат (0,0) изображения. Если нет , значение по умолчанию равно 1, что означает начало изображения сверху, слева. Подробнее о происхождении изображения, заданном каждым значением, см. KCGImagePropertyOrientation.

Доступно в iOS 5.0 и новее.

Объявлено в CIDetector.h.

Вы должны указать CIDetectorImageOrientation. Вот что я сделал:

int exifOrientation; 
switch (self.image.imageOrientation) { 
    case UIImageOrientationUp: 
     exifOrientation = 1; 
     break; 
    case UIImageOrientationDown: 
     exifOrientation = 3; 
     break; 
    case UIImageOrientationLeft: 
     exifOrientation = 8; 
     break; 
    case UIImageOrientationRight: 
     exifOrientation = 6; 
     break; 
    case UIImageOrientationUpMirrored: 
     exifOrientation = 2; 
     break; 
    case UIImageOrientationDownMirrored: 
     exifOrientation = 4; 
     break; 
    case UIImageOrientationLeftMirrored: 
     exifOrientation = 5; 
     break; 
    case UIImageOrientationRightMirrored: 
     exifOrientation = 7; 
     break; 
    default: 
     break; 
} 

NSDictionary *detectorOptions = @{ CIDetectorAccuracy : CIDetectorAccuracyHigh }; 
CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]; 

NSArray *features = [faceDetector featuresInImage:[CIImage imageWithCGImage:self.image.CGImage] 
              options:@{CIDetectorImageOrientation:[NSNumber numberWithInt:exifOrientation]}]; 

После того, как функция обнаружения, также необходимо сопоставить координате в поле зрения UIImage, использовать мою суть здесь: https://gist.github.com/laoyang/5747004 преобразовать систему координат

+0

привет, я не знаю, как реализовать этот смысл! должен ли O просто скопировать и вставить все в него? Я новичок в xcode. – funkycoldmedia

+0

Это уже реализовано. Просто скопируйте файл и используйте его. Это категория на CIFaceFeature –

+0

thnx, которая сделала это. – funkycoldmedia

0

IOS 10 и Swift 3

Если вы не интерес к лицу особенности

вы можете проверить яблоко example вы можете обнаружить лицо, это очень хорошо работает с Ориентации

вы можете выбрать metedata лица, чтобы камера отслеживать лицо и показать желтый ящик на лице

его имеет хорошую производительности чем это example

Смежные вопросы