libcurl库访问人工智能平台之人脸识别

一、前言

上一篇文章我们调用 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库一样,它也有很多函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/1437.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FPGA纯verilog实现RIFFA的PCIE通信,提供工程源码和软件驱动

目录1、前言2、RIFFA简介RIFFA概述RIFFA架构RIFFA驱动3、vivado工程详解4、上板调试验证并演示5、福利&#xff1a;工程代码的获取1、前言 PCIE是目前速率很高的外部板卡与CPU通信的方案之一&#xff0c;广泛应用于电脑主板与外部板卡的通讯&#xff0c;PCIE协议极其复杂&…

【Linux】基本指令介绍

前言从今天开始&#xff0c;我们一起来学习Linux的相关知识&#xff0c;今天先来介绍怎么登录Linux&#xff0c;并且介绍一些Linux的基本指令。使用 XShell 远程登录 Linux很多同学的 Linux 启动进入图形化的桌面. 这个东西大家以后就可以忘记了. 以后的工作中 没有机会 使用图…

蓝桥杯刷题冲刺 | 倒计时21天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.迷宫1.迷宫 题目 链接&#xff1a; 迷宫 - 蓝桥云课 (lanqiao.cn) 本题为填空题&#xff0c;只…

Three.js——learn02

Three.js——learn02Three.js——learn02通过轨道控制器查看物体OrbitControls核心代码index2.htmlindex.cssindex2.jsresult添加辅助器1.坐标轴辅助器AxesHelper核心代码完整代码2.箭头辅助器ArrowHelper核心代码完整代码3.相机视锥体辅助器CameraHelper核心代码完整代码Three…

近期投简历、找日常实习的一些碎碎念(大二---测试岗)

嘿嘿嘿&#xff0c;我又回来了&#xff0c;相信不少兄弟已经发现我似乎已经断更了好久&#xff0c;哈哈&#xff0c;我是尝试去找实习&#xff0c;投简历面试去了。 先说一下背景。 目录 背景 求职进行中 简历 投递和沟通 收获和感受 背景 博主&#xff0c;大二软件工程…

Arthas工具的基本使用

介绍 Arthas 是Alibaba开源的Java诊断工具&#xff0c;深受开发者喜爱。在线排查问题&#xff0c;无需重启&#xff1b;动态跟踪Java代码&#xff1b;实时监控JVM状态。Arthas支持JDK 6&#xff0c;支持Linux/Mac/Windows&#xff0c;采用命令行交互模式&#xff0c;同时提供丰…

Python截图自动化工具

1、展示部分源码(写的比较乱&#xff0c;哈哈) 2、功能展示 1&#xff09;首页 2&#xff09;按钮截图(用于自动翻页) 3&#xff09;保存位置按钮(选择图片保存的位置) 4&#xff09;重复次数&#xff0c;就是要截取多少次 5&#xff09;定位截屏(截取的内容&#x…

[数据分析与可视化] Python绘制数据地图1-GeoPandas入门指北

本文主要介绍GeoPandas的基本使用方法&#xff0c;以绘制简单的地图。GeoPandas是一个Python开源项目&#xff0c;旨在提供丰富而简单的地理空间数据处理接口。GeoPandas扩展了Pandas的数据类型&#xff0c;并使用matplotlib进行绘图。GeoPandas官方仓库地址为&#xff1a;GeoP…

尚融宝06-ECMAScript基本介绍和使用

目录 一、ECMAScript 1、ECMA 2、ECMAScript 3、什么是 ECMA-262 4、ECMA-262 历史 5、ECMAScript 和 JavaScript 的关系 二、基本语法 1、let声明变量 2、const声明常量 3、解构赋值 4、模板字符串 5、声明对象简写 6、定义方法简写 7、参数的默认值 8、对象拓…

QT常用位置函数区别

目录1、引言2、实验代码3、位置函数3.1 x()3.2 y()3.3 frame()3.4 pos()3.5 geometry()3.6 width()3.7 height()3.8 rect()3.9 size()1、引言 QT有众多图形绘制函数&#xff0c;包括x()、y()、frame()、pos()、geometry()、width()、height()、rect()、size()&#xff0c;它们…

【Java学习笔记】多线程与线程池

多线程与线程池一、多线程安全与应用1、程序、进程与线程的关系2、创建多线程的三种方式&#xff08;1&#xff09;继承Thread类创建线程【不推荐】&#xff08;2&#xff09;实现Runnable接口创建线程&#xff08;3&#xff09;Callable接口创建线程3、线程的生命周期4、初识线…

基础入门 HTTP数据包Postman构造请求方法请求头修改状态码判断

文章目录数据-方法&头部&状态码请求requestResponse状态码案例-文件探针&登录爆破工具-Postman自构造使用数据-方法&头部&状态码 请求request 1、常规请求-Get 2、用户登录-Post •get&#xff1a;向特定资源发出请求&#xff08;请求指定页面信息&#x…

为什么这么NB?huatuo革命Unity热更新

最近huatuo(华佗)热更新解决方案火爆了unity开发圈,起初我觉得热更新嘛&#xff0c;不就是内置一个脚本解释器脚本语言开发&#xff0c;如xLua, ILRuntime, puerts。Huatuo又能玩出什么花样&#xff0c;凭什么会这么NB&#xff0c;引起了那么多程序员的关注与称赞呢&#xff1f…

单片机——IIC协议与24C02

1、基础知识 1.1、IIC串行总线的组成及工作原理 I2C总线只有两根双向信号线。一根是数据线SDA&#xff0c;另一根是时钟线SCL。 1.2、I2C总线的数据传输 I2C总线进行数据传送时&#xff0c;时钟信号为高电平期间&#xff0c;数据线上的数据必须保持稳定&#xff0c;只有在时钟…

Linux实操之进程管理

文章目录一、基本介绍二、显示系统执行的进程基本介绍三、ps详解四、终止进程kill和killall介绍:●基本语法常用选项五、查看进程树pstree基本语法常用选项一、基本介绍 1&#xff0e;在LINUX中&#xff0c;每个执行的程序都称为一个进程。每一个进程都分配一个ID号(pid,进程号…

【SCL】实现简单算法--冒泡排序

使用SCL语言实现一个冒泡排序的简单算法 文章目录 目录 文章目录 前言 二、实现排序 1.读取存储器地址&#xff08;PEEK&#xff09;指令 2.编写程序 总结 前言 本文我们来一起使用SCL来实现一个简单的算法——冒泡排序&#xff1b;它可以对少量数据进行从小到大或从大到小排序…

【Linux】GDB的安装与使用

安装安装gdb的具体步骤如下&#xff1a;1、查看当前gdb安装情况rpm -qa | grep gdb如果有&#xff0c;则可以先删除&#xff1a;rpm -e --nodeps 文件名如果没有&#xff0c;则进行下一步。2、下载gdb源码包或者直接apt安装。apt命令安装&#xff1a;sudo apt install gdb源码包…

Qt之QPainter绘制多个矩形/圆形(含源码+注释)

一、绘制示例图 下图绘制的是矩形对象&#xff0c;但是将绘制矩形函数&#xff08;drawRect&#xff09;更改为绘制圆形&#xff08;drawEllipse&#xff09;即可绘制圆形。 二、思路解释 绘制矩形需要自然要获取矩形数据&#xff0c;因此通过鼠标事件获取每个矩形的rect数…

一个完整的渗透学习路线是怎样的?如何成为安全渗透工程师?

前言 1/我是如何学习黑客和渗透&#xff1f; 我是如何学习黑客和渗透测试的&#xff0c;在这里&#xff0c;我就把我的学习路线写一下&#xff0c;让新手和小白们不再迷茫&#xff0c;少走弯路&#xff0c;拒绝时间上的浪费&#xff01; 2/学习常见渗透工具的使用 注意&…

SpringBoot集成 SpringSecurity安全框架

文章目录一、CSRF跨站请求伪造攻击二、项目准备三、认识 SpringSecurity3.1 认证&#x1f380;①直接认证&#x1f380;②使用数据库认证3.2 授权&#x1f361;①基于角色授权&#x1f361;②基于权限的授权&#x1f361;③使用注解判断权限3.3 "记住我"3.4 登录和注…