一、准备工作:
1、 购买平台人脸识别次数
2、 实现人脸识别所需参数(以图片为 base64 流为例):
① 接口地址:https://netocr.com/api/faceliu.do
② 调用方法:post
接口接收参数(必传参数):
① 需要识别的两张图片的 base64 流(字符型)
② 用户 key 和 secret 值,前往个人中心查看用户 OCR Key 和 OCR Secret 值(字符型)
③ 指定识别类型为 21,人脸识别(整型)
④ 指定返回格式(字符型)
3、 需要进行人脸识别的图片:
二、代码:
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define true 1
#define false 0
typedef unsigned int bool;
char *getPicBase64FromFile(char *filePath) //获取图片的 base64流函数
{
int fd;
int filelen;
char cmd[128];
char *bufPic;
sprintf(cmd,"base64 %s > tmpFile",filePath); //拼接系统调用字符串
system(cmd); //系统调用获取图片 base64流
fd = open("./tmpFile",O_RDWR); //存放图片 base64 流的临时文件
filelen = lseek(fd,0,SEEK_END); //计算文件字符数
lseek(fd,0,SEEK_SET); //指针回到文件头部
bufPic = (char *)malloc(filelen+2); //创建空间存放图片 base64流
memset(bufPic,'\0',filelen+2); //初始化空间
read(fd,bufPic,filelen); //文件内容读取到空间
close(fd); //关闭文件描述符
system("rm -f tmpFile"); //忽略提示关闭临时文件
return bufPic; //返回图片 base64流
}
size_t readData(void *ptr, size_t size, size_t nmemb, void *stream) //回调函数
{
char buf[1024] = {'\0'};
strncpy(buf,ptr,1024);
printf("%s\n",buf); //打印识别结果
}
bool postUrl()
{
CURL *curl;
CURLcode res;
char *key = "xxxxxxxxxxxxxxxxxxxxxxxx"; //用户 OCR Key 值
char *secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //用户 OCR Secret 值
int typeId = 21; //识别类型 21
char *format = "xml"; //设置返回格式 "xml"
char *postString;
char *bufPic1 = getPicBase64FromFile("./face1.jpg"); //获取图片 1 的 base64流
char *bufPic2 = getPicBase64FromFile("./face2.jpg"); //获取图片 2 的 base64流
int len = strlen(key)+strlen(secret)+strlen(bufPic1)+strlen(bufPic2)+124; //计算所需传参字符串大小
postString = (char *)malloc(len); //为传参字符串创建空间
memset(postString,'\0',len); //初始化传参字符串空间
sprintf(postString,"&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s",
bufPic1,bufPic2,key,secret,typeId,format); //拼接平台要求的传参字符串
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString); //指定 post 内容
curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do"); //指定 url
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData); //接收到数据,调用回调函数
res = curl_easy_perform(curl);
curl_easy_cleanup(curl); //清除 curl
}
return true;
}
void main(void)
{
postUrl(); // post 请求函数
}
三、编译
export LD_LIBRARY_PATH=$PWD/curl-7.71.1/_install/lib/
gcc demo.c -o demo -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl
四、识别完成
结果为“是”结果为“否”