曠視人臉識(shí)別

1、首先申請(qǐng)賬號(hào)下載SDK
https://faceid.com/faceopen/login
2、從后臺(tái)申請(qǐng)appkey

#define api_key @"B8n0Ey1jtG_rdcXPt1ixkh_hi8gUtIhH"
#define api_secret @"41Hj4-hl3swt66gpXor9IUwus6OBaDA8"

3、請(qǐng)求https://api.megvii.com/faceid/v3/sdk/get_biz_token獲取
這個(gè)函數(shù)的值initMGFaceIDLiveDetectManagerWithBizToken:????
4、請(qǐng)求https://api.megvii.com/faceid/v3/sdk/verify"獲取識(shí)別結(jié)果

附上代碼

- (void)viewDidLoad {
    [super viewDidLoad];
    [self requestData];
    UIButton* detectButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.view addSubview:detectButton];
    [detectButton setBounds:CGRectMake(0, 0, 100, 44)];
    [detectButton setCenter:self.view.center];
    [detectButton setTitle:@"Detect" forState:UIControlStateNormal];
    [detectButton setTitleColor:[UIColor whiteColor]
                       forState:UIControlStateNormal];
    [detectButton setTitleColor:[UIColor lightGrayColor]
                       forState:UIControlStateHighlighted];
    [detectButton setBackgroundColor:[UIColor blueColor]];
    [detectButton addTarget:self
                     action:@selector(startFaceIDLiveDetect:)
           forControlEvents:UIControlEventTouchUpInside];
}
//接口用于配置人臉比對(duì)的身份核實(shí)功能,支持有源比對(duì)(調(diào)用者提供姓名、身份證號(hào)、和待核實(shí)人臉圖)和無(wú)源比對(duì)(直接比對(duì)待核實(shí)人臉圖和參照人臉圖)??蛻敉ㄟ^(guò)服務(wù)器將本次活體相關(guān)的配置傳到FaceID服務(wù)器,在驗(yàn)證無(wú)誤后,返回本次業(yè)務(wù)的biz_token,用FaceID MegLiveStill SDK的初始化。
-(void)requestData{
    NSString* sign = [self getSignStr];
    NSString *url = @"https://api.megvii.com/faceid/v3/sdk/get_biz_token";
//    liveness_type  meglive:動(dòng)作活體   still:靜默活體
//  comparison_type 0:表示無(wú)源比對(duì) 1:表示有源比對(duì)

    //有源
//    UIImage *originImage = [UIImage imageNamed:@"mine"];
//    UIImage *scale = [self scaleImage:originImage toKb:100];
//    NSData *imagedata = UIImagePNGRepresentation(scale);
    
//        NSString *encodedImageStr = [imagedata base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    NSDictionary *parameters = @{@"sign":sign,@"sign_version":@"hmac_sha1",@"liveness_type":@"meglive",@"comparison_type":@"1",@"idcard_name":@"胡淑貞",@"idcard_number":@"362229199301111029"};//,@"image_ref1":imagedata
    //無(wú)源
//    NSDictionary *parameters = @{@"sign":sign,@"sign_version":@"hmac_sha1",@"liveness_type":@"meglive",@"comparison_type":@"0",@"uuid":@"胡淑貞",@"image_ref1":imagedata};

    [[BaseHttpRequest sharedInstance]sendPOSTHttpRequest:url parameters:parameters success:^(id dicData) {
        NSLog(@"數(shù)據(jù)%@",dicData);
        NSDictionary *dicDatas = [self dictionaryWithJsonString:dicData];
        self.biz_token = [dicDatas objectForKey:@"biz_token"];
        self.time_used = [dicDatas objectForKey:@"time_used"];
        self.request_id = [dicDatas objectForKey:@"request_id"];
    } error:^(NSString *errorInfo) {
        NSLog(@"%@",errorInfo);
    }];
    
}
//接口用于將FaceID MegLiveStill SDK 所獲得的數(shù)據(jù)進(jìn)行上傳,并獲取活體驗(yàn)證、人臉比對(duì)、攻擊防范等結(jié)果信息
-(void)deliverBackData{
    NSString* sign = [self getSignStr];
    NSString *url = @"https://api.megvii.com/faceid/v3/sdk/verify";
    NSString *encodedImageStr = [self.meglive_data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    NSDictionary *parameters = @{@"sign":sign,@"sign_version":@"hmac_sha1",@"biz_token":self.biz_token,@"meglive_data":encodedImageStr};
    
    [[BaseHttpRequest sharedInstance]sendPOSTHttpRequest:url parameters:parameters success:^(id dicData) {
        NSLog(@"上傳接口返回?cái)?shù)據(jù)%@",dicData);

        
    } error:^(NSString *errorInfo) {
        NSLog(@"上傳接口失敗%@",errorInfo);
    }];
    
}
-(void)shangchuanData{
    NSString* sign = [self getSignStr];
    NSDictionary * body = @{@"sign":sign,@"sign_version":@"hmac_sha1",@"biz_token":self.biz_token};
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer.timeoutInterval = 20;
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json", @"text/plain", @"text/html", @"text/javascript",@"image/jpeg",@"image/png",@"application/octet-stream", nil];
    manager.requestSerializer= [AFHTTPRequestSerializer serializer];
    manager.responseSerializer= [AFHTTPResponseSerializer serializer];
    NSString *url = @"https://api.megvii.com/faceid/v3/sdk/verify";
    [manager POST:url parameters:body constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        //把image  轉(zhuǎn)為data , POST上傳只能傳data
//        NSData *data = UIImagePNGRepresentation(image);
        //上傳的參數(shù)(上傳圖片,以文件流的格式)
        [formData appendPartWithFileData:self.meglive_data
                                    name:@"file"
                                fileName:@"mine.png"
                                mimeType:@"image/png"];
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
        NSLog(@"上傳成功%@",dic);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"上傳失敗%@",error);
        
    }];
    

}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

#pragma mark - Detect
- (void)startFaceIDLiveDetect:(UIButton *)sender {
    
    sender.userInteractionEnabled = NO;
    MGFaceIDLiveDetectError* error;
    MGFaceIDLiveDetectManager* liveDetectManager = [[MGFaceIDLiveDetectManager alloc] initMGFaceIDLiveDetectManagerWithBizToken:self.biz_token
                                                                                                                      extraData:@{} error:&error];
    if (error || !liveDetectManager) {
        sender.userInteractionEnabled = YES;
        return;
    }
    [liveDetectManager startMGFaceIDLiveDetectWithCurrentController:self
                                                           callback:^(MGFaceIDLiveDetectError *error, NSData *deltaData, NSString *bizTokenStr, NSDictionary *extraOutDataDict) {
                                                               self.meglive_data = deltaData;
                                                               NSLog(@"錯(cuò)誤信息%@=======數(shù)據(jù)%@============TTT?%@==========字典======%@",error,self.meglive_data,bizTokenStr,extraOutDataDict);
                                                               [self deliverBackData];
//                                                               [self shangchuanData];
                                                               sender.userInteractionEnabled = YES;
                                                           }];
}
- (NSString*)getSignStr {
    int validdurtion = 10000;
    NSDate* date = [NSDate dateWithTimeIntervalSinceNow:0];   //獲取當(dāng)前時(shí)間 0秒后的時(shí)間
    NSTimeInterval currenttime = [date timeIntervalSince1970];
    long int expiretime = currenttime + validdurtion;
    long random = labs(arc4random() % 100000000000);
    NSString* str = [NSString stringWithFormat:@"a=%@&b=%ld&c=%f&d=%ld" ,api_key,expiretime,currenttime,random];
    const char *cKey  = [api_secret cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [str cStringUsingEncoding:NSUTF8StringEncoding];
    
    char cHMAC[CC_SHA1_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    NSData *HMAC = [[NSData alloc]initWithBytes:cHMAC length:sizeof(cHMAC)];
    NSData* sign_raw_data = [str dataUsingEncoding:NSUTF8StringEncoding ];
    NSMutableData* data = [[NSMutableData alloc] initWithData:HMAC];
    [data appendData:sign_raw_data];
    NSString* sign = [data base64EncodedStringWithOptions:0];
    return sign;
}
-(NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString {
    
    if (jsonString == nil) {
        return nil;
    }
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *err;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
                                                        options:NSJSONReadingMutableContainers
                                                          error:&err];
    if(err) {
        return nil;
    }else {
        return dic;
    }
}
-(UIImage *)scaleImage:(UIImage *)image toKb:(NSInteger)kb{
    if (!image) {
        return image;
    }
    if (kb<1) {
        return image;
    }
    kb*=1024;
    CGFloat compression = 0.9f;
    CGFloat maxCompression = 0.1f;
    NSData *imageData = UIImageJPEGRepresentation(image, compression);
    while ([imageData length] > kb && compression > maxCompression) {
        compression -= 0.1;
        imageData = UIImageJPEGRepresentation(image, compression);
    }
    NSLog(@"當(dāng)前大小:%fkb",(float)[imageData length]/1024.0f);
    UIImage *compressedImage = [UIImage imageWithData:imageData];
    return compressedImage;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,781評(píng)論 25 709
  • 點(diǎn)擊查看原文 Web SDK 開(kāi)發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 14,284評(píng)論 0 15
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,915評(píng)論 2 59
  • 今天中午聽(tīng)了一個(gè)故事,分享給大家。這個(gè)故事來(lái)自于一個(gè)兒童教育機(jī)構(gòu)S.O.S的培訓(xùn)課程。 故事一開(kāi)場(chǎng),老師就說(shuō):我不...
    huifang963閱讀 558評(píng)論 0 0

友情鏈接更多精彩內(nèi)容