commit 8944030830ca2506f198b31046e2fc7f80ee0f1c Author: aixiao Date: Fri Nov 5 18:00:13 2021 +0800 Baidu AI Face Detection diff --git a/BaiduAIFaceDetection b/BaiduAIFaceDetection new file mode 100644 index 0000000..32b2b2f Binary files /dev/null and b/BaiduAIFaceDetection differ 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; +}