iOS--开发技巧

人脸识别

2016-04-06  本文已影响175人  帅哥_刷哥

1.介绍

识别图片上的脸部.
使用face++来做人脸识别(百度搜索face++即可)。
face++的文档很详细,所以根据face++的案例去做就ok了。

2.使用

1.到face++中注册账号,并登陆
2.在我的应用中创建一个新的应用
3.下载SDK
4.引入项目-使用ARC的即可.
5.在AppDelegate中的application:didFinishLaunchingWithOptions:进行注册.
6.在AppDelegate中的application:didFinishLaunchingWithOptions:打开调试模式
7.获得图片
8.调用face++API,解析图片,查看是否有人脸
9.对脸部位置进行显示

3.注册代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //  注册AppKey
    [FaceppAPI initWithApiKey:@"5ec524794e29cb7c7f4d1ba38f914e82" andApiSecret:@"1m0JIbSW8vwGUn79d7EMHtO2_ZwSecaP"
                    andRegion:APIServerRegionCN];
    //  打开调试模式,如果是调试模式,会打印一些日志信息,如果上线要关闭它.
    [FaceppAPI setDebugMode:YES];
    return YES;
}

4.识别人脸代码

- (void) detactImage:(UIImage *) image
{
    //  修正图片的方向
    image = [self fixOrientation:image];

    //  压缩质量 0 - 1 值
    NSData *imageData = UIImageJPEGRepresentation(image, 0.5);
    //  调用人脸识别Api,获取人脸识别信息
    FaceppResult *faceRs = [[FaceppAPI detection] detectWithURL:nil orImageData:imageData];
    
    if (!faceRs.success) {
        NSLog(@"人脸识别失败:%@",faceRs.error);
        return;
    }
    
    //  获取识别到人脸
    NSArray *faces = faceRs.content[@"face"];
    if (faces.count == 0) {
        NSLog(@"没有脸");
        return;
    }
    //  遍历人脸数据
    for (NSDictionary *face in faces) {
        
        NSNumber *age = face[@"attribute"][@"age"][@"value"];
        NSNumber *gender = face[@"attribute"][@"gender"][@"value"];
        NSNumber *race = face[@"attribute"][@"race"][@"value"];
        NSNumber *smile = face[@"attribute"][@"smiling"][@"value"];
        self.title = [NSString stringWithFormat:@"%@,%@,%@,%@",age,gender,race,smile];
        
        //      获取脸的中心点
        CGFloat centerX = [face[@"position"][@"center"][@"x"] doubleValue];
        CGFloat centerY = [face[@"position"][@"center"][@"y"] doubleValue];
        
        //      脸的宽和高
        CGFloat width = [face[@"position"][@"width"] doubleValue];
        CGFloat height = [face[@"position"][@"height"] doubleValue];
        
        //      计算左上角的位置
        CGFloat faceX = centerX - width * 0.5;
        CGFloat faceY = centerY - height * 0.5;
        
        //      上面数据都是百分比数据,需要还原为真实的大小
        CGFloat scaleX = image.size.width / 100;
        CGFloat scaleY = image.size.height / 100;
        
        faceX *= scaleX;
        width *= scaleX;
        faceY *= scaleY;
        height *= scaleY;
        
        //      1. 开启图片上下文
        UIGraphicsBeginImageContext(image.size);
        //      2. 把图片回到上面
        [image drawAsPatternInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
        //      3. 绘制矩形框
        //      获取当前图形的上下文
        CGContextRef context = UIGraphicsGetCurrentContext();
        //      设置颜色
        [[UIColor greenColor] set];
        
        //      绘制矩形
        CGContextAddRect(context, CGRectMake(faceX, faceY, width, height));
        //      渲染(空心)
        CGContextStrokePath(context);
        //      从上下文中获取图片
        image = UIGraphicsGetImageFromCurrentImageContext();
        
        //      关闭图形上下文
        UIGraphicsEndImageContext();
    }
    
    self.imageView.image = image;
}

// 旋转图片的方向
- (UIImage *)fixOrientation:(UIImage *)aImage {
    
    if (aImage.imageOrientation == UIImageOrientationUp)
        return aImage;
    
    CGAffineTransform transform = CGAffineTransformIdentity;
    
    switch (aImage.imageOrientation) {
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;
            
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
            transform = CGAffineTransformRotate(transform, M_PI_2);
            break;
            
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
            transform = CGAffineTransformRotate(transform, -M_PI_2);
            break;
        default:
            break;
    }
    
    switch (aImage.imageOrientation) {
        case UIImageOrientationUpMirrored:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
            
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
        default:
            break;
    }
    
    CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
                                             CGImageGetBitsPerComponent(aImage.CGImage), 0,
                                             CGImageGetColorSpace(aImage.CGImage),
                                             CGImageGetBitmapInfo(aImage.CGImage));
    CGContextConcatCTM(ctx, transform);
    switch (aImage.imageOrientation) {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
            break;
            
        default:
            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
            break;
    }
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
    UIImage *img = [UIImage imageWithCGImage:cgimg];
    CGContextRelease(ctx);
    CGImageRelease(cgimg);
    return img;
}
上一篇下一篇

猜你喜欢

热点阅读