一、前言
上一篇文章我们调用 libcurl 库去访问了百度,访问的是http协议的百度云主页。那么现在我们要基于翔云人工智能平台来实现人脸识别,具体的操作大概就是我们在linux下调用libcurl库去访问 翔云人工智能平台 ,然后实现我们想要的两张人脸图片的识别结果这样一个功能。但是翔云人工智能平台的协议是https的协议,这是我们的libcurl库需要支持https协议的话,还需要装上openssl这个库,装好之后我们再重新安装libcurl库并且支持ssl这个库。
二、编译openssl支持libcurl的https访问
1.下载openssl库步骤:
1. wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz //下载
2. openssl下载途径: 官网下载地址
3. tar xvf openssl-1.1.1a.tar.gz //解压
4. ./config //配置在系统的默认位置,省的我们调库的时候再去找库的位置
5. make //编译
6. sudo make install //最后一步安装完成
我的是直接在官网下载在拷贝到开发板上:
(二)输入指令进行解压
tar xvf openssl-1.1.1l.tar.gz
(三)配置,编译,安装openssl库
①:vi README 打开安装指南
②:vi INSTALL 打开安装指南
③:配置openssl
./config
④:make 编译openssl库
make
⑤:sudo make install 安装自动会默认生成 ./configure --->目录下(/usr/local/)
sudo make install
⑥:查看安装结果(成功安装)
三、重新配置libcurl库
回到curl-7.71.1文件下,输入指令:
提示:要从上一个openssl-1.1.1a文件 回到curl-7.71.1文件下
./configure --prefix=$PWD/_install --with-ssl
make
make install
完成,这样我们调用libcurl库去访问https协议的网址就不会出错了。
四、编写人脸识别代码
1、注册一个翔云人工智能开放平台的账号,然后购买 人脸识 别 的产品,怎么注册和购买产品这里就不多说啦,大家可以去翔云网站了解哈。
翔云人工智能开放平台官网: 人脸识别
(1)系统指令将图片转为base64编码数据---->封装接口API函数
(2)Post请求打通与翔云平台的路障
2、新建一个test2.c文件,编写人脸识别代码
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>
#define true 1
#define false 0
typedef unsigned int bool;
size_t readData(void *ptr,size_t size,size_t nmemb,void *stream)
{
char buf[1024] = {'\0'};
strncpy(buf,ptr,1024);
printf("====================================get Data===================================\n");
printf("%s\n",buf);
}
bool postUrl()
{
CURL *curl;
CURLcode res;
char *postString;
char img1[12];
char img2[12];
char *key = "这块内容请自行购买翔云人工智能平台的产品信息填写";
char *secret = "这块内容请自行购买翔云人工智能平台的产品信息填写";
int typeId = 21;
char *format = "xml";
postString = (char *)malloc(strlen(key)+strlen(secret)+2048);
sprintf(postString,"img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s",
"","",key,secret,21,format);
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
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); //将返回的http头输出到fp指向的文件
res = curl_easy_perform(curl);
printf("OK:%d\n",res);
curl_easy_cleanup(curl);
}
return true;
}
int main(void)
{
postUrl();
}
gcc demo2.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl
五、编程实现人脸识别第二次加入图片base64编码
提示: jpg格式的图片是压缩过的bmp格式的图片
因为我们调库去访问翔云人工智能平台实现人脸识别的时候,人家要求上传的图片要求是base64流的图片,所以我们要把上传识别的照片转化成base64流的格式。
1、什么是base64?
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。
因为我们调库去访问翔云人工智能平台实现人脸识别的时候,人家要求上传的图片要求是base64流的图片,所以我们要把上传识别的照片转化成base64流的格式。
2、编写代码前,先下载两张jpg格式的图片,放在和人脸识别代码同一个目录下,方便一会儿使用
3、编写人脸识别代码
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define true 1
#define false 0
typedef unsigned int bool;
char buf[10240] = {'\0'};
size_t readData(void *ptr,size_t size,size_t nmemb,void *stream)
{
strncpy(buf,ptr,1024);
}
char* getPicBase64FromFile(char *filePath)
{
char *bufPic;
char cmd[128] = {'\0'};
sprintf(cmd,"base64 %s > tmpFile",filePath);
system(cmd);
int fd = open("./tmpFile",O_RDWR);
int filelen = lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);
bufPic =(char *)malloc(filelen+2);
memset(bufPic,0,filelen+2);
read(fd,bufPic,filelen);
close(fd);
system("rm -f tmpFile");
return bufPic;
}
bool postUrl()
{
CURL *curl;
CURLcode res;
char *postString;
char *key = "这块内容请自行购买翔云人工智能平台的产品信息填写";
char *secret = "这块内容请自行购买翔云人工智能平台的产品信息填写";
int typeId = 21;
char *format = "xml";
char *bufPic1 = getPicBase64FromFile("./11.jpg");
char *bufPic2 = getPicBase64FromFile("./22.jpg");
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,21,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); //将返回的http头输出到fp指向的文件
res = curl_easy_perform(curl);
printf("OK:%d\n",res);
if(strstr(buf,"是") != NULL){
printf("同一个人\n");
}else{
printf("不是同一个\n");
}
curl_easy_cleanup(curl);
}
return true;
}
int main(void)
{
postUrl();
}
4、进行编译:
gcc test3.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl
5、执行结果: ./a.out
温馨提示:
因为我上述的代码中判断,如果两张照片是类似的就打印: 同一个人,如过两张照片差距较大,就打印: 不是同一个人,我放的是两张类似的照片,所以就打印了: 同一个人
六、总结
1、我们是通过调libcurl库去访问翔云人工智能平台让平台来帮我们实现人脸识别和车牌识别的。所以要根据平台API的要求我们要上传哪些参数,然后利用我们调的libcurl库的函数帮我们访问上传这些参数,然后返回我们想要的结果。
2、所谓库就是别人已经封装好了的一些可执行程序,我们使用的时候只要去阅读库的使用说明来使用就好了。大致都是用到库的一些功能函数来实现我们想要的功能。像之前学到的树莓派的lirinbgPi库一样,它也有很多函数。