树莓派4B开发笔记(五)c语言https访问百度AI人脸识别接口之c语言编程

本文介绍了如何使用C语言通过Baidu API进行OAuth客户端凭证获取,并实现人脸比对功能。关键步骤包括access_token的获取和faceMatch接口的调用,涉及curl和cJSON库的应用。
摘要由CSDN通过智能技术生成

一、修改部分

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值