调用百度人脸识别API进行人脸对比 C语言

百度人脸识别api使用是免费的,有人脸对比、人脸搜索、人脸检测与属性分析三个功能,本文写的是人脸对比。这里给出百度人脸对比api的技术文档,请点击网址https://cloud.baidu.com/doc/FACE/s/Lk37c1tpf
另外需要注册百度智能云,获取API KeySecret Key,并用此获取accesss_token,方法是:将上述两个值填在下面网址的相应位置上,然后将这个网址输在浏览器中https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【API Key】&client_secret=【Seceret Key】。返回的是一串数据,将accesss_token的数据提出来
我们大概整理整理思路:
1、安装curl,本文不对其安装进行描述,此处转载一篇文章https://blog.csdn.net/ixiaoc/article/details/92764552
安装后在使用时可能会遇到curl/curl.h文件找不到的问题,这些问题在网上都能找到解决办法。再找三张人物照,两张相同的,一张不同
2、同时读取两张图片数据并进行base64编码
3、完善api并通过curl将数据发送,等待结果返回
4、换一张图片在进行,方法同3,等待数据返回

例程

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>



const char * base64char = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

char *base64_encode(char * bindata, char * base64, int binlength)//base64编码函数
{
	int i, j;
	unsigned char current;

	for (i = 0, j = 0; i < binlength; i += 3)
	{
		current = (bindata[i] >> 2);
		current &= (unsigned char)0x3F;
		base64[j++] = base64char[(int)current];

		current = ((unsigned char)(bindata[i] << 4)) & ((unsigned char)0x30);
		if (i + 1 >= binlength)
		{
			base64[j++] = base64char[(int)current];
			base64[j++] = '=';
			base64[j++] = '=';
			break;
		}
		current |= ((unsigned char)(bindata[i + 1] >> 4)) & ((unsigned char)0x0F);
		base64[j++] = base64char[(int)current];

		current = ((unsigned char)(bindata[i + 1] << 2)) & ((unsigned char)0x3C);
		if (i + 2 >= binlength)
		{
			base64[j++] = base64char[(int)current];
			base64[j++] = '=';
			break;
		}
		current |= ((unsigned char)(bindata[i + 2] >> 6)) & ((unsigned char)0x03);
		base64[j++] = base64char[(int)current];

		current = ((unsigned char)bindata[i + 2]) & ((unsigned char)0x3F);
		base64[j++] = base64char[(int)current];
	}
	base64[j] = '\0';
	return base64;
}

int photo_size(char *path)//获取图片大小
{
	FILE *fp = NULL;
	fp = fopen(path, "rb");
	if (NULL == fp)
	{
		printf("open_error");
		exit(1);
	}

	fseek(fp, 0L, SEEK_END);//文件指针置尾
	int size = ftell(fp);//计算大小
	fclose(fp);
	return size;
}

int photo_base64(char *path1,char *path2, char *photo_base64_data1,char *photo_base64_data2)//对图片进行base64编码
{
	FILE *fp1 = NULL,*fp2=NULL;
	char *buffer1,*buffer2;
	size_t result;
	int length;
	//打开图片
	int size1=photo_size(path1);
	fp1 = fopen(path1, "rb");
	if (NULL == fp1)
	{
		printf("open_error");
		exit(1);
	}
	int size2=photo_size(path2);
	fp2 = fopen(path2, "rb");
	if (NULL == fp2)
	{
		printf("open_error");
		exit(1);
	}

	//分配内存存储整个图片
	buffer1 = (char *)malloc(size1);
	if (NULL == buffer1)
	{
		printf("memory_error");
		exit(2);
	}
	buffer2 = (char *)malloc(size2);
	if (NULL == buffer2)
	{
		printf("memory_error");
		exit(2);
	}

	//将图片拷贝到buffer
	result = fread(buffer1, 1, size1, fp1);
	if (result != size1)
	{
		printf("reading_error");
		exit(3);
	}
	fclose(fp1);
	result = fread(buffer2, 1, size2, fp2);
	if (result != size2)
	{
		printf("reading_error");
		exit(3);
	}
	fclose(fp2);

	//base64编码
	base64_encode(buffer1, photo_base64_data1, size1);
	length = strlen(photo_base64_data1);
	free(buffer1);
	
	base64_encode(buffer2, photo_base64_data2, size2);
	length = length+strlen(photo_base64_data2);
	free(buffer2);
	return length;
}

//数据发送
int faceMatch(char *request_url,char *access_token,int *length,char *photo_base64_data1,char *photo_base64_data2) 
{
	char *mycurl=(char *)malloc(500);
	memset(mycurl,0,500);
	sprintf(mycurl,"%s?access_token=%s",request_url,access_token);//拼接网址与access_token
	
	CURL *curl = NULL;
	CURLcode result_code;
	int is_success;
	curl = curl_easy_init();
	char *buffer=(char *)malloc(*length+400);
	memset(buffer,0,*length+400);
	if (curl) 
	{
		curl_easy_setopt(curl, CURLOPT_URL, mycurl);
		curl_easy_setopt(curl, CURLOPT_POST, 1);
		struct curl_slist *headers = NULL;
		headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");
		
		//完善api接口并发送
		sprintf(buffer,"[{\"image\": \"%s\", \"image_type\": \"BASE64\", \"face_type\": \"LIVE\", \"quality_control\": \"LOW\"},{\"image\": \"%s\", \"image_type\": \"BASE64\", \"face_type\": \"IDCARD\", \"quality_control\": \"LOW\"}]",photo_base64_data1,photo_base64_data2);
		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, buffer);
		result_code = curl_easy_perform(curl);
		if (result_code != CURLE_OK) 
		{
			fprintf(stderr, "curl_easy_perform() failed: %s\n",
			curl_easy_strerror(result_code));
			is_success = 1;
			return is_success;
		}
		curl_easy_cleanup(curl);
		is_success = 0;
		} 
		else 
		{
		fprintf(stderr, "curl_easy_init() failed.");
		is_success = 1;
	}
	free(mycurl);
	free(buffer);
	printf("\n");
	return is_success;
}

int main()
{
	char *access_token = "24.ca79305593364a2bf623b71c674d687d.2592000.1607757515.282335-22953432";
	char *request_url = "https://aip.baidubce.com/rest/2.0/face/v3/match";
	char path1[10] = "55.png";
	char path2[10] = "11.png";
	char *photo_base64_data1 = NULL,*photo_base64_data2=NULL;//存储图片经base64编码后的数据

	int size1 = photo_size(path1);
	int size2 = photo_size(path2);
	photo_base64_data1 = (char *)malloc((size1 / 3 + 1) * 4);
	if (NULL == photo_base64_data1)
	{
		printf("memory_error");
		exit(2);
	}
	photo_base64_data2 = (char *)malloc((size2 / 3 + 1) * 4);
	if (NULL == photo_base64_data2)
	{
		printf("memory_error");
		exit(2);
	}
	
	int length = photo_base64(path1,path2, photo_base64_data1,photo_base64_data2);
	faceMatch(request_url,access_token,&length,photo_base64_data1,photo_base64_data2);
	free(photo_base64_data1);
	free(photo_base64_data2);
	return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值