智能家居(11)——https协议之人脸识别

https协议之人脸识别

转载:https://blog.csdn.net/wo541075754/article/details/81734770?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168274610716800225594673%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168274610716800225594673&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-2-81734770-null-null.142v86insert_down1,239v2insert_chatgpt&utm_term=Base64&spm=1018.2226.3001.4187
作者:程序新视界

一、libcurl和openssl安装

因为刚开始只安装了libcurl时,并没有安装openssl,所以只支持Http协议访问,安装了openssl库后,支持Https的访问。

  1. rm _install/ -rf
    先删除之前安装curl库的路径及文件。
  2. vi ./docs/INSTALL.md
    查看libcurl的install文件,在install文件中,看到配置时需要加–with-ssl。
  3. ./configure --prefix=/home/jiangyo/Desktop/httpHandler/curl-7.71.1/_install --with-ssl在这里插入图片描述
    看到配置的过程出了错误,系统需要先支持ssl,才能进行配置。
  4. wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
    安装openssl
  5. tar vxf openssl-1.1.1a.tar.gz
    解压openssl
  6. ./configure
    默认安装在系统路径下,这样编译的时候就不用加动态库的环境变量路径,也不用指定动态库。
  7. make #编译
  8. sudo make install #安装
  9. ./configure --prefix=/home/jiangyo/Desktop/httpHandler/curl-7.71.1/_install --with-ssl
    安装完openssl后重新配置curl
  10. make #编译
  11. make install #安装
  12. gcc demo2.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl
    重新进行编译文件
  13. sudo apt-get update、sudo apt-get install libcurl4-openssl-dev
    运行a.out的时候会报错,解决办法。

二、Base64

  1. Base64就是一种基于64个可打印字符来表示二进制数据的方法。字符选用了"A-Z、a-z、0-9、+、/" 64个可打印字符。
  2. Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。什么是可打印字符?在ASCII码中规定,0-31、127这33个字符属于控制字符,32~126这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其他字符呢?其中一种方式就是使用Base64。

具体转换步骤

  1. 将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
  2. 将上面的24个二进制位每6个一组,共分为4组。
  3. 在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即四个字节。
  4. 根据Base64编码对照表(见下图)获得对应的值。
0 A  17 R   34 i   51 z

1 B  18 S   35 j   52 0

2 C  19 T   36 k   53 1

3 D  20 U   37 l   54 2

4 E  21 V   38 m   55 3

5 F  22 W   39 n   56 4

6 G  23 X   40 o   57 5

7 H  24 Y   41 p   58 6

8 I  25 Z   42 q   59 7

9 J  26 a   43 r   60 8

10 K  27 b   44 s   61 9

11 L  28 c   45 t   62 +

12 M  29 d   46 u   63 /

13 N  30 e   47 v

14 O  31 f   48 w   

15 P  32 g   49 x

16 Q  33 h   50 y

  1. Base64字符表中的字符原本用6个bit就可以表示,现在前面添加2个0,变为8个bit,会造成一定的浪费。因此,Base64编码之后的文本,要比原文大约三分之一。
  2. 为什么使用3个字节一组呢?因为6和8的最小公倍数为24,三个字节正好24个二进制位,每6个bit位一组,恰好能够分为4组。

注意事项

  1. 大多数编码都是由字符串转化成二进制的过程,而Base64的编码则是从二进制转换为字符串。与常规恰恰相反,
  2. Base64编码主要用在传输、存储、表示二进制领域,不能算得上加密,只是无法直接看到明文。也可以通过打乱Base64编码来进行加密。
  3. 中文有多种编码(比如:utf-8、gb2312、gbk等),不同编码对应Base64编码结果都不一样。

三、人脸识别

  1. https://www.netocr.com/
    在翔云人工智能平台开通人脸识别服务后,可通过该平台,在程序中通过https访问,将图片等信息,通过Post请求发送给该平台。
  2. 源程序:
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#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("===============================readdata========================\n");
	//printf("%s\n", buf);
}

char *getBaseData(char *pass, int *len)
{
	char cmd[128] = {0};
	int readlen, fd;
	char *readbuf;
	sprintf(cmd, "base64 %s > output", pass);
	system(cmd);
	fd = open("./output", O_RDWR);
	readlen = lseek(fd, 0, SEEK_END);
	lseek(fd, 0, SEEK_SET);
	readbuf = (char *)malloc(sizeof(char) * readlen +2);
	read(fd, readbuf, readlen);
	*len = readlen;
	close(fd);
	return readbuf;
}

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

    char key[128] = "KX4NTh8jQmQEtcY1pT1vZ9";
    char secret[128] = "2f7e3e1b594e41a1a3718176950cd57a";
    int typeId = 21;
    char format[16] = "xml";
    char postData[800000] = {0};
	
	int len1, len2;
	char *img1=NULL;
	char *img2=NULL;

	img1 = getBaseData("./1.jpg", &len1);
	img2 = getBaseData("./4.jpg", &len2);

    sprintf(postData, "&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s" , img1, img2, key, secret, typeId, format);
    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData);    // 指定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);
        curl_easy_cleanup(curl);
	printf("res = %d\n",res);
    }

	if(strstr(buf, "是") != NULL) {
		printf("same people!\n");
	}
	else {
		printf("diff people!\n");
	}


    return true;
}
int main(void)
{
    postUrl();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值