From 8944030830ca2506f198b31046e2fc7f80ee0f1c Mon Sep 17 00:00:00 2001 From: aixiao Date: Fri, 5 Nov 2021 18:00:13 +0800 Subject: [PATCH] Baidu AI Face Detection --- BaiduAIFaceDetection | Bin 0 -> 59744 bytes BaiduAIFaceDetection.c | 182 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 BaiduAIFaceDetection create mode 100644 BaiduAIFaceDetection.c diff --git a/BaiduAIFaceDetection b/BaiduAIFaceDetection new file mode 100644 index 0000000000000000000000000000000000000000..32b2b2fb7119e3812c0b5464e9ff9ff2abc30690 GIT binary patch literal 59744 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%0AL3a9>Zfkk^+MKZKckVuBIm_@()Mjw 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 Ct?YvU literal 0 HcmV?d00001 diff --git a/BaiduAIFaceDetection.c b/BaiduAIFaceDetection.c new file mode 100644 index 0000000..bf6849a --- /dev/null +++ b/BaiduAIFaceDetection.c @@ -0,0 +1,182 @@ +#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; +} + +int post_faceMatch(double *faceMatch, char *access_token, char *file) +{ + char url[256] = { 0 }; + //char request_url[] = "https://aip.baidubce.com/rest/2.0/face/v3/match"; + char request_url[] = "https://aip.baidubce.com/rest/2.0/face/v3/detect"; + sprintf(url, "%s?access_token=%s", request_url, access_token); + + char *getbase64(char *photoname); + char image[] = "\"image\": "; + char image_type[] = "\"image_type\": \"BASE64\""; + char face_field[] = "\"face_field\": \"facetype,gender,age,beauty\""; + + char *image1_base64 = getbase64(file); + char *params = (char *)malloc(strlen(image1_base64) + strlen(image) + strlen(image_type) + 1024); + + sprintf(params, "{%s\"%s\", %s, %s}", image, image1_base64, image_type, face_field); + + 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(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'; + + return base64; +} + +int main(int argc, char *argv[], char **envp) +{ +/* + if (argc == 3 && argv[1] != NULL && argv[2] != NULL) { + ; + } else { + printf("%s image_file image_file\n", argv[0]); + exit(1); + } +*/ + char access_token[270]; + double faceMatch = 0; // 面部匹配 + + post_access_token(access_token); + + post_faceMatch(&faceMatch, access_token, argv[1]); + + return 0; +}