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


运用翔云平台的人脸识别的方案,通过使用第三方libcurl的库,用HTTPS方式访问官网进行人脸识别的操作,并拿到人脸识别得到的结果

实现的目标

通过使用curl库实现HTTPS访问翔云平台的官网,对已有的两张照片(jpg格式)进行人脸识别

安装openssl第三方的库

  1. 原因:需要通过HPPTS的方式访问翔云平台的官网进行人脸识别,代码的实现是使用libcurl库。而能够使libcurl支持HTTPS,其需依赖openssl第三方的库,所以在安装libcurl第三方的库之前需要安装openssl第三方的库;
  2. 点击该链接下载openssl库的压缩包https://www.openssl.org/source/old/1.1.1/openssl-1.1.1a.tar.gz
  3. 将下载好的libcurl库的压缩包拷贝到unbuntu linux上:可以用拖拽、文件传输或者共享文件夹的方式拷贝到unbuntu linux上;
  4. 解压命令
    tar xvf  openssl-1.1.1a.tar.gz
  1. 进入到openssl-1.1.1a文件中
    cd openssl-1.1.1a/
  1. 进行编译安装:依次输入以下命令(以默认的方式编译安装)
   ./config
   make
   sudo make install

安装libcurl第三方的库

  1. libcurl简介: libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可以使用PHP的ftp扩展), HTTP基本表单上传,代理,cookies,和用户认证;
  2. 库下载链接https://github.com/curl/curl/releases/tag/curl-7_71_1
  3. 进入上面的链接,点击下载:curl-7.71.1.tar.bz2
  4. 将下载好的libcurl库的压缩包拷贝到unbuntu linux上:可以用拖拽、文件传输或者共享文件夹的方式拷贝到unbuntu linux上;
  5. 解压命令
    tar xvf  curl-7.71.1.tar.bz2
  1. 进入到curl-7.71.1文件中
    cd curl-7.71.1/
  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的使用

参考以下博文

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/

配置完临时环境变量后,再次运行后的结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_50438937/article/details/113630094
今日推荐