BaiduAIFaceComparison/BaiduAIFaceComparison.c
2021-11-05 17:53:46 +08:00

190 lines
6.1 KiB
C
Raw Permalink 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;
}
int post_faceMatch(double *faceMatch, char *access_token, char *file1, char *file2)
{
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 && argv[1] != NULL && argv[2] != NULL) {
;
} else {
printf("%s image_file image_file\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");
return 1;
} else {
printf("不相似\n");
return 0;
}
return 0;
}