1. 程式人生 > 其它 >樹莓派4B開發筆記(五)c語言https訪問百度AI人臉識別介面之c語言程式設計

樹莓派4B開發筆記(五)c語言https訪問百度AI人臉識別介面之c語言程式設計

技術標籤:樹莓派4B人臉識別linux

一、修改部分

1.1

int post_access_token(char *access_token)

這個函式裡面的 AK 和 SK
在這裡插入圖片描述

2.2

int post_faceMatch(double *faceMatch, char *access_token)

這個函式裡面的getbase64()函式的引數(對應圖片名)
在這裡插入圖片描述

二、程式

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
#include
<cjson/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[] = ""; char SK[] = ""; 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; } /** * 人臉對比 * @return 呼叫成功返回0,發生錯誤返回其他錯誤碼 */ int post_faceMatch(double *faceMatch, char *access_token) { //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("l1.jpg"); char *image2_base64 = getbase64("l2.jpg"); 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 () { char access_token[128]; double faceMatch = 0; post_access_token(access_token); //printf("access_token: %s\n", access_token); post_faceMatch(&faceMatch,access_token); //printf("faceMatch : %f \n",faceMatch); if(faceMatch > 90){ printf("1"); }else{ printf("0"); } return 0; }

三、編譯

gcc xxxx.c -lcurl -lcjson