BaiduAIface
This commit is contained in:
commit
1e3d0dc2eb
188
BaiduAIface.c
Normal file
188
BaiduAIface.c
Normal file
@ -0,0 +1,188 @@
|
||||
#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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user