我收到图片视图
-(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] ;
}
}
答案 0 :(得分: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];
答案 1 :(得分: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];
仅发送图像而非image.CGImage 这对我有用