From 1e3d0dc2eb6abf71b785645e53c436d6a72669a6 Mon Sep 17 00:00:00 2001 From: aixiao Date: Thu, 28 Oct 2021 11:32:59 +0800 Subject: [PATCH] BaiduAIface --- BaiduAIface.c | 188 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 BaiduAIface.c diff --git a/BaiduAIface.c b/BaiduAIface.c new file mode 100644 index 0000000..e1463ee --- /dev/null +++ b/BaiduAIface.c @@ -0,0 +1,188 @@ +#include +#include +#include +#include +#include "cJSON.h" +#include +#include +#include +#include + +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; +} \ No newline at end of file