百度人脸识别api使用是免费的,有人脸对比、人脸搜索、人脸检测与属性分析三个功能,本文写的是人脸对比。这里给出百度人脸对比api的技术文档,请点击网址https://cloud.baidu.com/doc/FACE/s/Lk37c1tpf
另外需要注册百度智能云,获取API Key和Secret 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;
}