目录

  • 一、前言
  • 二、编译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 //最后一步安装完成


2.编译 libcurl库加上openssl 库:

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

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

三、base64编码

1.

因为我们调库去访问翔云人工智能平台实现人脸识别的时候,人家要求上传的图片要求是base64流的图片,所以我们要把上传识别的照片转化成base64流的格式。

2.什么是base64?

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

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

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

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

1.先把要是别的照片传到linux环境下:

3.平台要求的参数:

3.人脸识别代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <curl/curl.h>#define true 1
#define false 0typedef 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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <curl/curl.h>#define true 1
#define false 0typedef 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.运行结果:

六、总结

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

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

Linux基础之Libcurl库之HTTPS协议实现人脸识别相关推荐

  1. 【Linux基础】静态库和共享库(如何自定义库文件?)

    文章目录 前言 一.库文件的基本知识 1.库文件分类 2.库文件命名 二.如何自定义静态库? 1.静态库简介 2.具体流程(详细步骤) 3.静态库缺点 三.如何自定义共享库? 1.共享库简介 2.具体 ...

  2. python机器学习库keras——CNN卷积神经网络人脸识别

    全栈工程师开发手册 (作者:栾鹏) python教程全解 github地址:https://github.com/626626cdllp/kears/tree/master/Face_Recognit ...

  3. 接口测试自动化之坑二:如何使用requests库请求https协议,解决提示报错和Unverified HTTPS request警告warning问题

    1.首先在请求的requests中增加一条verify=False设置次参数的目的是跳过SSL证书问题 2.设置步骤一后,控制台会有Unverified HTTPS request报错信息 解决办法: ...

  4. 零基础用一百行代码完成动态的人脸识别(opencv+python)

    废话:(其实是介绍了一下该文章的大概来路)   电子化的时代到处都能看到人脸识别的用途:比如:刷脸门禁,火车站检票口,又比如检查站,还有一些比较高端的汽车还支持刷脸开门等等. 近期呢接了个学校的一个项 ...

  5. OpenSSL编译说明:Linux结合libcurl库编程实现人脸识别和车牌识别

    目录 一   写在前面 二   编译OpenSSL支持libcurl的https访问 ① 下载openssl库 ② 把库的开源配置包安装在指定文件夹并编译 三   编写人脸识别代码第一次 ① 翔云人工 ...

  6. ios framework 调用第三方 framework_Python基础:标准库和常用的第三方库

    Python的标准库有: 名称 作用 datetime 为日期和时间处理同时提供了简单和复杂的方法. zlib 直接支持通用的数据打包和压缩格式:zlib,gzip,bz2,zipfile,以及 ta ...

  7. Python基础:标准库和常用的第三方库

    目录 Python的标准库 Python常用的第三方库 标准库用法参考示例 datetime库: zlib库: sys库: urllib: Python的标准库 名称 作用 datetime 为日期和 ...

  8. 应用层下的人脸识别(二):人脸库

    本文作者根据多年人脸识别项目经验,总结了人脸识别技术在安防.商业领域应用及产品设计细节,汇总成应用层下的人脸识别系列文章. 本文为系列文章的第二篇,介绍人脸库的相关内容.人脸库是人脸识别的基础,建立人 ...

  9. face-recognition库(人脸识别库)安装,使用

    一,起因 1,在某hub上下载了所谓"最简单的人脸识别项目". 2,开始了face-recognition的安装之路. 3,人脸识别在win10上的使用,识别图像上面的人脸. 二, ...

最新文章

  1. Java实现数据库表结构导出到Excel
  2. linux命令:case选择结构语句
  3. 史上最简单的SpringCloud教程 | 第十二篇: 断路器监控(Hystrix Dashboard)
  4. DHCP服务搭建(1)
  5. Maven入门极简使用教程
  6. 阿里云 MaxCompute 2020-4 月刊
  7. tcp中的crc检验算法原理_在数据传输过程中的CRC 算法的简单说明
  8. JAVA websocket中 spring无法注入依赖问题解决
  9. spark学习-68-源代码:driver端接收executor的心跳
  10. OpenShift 4 - 为Gogs构建一个Operator
  11. mysql中文显示问号_从MySQL读取中文数据,显示???(问号)乱码的解决方法...
  12. 【网络协议】openR调研
  13. FTPSFTP的基本命令
  14. POI Excel合并 分页符的复制
  15. 使用PS制作背景透明的png图片
  16. CTF Web_php_unserialize 详细解题过程
  17. pr基本图形模板无法使用_PR基本图形的导入,使用图文教程
  18. uefi+gpt分区修复esp引导
  19. 关于Descriptors cannot not be created directly报错
  20. 1998年图灵奖--詹姆斯·格雷简介

热门文章

  1. Unity 优化(Draw Call)
  2. 视频脚本: 完全模型组中的模型
  3. 【大胆摸鱼】摸鱼、锁机二合一
  4. Hive常见高频面试题(上篇)
  5. linux父进程发出退出信号,为什么prctl没有如小弟我所预期的设置一个父进程退出发给子进程信号...
  6. 成功者和失败者最大的区别在哪里
  7. Android实现简易计算器(页面跳转和数据传输)
  8. 《易经》与软件开发(1)
  9. 【OpenGl】OpenGL之弧度和角度的换算
  10. 习题 2.1 简单计算器(20 分)