智能家居项目(七)之Libcurl库与HTTPS协议实现人脸识别

news2024/11/17 7:56:31

目录

一、前言

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

三、编写人脸识别代码 

四、编程实现人脸识别第二次加入图片base64编码

五、总结


一、前言


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

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

1、下载openssl库:

温馨提示:在httpHandler目录下,下载openssl库

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

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

cd openssl-1.1.1a  //进入openssl-1.1.1a目录下

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

make               //编译

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

编译结果:

 2、回到curl-7.71.1文件下,输入指令:

提示:要从上一个openssl-1.1.1a文件回到curl-7.71.1文件下

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

三、编写人脸识别代码 

1、注册一个翔云人工智能开放平台的账号,然后购买人脸识别的产品,怎么注册和购买产品这里就不多说啦,大家可以去翔云网站了解哈。

翔云人工智能开放平台官网:人脸识别

2、新建一个demo2.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格式的图片

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("./1.jpg");
	char *bufPic2 = getPicBase64FromFile("./2.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,"shi") != NULL){
			printf("the same Person\n");
		}else{
			printf("diff Person\n");
		}
		curl_easy_cleanup(curl);
	}
	return true;
}
int main(void)
{
	postUrl();
}

4、进行编译:

gcc demo3.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl

5、执行结果:  ./a.out

温馨提示:

因为我上述的代码中判断,如果两张照片是类似的就打印:the same Person,如过两张照片差距较大,就打印:diff Person,我放的是两张差距较大的照片,所以就打印了:diff Person

五、总结


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

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

感谢:Linux基础之Libcurl库之HTTPS协议实现人脸识别_libcurl https_free'的博客-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机大小端

我们先假定内存结构为上下型的&#xff0c;上代表内存高地址&#xff0c;下代表内存低地址。 电脑读取内存数据时&#xff0c;是从低位地址到高位地址进行读取&#xff08;从下到上&#xff09;。 1、何为大小端 大端&#xff1a;数据的高位字节存放在低地址&#xff0c;数据…

数据库增删改查II

目录 1.约束 1.1null约束 1.2唯一约束 1.3默认值约束 1.4主键约束 1.5外键约束 2.新增 3.查询 3.1聚合查询 3.1.1.聚合函数 3.1.2group by子句 3.1.3 having 3.2联合查询 3.2.1内连接 3.2.2外连接 3.2.3 自连接 3.2.4子查询 3.2.5合并查询 1.约束 1.1null约…

两个适配器网络冲突,限制访问特定网址

两个适配器网络冲突&#xff0c;限制访问特定网址说明命令说明说明 因为工作需要&#xff0c;有线网络访问局域网服务器&#xff0c;限制特别策略访问&#xff0c;如禁止远程。此时如果想要远程&#xff0c;在连接手机热点就可以&#xff0c;但由于两个网络的存在优先级。就出…

五分钟学会接口自动化测试框架

今天&#xff0c;我们来聊聊接口自动化测试是什么&#xff1f;如何开始&#xff1f;接口自动化测试框架怎么做&#xff1f; 自动化测试 自动化测试&#xff0c;这几年行业内的热词&#xff0c;也是测试人员进阶的必备技能&#xff0c;更是软件测试未来发展的趋势。 特别是在…

怎么从零搭建vue项目(使用webpack手动搭建)

目录一、前提条件二、手动搭建vue项目的步骤&#xff1a;1. 创建项目2. 生成package.json文件3. 引入webpack和创建webpack.config.js文件4. 创建index.html&#xff0c;main.js文件5. 使用webpack命令编译6. 引入vue2&#xff0c;修改index.html&#xff0c;main.js文件7. 引入…

物理机不能访问虚拟机kali的web服务解决方案记录

目录 环境 问题描述 解决方案 知识补充 效果测试 其他思路 环境 kali&#xff08;nat模式&#xff09;&#xff0c;物理机&#xff0c;可互ping 问题描述 kali的web服务器不能在物理机上访问。 1.本机能ping通虚拟机 2.虚拟机也能ping通本机 3.虚拟机能访问自己的web …

Python基础知识——列表

列表 列表是可以存放任何数据&#xff0c;包括整型&#xff0c;浮点型&#xff0c;字符串&#xff0c;布尔型等等&#xff0c;是常用的数据类型之一。 1.列表的创建 列表也是一个可迭代对象 1. 普通形式l [1,2,3,4,5] ---整型列表l ["a","b","c&…

一篇搞懂tcp,http,socket,socket连接池之间的关系

前言 作为一名开发人员我们经常会听到HTTP协议、TCP/IP协议、UDP协议、Socket、Socket长连接、Socket连接池等字眼&#xff0c;然而它们之间的关系、区别及原理并不是所有人都能理解清楚&#xff0c;这篇文章就从网络协议基础开始到Socket连接池&#xff0c;一步一步解释他们之…

激光雷达上车「热」背后的焦虑

激光雷达的上车节奏正在加速。 高工智能汽车研究院监测数据显示&#xff0c;从2022年9月至今&#xff0c;中国市场乘用车月度前装标配搭载激光雷达一直保持在1.5万台以上&#xff0c;其中&#xff0c;去年12月更是单月冲破3万台大关。 本周&#xff0c;Luminar宣布扩大与梅赛德…

实现小说自由,国产浏览器出手了,吊打各类阅读软件

喜欢看小说的朋友都知道&#xff0c;有时候看小说看到一定的章节就要收费了&#xff0c;那我们怎么实现小说阅读自由&#xff0c;免费看完整部小说呢&#xff1f;下面给大家分享可以免费看小说的良心浏览器&#xff0c;吊打各类阅读软件&#xff0c;真的是巨好用。无论是古代穿…

【读论文】THFuse

【读论文】THFuse介绍网络架构多分支CNN特征提取块基于VIT的全局特征提取快图像重建块损失函数总结参考论文&#xff1a; https://www.sciencedirect.com/science/article/abs/pii/S0925231223000437如有侵权请联系博主介绍 一篇基于CNN和VIT的关于红外可视图像融合的论文&…

【wpf】ItemsControl 的Binding 小技巧

ItemsControl 非常常用和好用的控件&#xff0c;我经常将之用于配置界面&#xff01; 比如这么一个配置界面&#xff1a; 整体是一个ItemsControl&#xff0c;每个子界面就是其中的一个Item。 ItemsControl 的 ItemsSource 绑定到 ParameterInfo 的集合 public ObservableCo…

最简单的微信多开防撤回方式

微信&#xff0c;大家工作中生活中用的最多的一款应用&#xff1b;很多公司喜欢用微信来作为工作沟通的工具&#xff0c;官方原版只支持登陆一个微信&#xff0c;这对于需要在电脑上登陆多个微信账号的朋友来说肯定是极其的不方便。另外有的时候别人撤回了一些重要消息&#xf…

目前医疗器械数据库有哪些?最推荐哪些?

在英特网发达的今天&#xff0c;医疗器械信息查询应该是一件便捷的事情&#xff0c;但不知道大家有没有遇到过这种类似情况&#xff0c;就是在查询医疗器械信息时&#xff0c;如果通过百度去检索&#xff0c;查到的结果往往会不尽人意&#xff0c;比如信息陈旧、太分散、来源不…

Spring security 个人理解

改文章写的很好&#xff1a;https://zhuanlan.zhihu.com/p/342755411 Spring security 分为两个部分 登陆认证权限认证 登陆认证 其实就是就是登陆注册&#xff0c;然后获取登陆凭证的问题 操作如下 登陆账号密码&#xff0c;通过账号查询出用户数据&#xff0c;然后密码进…

如何使用DeadFinder寻找失效链接

关于DeadFinder DeadFinder是一款功能强大的链接分析工具&#xff0c;该工具可以帮助广大研究人员快速地寻找目标页面中的无效链接&#xff08;死链&#xff09;。所谓死链&#xff0c;即一个页面中存在的无法被连接的一条链接。这些链接如果一直保留在页面中的话&#xff0c;…

Hive中的高阶函数(二)

1、UDTF之explode函数 explode(array)将array列表里的每个元素生成一行&#xff1b; explode(map)将map里的每一对元素作为一行&#xff0c;其中key为一列&#xff0c;value为一列&#xff1b; 一般情况下&#xff0c;explode函数可以直接使用即可&#xff0c;也可以根据需要结…

[python入门(53)] - python中的OS模块(包) - 2

目录 ❤ OS模块和path模块(函数) ❤ os模块中操作目录以及文件的函数 ❤ os模块中遍历目录数 ❤ 一些表现形式参数 ❤ 获取在进程的控制终端上登录的用户的名称&#xff1a; os.getlogin() &#xff08;即此时pc登录的用户名&#xff09; ❤ 总结 ❤ os.listdir()…

3月4日线下讲座《项目经理五项管理锦囊》

在项目管理过程中&#xff0c;你是否有过因为人际关系紧张&#xff0c;而导致团队协作不顺畅&#xff1f; 项目团队内耗严重&#xff0c;成员之间缺乏信任冲突较多&#xff0c;影响士气项目质量及项目周期等问题&#xff1f; 为什么会导致这样的结果&#xff1f;如何避免踩坑&a…

TAS5411QPWPRQ1引脚图LP873220RHDRQ1汽车应用开关稳压器

8W单声道汽车类D类音频放大器&#xff1a;TAS5411QPWPRQ1引脚图 【概述】TAS5411-Q1是一款单声道D类音频放大器&#xff0c;非常适用于汽车类紧急呼叫(eCall)、远程信息处理、仪表板应用。该器件采用14.4VDC汽车电池供电&#xff0c;可在负载为4Ω且THDN不超过10%的情况下提供高…