C语言实现基于翔云平台的人脸识别demo1(linux)
运用翔云平台的人脸识别的方案,通过使用第三方libcurl的库,用HTTPS方式访问官网进行人脸识别的操作,并拿到人脸识别得到的结果
实现的目标
通过使用curl库实现HTTPS访问翔云平台的官网,对已有的两张照片(jpg格式)进行人脸识别
安装openssl第三方的库
- 原因:需要通过HPPTS的方式访问翔云平台的官网进行人脸识别,代码的实现是使用libcurl库。而能够使libcurl支持HTTPS,其需依赖openssl第三方的库,所以在安装libcurl第三方的库之前需要安装openssl第三方的库;
- 点击该链接下载openssl库的压缩包:https://www.openssl.org/source/old/1.1.1/openssl-1.1.1a.tar.gz
- 将下载好的libcurl库的压缩包拷贝到unbuntu linux上:可以用拖拽、文件传输或者共享文件夹的方式拷贝到unbuntu linux上;
- 解压命令:
tar xvf openssl-1.1.1a.tar.gz
- 进入到openssl-1.1.1a文件中:
cd openssl-1.1.1a/
- 进行编译安装:依次输入以下命令(以默认的方式编译安装)
./config
make
sudo make install
安装libcurl第三方的库
- libcurl简介: libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可以使用PHP的ftp扩展), HTTP基本表单上传,代理,cookies,和用户认证;
- 库下载链接:https://github.com/curl/curl/releases/tag/curl-7_71_1
- 进入上面的链接,点击下载:curl-7.71.1.tar.bz2
- 将下载好的libcurl库的压缩包拷贝到unbuntu linux上:可以用拖拽、文件传输或者共享文件夹的方式拷贝到unbuntu linux上;
- 解压命令:
tar xvf curl-7.71.1.tar.bz2
- 进入到curl-7.71.1文件中:
cd curl-7.71.1/
- 进行编译安装:依次输入以下命令(编译安装在curl-7.71.1文件中)
./configure --prefix=$PWD/_install --with-ssl
//其中的--prefix=$PWD/_install是指定安装的路径在当前文件夹的_install下,_install文件会自己生成;--with-ssl是使安装后的libcurl支持ssl,能够使用HTTPS
//如果编译安装后的libcurl库能够支持到其他平台上运行的话,则需要加上 --host=(交叉编译工具),以树莓派来说,命令则为下面一行
// ./configure --prefix=$PWD/_install --with-ssl --host=arm-linux-gnueabihf
make
make install
购买使用翔云平台人脸识别的次数
进入翔云平台的官网,进行注册
点击网页界面最上面的栏目条上的 <价格与购买>
对于我们这种抱着玩的心态的,只用花0.01元购买100次的人脸识别即可
libcurl的使用
参考以下博文:
代码实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <curl/curl.h>
#define true 1
#define false 0
typedef unsigned int bool;
char* faceRes = NULL;
char* getBase64(char* photoPath){// 获取照片(jpg格式)的Base64的值
char cmd[256] = {'\0'};
sprintf(cmd, "base64 %s > photoBase64File", photoPath);
system(cmd);// 通过执行"base64"这个指令即可得到照片的Base64值,在这里将得到的Base64值存放在photoBase64File文件中
int fd,size;
fd = open("./photoBase64File", O_RDWR);
size = lseek(fd, 0, SEEK_END) + 1;
lseek(fd, 0, SEEK_SET);
char* res = (char*)malloc(size);
memset(res, '\0', size);
read(fd, res, size);// 从photoBase64File文件中读取照片的Base64值
close(fd);
system("rm photoBase64File");
return res;
}
size_t handle(void *ptr, size_t size, size_t nmemb, void *stream){
//拷贝返回来的结果字段
int ssize = strlen(ptr) + 1;
faceRes = (char*)malloc(ssize);
memset(faceRes, '\0', ssize);
strncpy(faceRes, ptr, ssize);
}
bool postUrl()
{
CURL *curl;
CURLcode res;
char* message = NULL;
// 调用getBase64()自定的函数获取存放在当前文件夹下的两个进行识别的图片的Base64值
char* img1 = getBase64("./photo1.jpg");
char* img2 = getBase64("./photo2.jpg");
// key值和secret值是在翔云官网->个人中心的OCR Key和OCR secret两个的值
char* key = "用自己的";
char* secret = "用自己的";
int typeId = 21;
char* format = "xml";
int size = strlen(img1)+strlen(img2)+strlen(key)+strlen(secret)+strlen(format)+3;
message = (char*)malloc(size);
memset(message, '\0', size);
sprintf(message, "&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_URL, "https://netocr.com/api/faceliu.do");// 指定url
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, message);// 指定post内容
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, handle);// 当拿到结果后,指定调用handle()该自定的函数进行处理
res = curl_easy_perform(curl);// 进行访问官网、进行人脸识别的操作
curl_easy_cleanup(curl);// 执行完后,对curl_easy_init()进行清理
}
if(res != 23){
printf("post failed!\n");
return false;
}else{
printf("post successful!\n");
}
printf("%s\n",faceRes);// 打印出人脸识别后返回来的结果字段
if(strstr(faceRes, "是") != NULL){// 如果返回来的结果字段中有“是”这个字眼,代表是同一个人
printf("This is the same person!\n");
}else{
printf("Tow different persons!\n");
}
free(faceRes);
free(img1);
free(img2);
}
int main(void)
{
postUrl();
return 0;
}
如何编译实现人脸识别的程序
我是将libcurl编译安装在curl-7.71.1文件中的_install的目录下,不是在usr/local/lib底下,所以在编译程序时,需要自己链接库的位置;
编译程序的指令:(文件目录的路径因人而异,仅供参考)
1 gcc faceRecognitionDemo.c -I ~/Desktop/httpHandler/curl-7.71.1/_install/include/ -L ~/Desktop/httpHandler/curl-7.71.1/_install/lib/ -lcurl
运行
运行后会发现以下错误
是因为环境变量里面的路径中找不到该库的软链接文件
因此需要配置环境变量
使用以下命令配置临时的环境变量:
临时加上_install目录底下的lib/的路径(文件目录的路径因人而异,仅供参考)
1 export LD_LIBRARY_PATH=~/Desktop/httpHandler/curl-7.71.1/_install/lib/