从相机面部检测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] 

这是我用来检测脸部的function

 -(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] ; } } 

问题是在图像方向。

不记得我把这个地方,但它的工作原理:

 - (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]; 

这里小纠错

 - (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];

只发送图像不image.CGImage这为我工作