BaiduAIFaceComparison/BaiduAIface.c
2021-10-28 11:32:59 +08:00

188 lines
6.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
#include "cJSON.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
size_t access_token_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
char *buf = (char *)malloc(size * nmemb + 8 );
memset(buf,'\0', size * nmemb + 8);
strncpy(buf, ptr, size * nmemb);
cJSON *json= cJSON_Parse(buf);
char *access_token_result = (char *)stream;
strncpy(access_token_result, cJSON_GetObjectItem(json, "access_token")->valuestring, 128);
//printf("stream:%s\n",(char *)stream);
cJSON_Delete(json);
free(buf);
return size * nmemb;
}
int post_access_token(char *access_token)
{
CURL *curl;
CURLcode result_code;
int error_code = 0;
char url[256] = {0};
char access_token_url[] = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials";
char AK[] = "vEcmEHNhIBfmA5qGs5TtcA8R";
char SK[] = "G4fk4L8p9QQGMqui4MkMWZ0fGkwWQoKE";
char access_token_result[128] = {0};
curl = curl_easy_init();
if (curl) {
//std::string url = access_token_url + "&client_id=" + AK + "&client_secret=" + SK;
sprintf(url,"%s&client_id=%s&client_secret=%s",access_token_url,AK,SK);
//printf("url: %s\n",url );
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, access_token_result);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, access_token_callback);
result_code = curl_easy_perform(curl);
if (result_code != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(result_code));
return 1;
}
//printf("access_token_result:%s\n",access_token_result);
strcpy(access_token, access_token_result);
curl_easy_cleanup(curl);
error_code = 0;
} else {
fprintf(stderr, "curl_easy_init() failed.");
error_code = 1;
}
return error_code;
}
size_t faceMatch_callback(void *ptr, size_t size, size_t nmemb, void *stream) {
// 获取到的body存放在ptr中先将其转换为string格式
char *buf = (char *)malloc(size * nmemb + 8 );
memset(buf,'\0',size * nmemb + 8);
strncpy(buf, ptr, size * nmemb);
cJSON *json = cJSON_Parse(buf);
printf("data:%s\n", cJSON_Print(json));
if(strstr(cJSON_Print(json),"SUCCESS") ==NULL) {
*((double *)stream) = 0;
} else {
cJSON *result = cJSON_GetObjectItem(json, "result");
//printf("data:%s\n",cJSON_Print(result));
double *faceMatch_result = (double *)stream;
*faceMatch_result = cJSON_GetObjectItem(result, "score")->valuedouble;
//printf("stream:%f\n",*faceMatch_result);
}
cJSON_Delete(json);
free(buf);
return size * nmemb;
}
/**
* 人脸对比调用成功返回0发生错误返回其他错误码
*/
int post_faceMatch(double *faceMatch, char *access_token, char *file1, char *file2)
{
//std::string url = request_url + "?access_token=" + access_token;
char url[256] = {0};
char request_url[] = "https://aip.baidubce.com/rest/2.0/face/v3/match";
sprintf(url,"%s?access_token=%s", request_url, access_token);
char *getbase64(char *photoname);
char image[] = "\"image\": ";
char image_type[] = "\"image_type\": \"BASE64\"";
char *image1_base64 = getbase64(file1);
char *image2_base64 = getbase64(file2);
char *params = (char *)malloc(strlen(image1_base64) + strlen(image2_base64) + 2 * strlen(image) + 2 * strlen(image_type) + 128 );
sprintf(params, "[{%s\"%s\", %s}, {%s\"%s\", %s}]", image, image1_base64, image_type, image, image2_base64, image_type);
cJSON *json = cJSON_Parse(params);
//printf("%s\n",cJSON_Print(json));
//printf("param : %s\n",params);
CURL *curl = NULL;
CURLcode result_code;
int is_success;
curl = curl_easy_init();
double faceMatch_result;
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POST, 1);
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
//curl_easy_setopt(curl, CURLOPT_POSTFIELDS, params);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, cJSON_Print(json));
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &faceMatch_result);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, faceMatch_callback);
result_code = curl_easy_perform(curl);
free(image1_base64);
free(image2_base64);
free(params);
cJSON_Delete(json);
if (result_code != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(result_code));
is_success = 1;
return is_success;
}
*faceMatch = faceMatch_result;
curl_easy_cleanup(curl);
is_success = 0;
} else {
fprintf(stderr, "curl_easy_init() failed.");
is_success = 1;
}
return is_success;
}
char *getbase64(char *photoname)
{
char order[128] = {0};
char file[32] = {0};
char *base64 = NULL;
sprintf(order,"base64 %s > %s_base64", photoname, photoname);
system(order);
sprintf(file,"%s_base64", photoname);
int fd = open(file, O_RDWR);
int len = lseek(fd,0, SEEK_END);
lseek(fd, 0, SEEK_SET);
base64 = (char *)malloc(len+1);
read(fd, base64, len);
base64[len] = '\0';
//printf("%d\n",strlen(base64));
return base64;
}
int main(int argc, char *argv[], char **envp)
{
if (argc != 3) {
printf("%s file1 file2\n", argv[0]);
exit(1);
}
char access_token[128];
double faceMatch = 0; // 面部匹配
post_access_token(access_token);
//printf("access_token: %s\n", access_token);
post_faceMatch(&faceMatch, access_token, argv[1], argv[2]);
//printf("faceMatch : %f \n",faceMatch);
if(faceMatch > 90) {
printf("相似\n");
} else {
printf("不相似\n");
}
return 0;
}