2014-04-11 4 views
8

я получаю вид изображенияIOS обнаружения лица от камеры

-(void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    NSString *mediaType = info[UIImagePickerControllerMediaType]; 

    [self dismissViewControllerAnimated:YES completion:nil]; 

    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) { 
     UIImage *image = info[UIImagePickerControllerOriginalImage]; 

     //imgvprofileImage.image = image; 
     //[self detectForFacesInUIImage:[UIImage imageNamed:@"image00.jpg"]]; 

     [self detectForFacesInUIImage:image]; 
    } 
    else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) 
    { 
     // Code here to support video if enabled 
    } 
} 

Когда я отправить фотографию, как этот

[self detectForFacesInUIImage:[UIImage imageNamed:@"image00.jpg"]]; 

Обнаружение хорошо работает и находит лицо, но когда я использую образ вернулся из камера не работает.

[self detectForFacesInUIImage:image] 

Это функция я использовать для обнаружения лица

-(void)detectForFacesInUIImage:(UIImage *)facePicture 
{ 
    CIImage* image = [CIImage imageWithCGImage:facePicture.CGImage]; 

    CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyLow forKey:CIDetectorAccuracy]]; 

    NSArray* features = [detector featuresInImage:image]; 

    if (features.count == 0) { 
     NSLog(@"There is no faces in captured image ") ; 
    } 

    for(CIFaceFeature* faceObject in features) 
    { 
     CGRect modifiedFaceBounds = faceObject.bounds; 
     modifiedFaceBounds.origin.y = facePicture.size.height-faceObject.bounds.size.height-faceObject.bounds.origin.y; 

     [self addSubViewWithFrame:facePicture toRect:modifiedFaceBounds] ; 
    } 
} 

ответ

5

проблема в ориентации изображения.

Не помню, где я принял это, но это работает:

- (void) detectForFaces:(CGImageRef)facePicture orientation:(UIImageOrientation)orientation { 


    CIImage* image = [CIImage imageWithCGImage:facePicture]; 

    CIContext *context = [CIContext contextWithOptions:nil];     // 1 
    NSDictionary *opts = @{ CIDetectorAccuracy : CIDetectorAccuracyLow };  // 2 
    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace 
               context:context 
               options:opts];     // 3 

    int exifOrientation; 
    switch (orientation) { 
     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; 
    } 


    opts = @{ CIDetectorImageOrientation :[NSNumber numberWithInt:exifOrientation 
              ] }; 

    NSArray *features = [detector featuresInImage:image options:opts]; 

    if ([features count] > 0) { 
     CIFaceFeature *face = [features lastObject]; 
     NSLog(@"%@", NSStringFromCGRect(face.bounds)); 
    } 
} 


Как использовать:

UIImage *image = // some image here; 
[self detectForFaces:image.CGImage orientation:image.imageOrientation]; 
+0

Как я могу получить параметр UIImageOrientation? – mohamed

+0

@mohamed UIImage имеет свойство 'imageOrientation' – SAKrisT

+0

UIImage * image = info [UIImagePickerControllerOriginalImage]; [self detectForFaces: image.CGImage orientation: [image get]] это как я называю это правильно ??? и я не нашел свойство ??? – mohamed

2

небольшая коррекция здесь

- (void) detectForFaces:(UIImage *)facePicture orientation:(UIImageOrientation)orientation { 


CIImage* image = [CIImage imageWithCGImage:facePicture.CGImage]; 

CIContext *context = [CIContext contextWithOptions:nil];     // 1 
NSDictionary *opts = @{ CIDetectorAccuracy : CIDetectorAccuracyLow };  // 2 
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace 
              context:context 
              options:opts];     // 3 

int exifOrientation; 
switch (orientation) { 
    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; 
} 


opts = @{ CIDetectorImageOrientation :[NSNumber numberWithInt:exifOrientation 
             ] }; 

NSArray *features = [detector featuresInImage:image options:opts]; 

if ([features count] > 0) { 
    CIFaceFeature *face = [features lastObject]; 
    NSLog(@"%@", NSStringFromCGRect(face.bounds)); 
}} 

UIImage *image = // some image here; [self detectForFaces:image orientation:image.imageOrientation];

отправить только изображение не изображение.CGImage Это сработало для меня

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