Linux基础之Libcurl库之HTTPS协议实现人脸识别

目录

  • 一、前言
  • 二、编译openssl支持libcurl的https访问
  • 三、base64编码
  • 四、封装base64编码函数并人脸识别成功
  • 五、车牌识别
  • 六、总结

一、前言

上一篇文章我们调用libcurl库去访问了百度,访问的是http协议的百度云主页。那么现在我们要基于翔云人工智能平台来实现人脸识别,具体的操作大概就是我们在linux下调用libcurl库去访问翔云人工智能平台,然后实现我们想要的两张人脸图片的识别结果这样一个功能。但是翔云人工智能平台的协议是https的协议,这是我们的libcurl库需要支持https协议的话,还需要装上openssl这个库,装好之后我们再重新安装libcurl库并且支持ssl这个库。

二、编译openssl支持libcurl的https访问

1.下载openssl库:

wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz //下载

tar xvf openssl-1.1.1a.tar.gz //解压

./config //配置在系统的默认位置,省的我们调库的时候再去找库的位置

make //编译

sudo make install //最后一步安装完成

Linux基础之Libcurl库之HTTPS协议实现人脸识别_第1张图片
2.编译 libcurl库加上openssl 库:

./configure --prefix=$PWD/_install --with-ssl
make
make install

完成,这样我们调用libcurl库去访问https协议的网址就不会出错了。

三、base64编码

1.
Linux基础之Libcurl库之HTTPS协议实现人脸识别_第2张图片
因为我们调库去访问翔云人工智能平台实现人脸识别的时候,人家要求上传的图片要求是base64流的图片,所以我们要把上传识别的照片转化成base64流的格式。

2.什么是base64?

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。

Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。

四、封装base64编码函数并人脸识别成功

1.先把要是别的照片传到linux环境下:
Linux基础之Libcurl库之HTTPS协议实现人脸识别_第3张图片
3.平台要求的参数:
Linux基础之Libcurl库之HTTPS协议实现人脸识别_第4张图片

3.人脸识别代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define true 1
#define false 0

typedef unsigned int bool;

char buf[1024] = {'\0'};

size_t readData( void *ptr, size_t size, size_t nmemb, void *stream)
{
        strncpy(buf, ptr, 1024);
        //printf("%s\n",buf);
}

char *getPicBase64File(char *picFile)
{
        
        char cmd[128] = {'\0'};
        sprintf(cmd, "base64 %s > tmpFile", picFile);//把传过来的照片转换成base64流,导入到tmpFile文件
        system(cmd);
        
        int fd = open("./tmpFile",O_RDWR);
        int fileLen = lseek(fd, 0, SEEK_END);
        lseek(fd, 0, SEEK_SET);
        char *bufPic = (char *)malloc(fileLen);
        memset(bufPic, 0, fileLen);
        read(fd, bufPic, fileLen);//读取识别照片的base64流编码
        close(fd);

        system("rm ./tmpFile");
        return bufPic;//返回读取到的数据
}

bool postUrl()
{
        CURL *curl;
        CURLcode res;

        char *postString;

        char *key = "";//翔云平台的人脸识别参数自己去购买,1分钱识别100次
        char *secret = "";

        int typeId = 21;
        char *format = "xml";

        char *bufPic1 = getPicBase64File("./huge.jpg");//要识别的照片
        char *bufPic2 = getPicBase64File("./huge1.jpg");


        int len = strlen(key)+strlen(secret)+strlen(bufPic1)+strlen(bufPic2)+128;
        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);//需要的参数
                curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do");//访问平台的接口
                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData);//返回识别结果
                res = curl_easy_perform(curl);
                printf("OK:%d\n",res);
                
                //对访问的结果进行字符串处理
                if(strstr(buf,"是") != NULL){
                        printf("the same person\n");
                }else{
                        printf("diff person\n");
                }
                curl_easy_cleanup(curl);
        }
        return true;
}

int main(void)
{
        postUrl(); //post请求
}      

2.运行结果:
在这里插入图片描述

五、车牌识别

1.车牌识别代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define true 1
#define false 0

typedef unsigned int bool;

char buf[1024] = {'\0'};

size_t readData( void *ptr, size_t size, size_t nmemb, void *stream)
{
        strncpy(buf, ptr, 1024);
        printf("%s\n",buf);
}

char *getPicBase64File(char *picFile)
{
        char cmd[128] = {'\0'};
        sprintf(cmd, "base64 %s > tmpFile", picFile);
        system(cmd);
        int fd = open("./tmpFile",O_RDWR);
        int fileLen = lseek(fd, 0, SEEK_END);
        lseek(fd, 0, SEEK_SET);
        char *bufPic = (char *)malloc(fileLen);
        memset(bufPic, 0, fileLen);
        read(fd, bufPic, fileLen);
        close(fd);

        system("rm ./tmpFile");
        return bufPic;
}

bool postUrl()
{
        CURL *curl;
        CURLcode res;

        char *postString;

        char *key = "";
        char *secret = "";

        int typeId = 19;
        char *format = "xml";

        char *bufPic = getPicBase64File("./car.jpg");

        int len = strlen(key)+strlen(secret)+strlen(bufPic)+128;
        postString = (char *)malloc(len);
        memset(postString, 0, len);
        sprintf(postString, "&img=%s&key=%s&secret=%s&typeId=%d&format=%s",
                        bufPic,key,secret,typeId,format);

        curl = curl_easy_init();
        if (curl)
        {
                curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString);
                curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/recogliu.do");
                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readData);
                res = curl_easy_perform(curl);
                printf("OK:%d\n",res);

                curl_easy_cleanup(curl);
        }
        return true;
}

int main(void)
{
        postUrl();
}

2.运行结果:
Linux基础之Libcurl库之HTTPS协议实现人脸识别_第5张图片

六、总结

1)我们是通过调libcurl库去访问翔云人工智能平台让平台来帮我们实现人脸识别和车牌识别的。所以要根据平台API的要求我们要上传哪些参数,然后利用我们调的libcurl库的函数帮我们访问上传这些参数,然后返回我们想要的结果。

2)所谓库就是别人已经封装好了的一些可执行程序,我们使用的时候只要去阅读库的使用说明来使用就好了。大致都是用到库的一些功能函数来实现我们想要的功能。像之前学到的树莓派的lirinbgPi库一样,它也有很多函数。

你可能感兴趣的:(Linux基础,linux,https,运维)