iOS腾讯云人脸识别

前言

工作需要做了一个简易的、通过API第三方人脸识别、人脸对比分析的App Demo,对比了一下各家提供的服务、SDK,最后选择了腾讯云的智能图像服务。
调用API的流程为:

1.鉴权签名 
2.调用人脸识别、人脸对比等API。

这里主要在iOS上模拟生成鉴权签名识别的流程,实际生产环境应该是服务器生成鉴权签名,APP调用接口识别。

鉴权签名

云端开通服务后的Key:

#define kAPPID @"your APPID"
#define kSecretId @"your SecretId"
#define kSecretKey @"your SecretKey"

拼接签名串:

- (NSString *)getSign{

    NSDate* date = [NSDate dateWithTimeIntervalSinceNow:0];//获取当前时间0秒后的时间
    NSDate* edate = [NSDate dateWithTimeIntervalSinceNow:60*60*24*30];//一个月
    NSTimeInterval time=[date timeIntervalSince1970];// *1000 是精确到毫秒,不乘就是精确到秒
    NSTimeInterval etime=[edate timeIntervalSince1970];// *1000 是精确到毫秒,不乘就是精确到秒
    NSString *timeString = [NSString stringWithFormat:@"%.0f", time];
    NSString *etimeString = [NSString stringWithFormat:@"%.0f", etime];
    int ranInt = arc4random() %100000;
    NSString *ranString = [NSString stringWithFormat:@"%d", ranInt];
    NSString *abketr = [NSString stringWithFormat:@"a=%@&b=%@&k=%@&e=%@&t=%@&r=%@",
                        kAPPID,
                        @"tencentyun",
                        kSecretId,
                        etimeString,
                        timeString,
                        ranString
                        ];
    NSString *signString = [self HmacSha1:kSecretKey data:abketr];

    return signString;
}

HMAC-SHA1 算法加密,注意最后需要拼接签名串到NSMutableData末尾:

//HmacSHA1加密;
- (NSString *)HmacSha1:(NSString *)key data:(NSString *)data
{
    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [data cStringUsingEncoding:NSASCIIStringEncoding];

    unsigned 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 *dData = [[NSData alloc] initWithBytes:cData length:strlen(cData)];

    NSMutableData *mData = [[NSMutableData alloc] init];

    [mData appendData:HMAC];
    [mData appendData:dData];

    NSString *hash = [mData base64EncodedStringWithOptions:0];//将加密结果进行一次BASE64编码。
    return hash;
}

如果是SHA256,可以:

unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

人脸检测

通过生成的签名添加到请求头authorization里面,请求如下:

NSString *apiString = [NSString stringWithFormat:@"%@%@",@"https://recognition.image.myqcloud.com",@"/face/detect"];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
[manager.requestSerializer setValue:@"recognition.image.myqcloud.com" forHTTPHeaderField:@"host"];
[manager.requestSerializer setValue:[self getSign] forHTTPHeaderField:@"authorization"];
[manager POST:apiString parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    [formData appendPartWithFileData:imageData name:@"image" fileName:@"image.jpg" mimeType:@"image/jpg"];
} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    block(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    block(nil);
}];

其他接口可以查看:
1.腾讯云鉴权签名
2.人脸识别接口文档