目录

一、祥云人工智能开放平台

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

安装SSL依赖库openSSL(使用工具wget)

curl库重新配置,编译,安装

三、编程实现人脸识别

翔云人脸识别API文档

加入图片base64编码

人脸识别完整代码


一、翔云人工智能开放平台

下面通过人工智能OCR识别平台翔云的使用,掌握调库调API开发的一般步骤,其他的平台也基本类似。

开发示例下载

C++示例代码

strPostData.Format(_T("img=%s&key=%s&secret=%s&typeId=%d&format=xml"),strImageBase64,strKey,strSecret,nTypeID);

java示例代码

java大多直接调库,非常简洁,这也是它开发效率高的原因之一。

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

那是因为在编译libcurl库的时候,由于翔云接口是https:开头的,需要选择支持SSL。

./configure --with -ssl

我们访问的接口是https开头的,要进行身份验证和数据加密的,体现在我们的key和secret。

那我们就要回到/curl-7.71.1路径下,删除rm _install -rf上次编译出来的文件夹,重新编译支持SSL的库。由/docs/INSTALL.md我们可以得知要想支持SSL,就得./configure --with-ssl

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

编译错误

cheking for SSL_connect in -lssl... (cached)no no
configure:error:openSSL libs and/or directories were not found where specified!

安装SSL依赖库openSSL(使用工具wget)

想要支持SSL必须要有依赖库,需要系统中已经安装好了SSL。

我们需要安装openSSL.tar

利用linux的开源工具下载wget是Linux中的一个下载文件的工具,wget是在Linux下开发的开放源代码的软件。

百度搜索技巧:wget openSSL.tar

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

进入文件夹,直接去看他的INSTALL。

为了避免到时候编译这个curl又要去配置SSL这个库,我们直接把SSL安装到默认的系统位置去(一般默认是在/usr/local底下),所以不指定安装路径了,直接

/openssl-1.1.1a路径下,配置

./config
make
sudo make install

要加 sudo因为肯定安装在了 usr/local 中,非工作目录无权限

curl库重新配置,编译,安装

回到/curl-7.71.1/目录下重新进行配置:

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

三、编程实现人脸识别

翔云人脸识别API文档

OCR.c

#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>typedef unsigned int bool;//数据类型别名用typedef
#define true 1            //宏定义用define 就是宏替换
#define false 0//回调函数,读取从OCR后台返回的数据  前面打通百度的例子是将内容读取到本地文件fd里面
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()       //根据文档,接口调用方法为post请求
{CURL *curl;CURLcode res;char* postString;//野指针,要开辟空间//根据翔云平台的接口要求  分开定义,然后字符串拼接char* img1   = NULL;   //图片base64流char* img2   = NULL;char* key    = "Tnf7EDJaQ1qFZkow29xxxx";char* secret = "66d49fdbfd4944ec93035f14ea14xxxx";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,typeId,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传输内容,get请求将URL和postString一次性发送curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do");// 指定urlcurl_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();
}
gcc OCR.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl

运行

可以看到已经收到了翔云后台的反馈:

加入图片base64编码

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,可用于在HTTP环境下传递较长的标识信息。

在Linux下生成图片的base64编码

base64 photo.jpg

char* getBase64FromFile(char* filePath)
{char* base64Buf = NULL;char cmd[256] = {'\0'};sprintf(cmd,"base64 %s > tmpFile",filePath);//图片的base64流导入到文件中system(cmd);int fd = open("./tmpFile",O_RDWR);int fileLen = lseek(fd,0,SEEK_END);        //计算文件大小lseek(fd,0,SEEK_SET);                      base64Buf = (char* )malloc(fileLen+8);memset(base64Buf,'\0',fileLen+8);read(fd,base64Buf,fileLen+8);              //从文件中读取base64流到字符串 close(fd);system("rm -f tmpFile");return base64Buf;//指针变量随着子程序调用结束消失,但malloc开辟的空间地址还在,我拿到了这块地址,就能读
}

人脸识别完整代码

OCR.c

#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>typedef unsigned int bool;//数据类型别名用typedef
#define true 1            //宏定义用define 就是宏替换
#define false 0char ocrRetBuf[1024] = {'\0'};//全局变量,用来接收从OCR后台返回的数据size_t readData(void *ptr, size_t size, size_t nmemb, void *stream)//回调函数,把从后台的数据拷贝给ocrRetBuf
{strncpy(ocrRetBuf,ptr,1024);
}char* getBase64FromFile(char* filePath)
{char* base64Buf = NULL;char cmd[256] = {'\0'};sprintf(cmd,"base64 %s > tmpFile",filePath);//图片的base64流导入到文件中system(cmd);int fd = open("./tmpFile",O_RDWR);int fileLen = lseek(fd,0,SEEK_END);        //计算文件大小lseek(fd,0,SEEK_SET);                      base64Buf = (char* )malloc(fileLen+8);memset(base64Buf,'\0',fileLen+8);read(fd,base64Buf,fileLen+8);              //从文件中读取base64流到字符串 close(fd);system("rm -f tmpFile");return base64Buf;//指针变量随着子程序调用结束消失,但malloc开辟的空间地址还在,我拿到了这块地址,就能读
}bool postUrl()       //根据文档,接口调用方法为post请求
{CURL *curl;CURLcode res;//根据翔云平台的接口要求  分开定义,然后字符串拼接char* base64BufPic1 = getBase64FromFile("./aobama1.jpg");//图片base64流char* base64BufPic2 = getBase64FromFile("./aobama2.jpg");char* key    = "Tnf7EDJaQ1qFZkow29xxxx";char* secret = "66d49fdbfd4944ec93035f14ea14xxxx";int   typeId = 21;char* format = "xml"; int len = strlen(key)+strlen(secret)+strlen(base64BufPic1)+strlen(base64BufPic2)+128;//分配空间不够会>导致栈溢出char* postString = (char* )malloc(len);memset(postString,'\0',len);//因为postString是一个指针,不能用sizeof来计算其指向的大小//字符串拼接函数  sprintf(postString,"img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s",base64BufPic1,base64BufPic2,key,secret,typeId,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传输内容,get请求将URL和postString一次性发送curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do");// 指定urlcurl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,readData);  //回调函数读取返回值res = curl_easy_perform(curl);printf("OK:%d\n",res);if(strstr(ocrRetBuf,"否") != NULL){    //字符串检索 判断翔云后台返回的一大堆字符串中有没有“否”printf("不是同一个人\n");}else{printf("是同一个人\n");}curl_easy_cleanup(curl);}return true;
}int main(void)
{postUrl();return 0;
}
gcc OCR.c -I ./curl-7.71.1/_install/include/ -L ./curl-7.71.1/_install/lib/ -lcurl

智能家居项目目录

智能家居(1) —— 工厂模式引入&工厂模式实现继电器控制

智能家居(2) —— 工厂模式实现烟雾报警

智能家居(3) —— 串口通信(语音识别)线程控制

智能家居(4) —— 网络服务器线程控制

智能家居(5) —— 智能家居项目整合(语音控制线程,网络控制线程、烟雾报警线程)

网络编程知识预备(1) —— 7层OSI网络模型

网络编程知识预备(2) —— 三次握手与四次挥手、半连接状态、2MSL

网络编程知识预备(3) —— TCP流量控制(滑动窗口)、拥塞控制

网络编程知识预备(4) —— SOCKET、TCP、HTTP之间的区别与联系

网络编程知识预备(5) —— 了解应用层的HTTP协议与HTTPS协议

网络编程知识预备(6) —— libcurl库简介及其编程访问百度首页

智能家居(6) —— 香橙派摄像头安装实现监控功能

智能家居(7) —— 人脸识别 & 翔云平台编程使用(编译openSSL支持libcurl的https访问、安装SSL依赖库openSSL)

智能家居(8) —— 香橙派摄像头加入设备工厂

智能家居(7) —— 人脸识别 翔云平台编程使用(编译openSSL支持libcurl的https访问、安装SSL依赖库openSSL)相关推荐

  1. 智能家居(七) —— 人脸识别 翔云平台编程使用(编译openSSL支持libcurl的https访问、安装SSL依赖库openSSL)

    人工智能OCR识别平台介绍 OCR (Optical Character Recognition,光学字符识别) 百度搜索OCR识别,可以发现有很多大厂都在做这个项目,比如百度OCR,腾讯OCR,科大 ...

  2. 智能家居——人脸识别 翔云平台(配置ssl和下载OpenSSL)

    文章目录 一.祥云人工智能开放平台 二.编译openSSL支持libcurl的https访问 (1)libcurl的https访问问题 (2)安装SSL依赖库openSSL(使用工具wget) (3) ...

  3. 翔云平台编程实现两张图片的人脸识别

    接上文:libcurl库的介绍和使用,并调用libcurl库编程访问百度主页 1.编程连通翔云平台OCR后台 翔云平台官网 购买了翔云平台人脸识别接口后,根据其提供的API文档编写下面测试代码,查看翔 ...

  4. C语言人脸识别——翔云平台调用(含wget安装)

    人脸识别 准备安装的东西 使用mjpg-streamer获得人脸识别比对照片 用处功能 实际问题处理 准备安装的东西 1.安装mjpg-streamer 链接: 树莓派3代 B型 Cortex-A53 ...

  5. 人脸识别--翔云API

    目录 一.购买人脸识别接口 二.了解base64编码 三.通过post实现人脸识别 一.购买人脸识别接口 进入翔云官网购买人脸识别的接口,得到一个key和secret,我们要用到这两个参数才能访问到人 ...

  6. 基于树莓派(C语音)实现人脸识别(翔云平台)

    1.树莓派中安装摄像头并测试摄像头 1.1.安装mjpg-streamer 在CRT中依次输入一下指令 sudo apt-get update #更新软件列表 sudo apt-get upgrade ...

  7. C语言实现基于翔云平台的人脸识别demo1(linux)

    C语言实现基于翔云平台的人脸识别demo1(linux) 实现的目标 安装openssl第三方的库 安装libcurl第三方的库 购买使用翔云平台人脸识别的次数 libcurl的使用 **参考以下博文 ...

  8. C语言实现基于翔云平台的人脸识别demo2(树莓派)

    C语言实现基于翔云平台的人脸识别demo2(树莓派3B) 实现目标 树莓派安装mjpg-streamer 在树莓派下依次执行以下指令 修改start.sh文件(用来开启摄像头进行监控) A:树莓派摄像 ...

  9. 动态人脸识别系统服务器,动态人脸识别监控管理平台的设计与实现

    摘要: 动态人脸视频监控是计算机视觉领域一个新兴的应用方向和备受关注的前沿课题,它结合了计算机科学,机器视觉,图像处理,模式识别,人工智能等多学科技术知识.国内外的动态人脸识别监控系统都非常注重系统运 ...

最新文章

  1. 整理-----内置函数
  2. 脱壳_详细_使用的方法_01
  3. 阿里P9专家右军:大话软件质量稳定性
  4. Linux Kernel 5.13 稳定版发布:初步支持 M1 芯片
  5. 程序逻辑的处理方式尽量不要写在SQL文中
  6. Ubuntu 16.04下安装激活pycharm 2018.3版本
  7. windows 进程学习
  8. c语言函数调用后必须带回返回值?
  9. 项目管理工具表格全汇总(免费领)
  10. Chromium OS Autotest 概述
  11. Kali Linux 安装 COMFAST CF-WU925A Realtek RTL8811CU/RTL8821CU USB 无线网卡驱动
  12. 如何防止CSRF攻击
  13. android 虚拟基站和经纬度,android基于Gps 定位跟基站定位获取经纬度
  14. (官网)虚幻3--基础游戏快速入门
  15. web安全:X老师上课讲了Robots协议,小宁同学却上课打了瞌睡,赶紧来教教小宁Robots协议是什么吧
  16. 《针灸》笔记(倪海厦先生人纪系列针灸篇——综合)
  17. 蚂蚁借呗每月等额计算方式
  18. FigDraw 13. SCI 文章绘图之桑葚图及文章复现(Sankey)
  19. 操作系统笔记 清华大学陈渝
  20. uva 1645 count

热门文章

  1. 解决android:padding=“@dimen/activity_vertical_margin“> 标红问题
  2. 打开cgi文件的网络服务器,cgi文件怎么打开 .cgi是什么文件 | 帮助信息-动天数据...
  3. unit单元测试和e2e端到端测试的区别
  4. 手把手教您快速运行Unity华为游戏(GameService)
  5. 【ELM回归预测】基于matlab粒子群算法优化ELM回归预测【含Matlab源码 1586期】
  6. Latex参考文献生成与跳转(使用bibitem)
  7. 背下来就是电脑高手(转)
  8. [sklearn]性能度量之AUC值
  9. 如何调用EasyDSS上传点播文件接口?具体操作步骤是什么?
  10. 分布式理论——CAP定理