一、购买翔云人脸识别接口次数
注册登录过后选择人脸识别,点击购买
选择1分钱100次这个
去个人中心获取自己的OCR Key和OCR Secret
偷偷告诉你!!!!!!!!!!!!!!!!!
经过我自己的查询,我发现阿里云也有翔云的这个人脸识别方案,最重要的是它免费100次,如果想不花钱的可以去这个网址进行购买白嫖
阿里云官网
接下来步骤和翔云一样找到自己买的产品获取AppCode目前代码需要这个
两者区别:
翔云平台是采用https协议
阿里云上是采用http协议
所以后期访问接口的代码上稍有不同,编译libcurl库也有不同
二、树莓派上搭建环境
因为我树莓派上也是linux系统,需要在树莓派上下载libcurl库进行编译。
我这里以阿里云上的接口为例,编译libcurl库和测试可参考之前博客
libcurl库编译方法
尝试加sudo
sudo make
sudo make install
完成!
如果直接采用翔云平台的接口,以上的编译方法会出错,因为上面的采用的是http协议,而翔云的是https协议。
那就要编译openssl支持libcurl的https访问
查看libcrul里面的README,docs目录下的INSTALL.md
需要安装OpenSSL
可与去网上找这个库然后放到你的树莓派中,大多都需要积分
可以直接下载
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
下载后解压和编译操作和上面的步骤一样,
但是,要把上面libcurl安装的**_install**文件夹全部删掉,重新安装一次。
通过这三个命令
./configure --prefix=$PWD/_install --with-ssl
make
make install
以下的人脸识别我都会按阿里云的,用祥云的也只需要稍微改改。
三、编写访问接口代码(c语言)
其中没有C语言,也可以采用其他的,我这里用C做示例
facetest.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.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 buff[2048] = {'\0'};
size_t getData( void *ptr, size_t size, size_t nmemb, void *stream)
{
strncpy(buff,ptr,2048);
//printf("-------------------get data-------------------\n");
//printf("%s",buff);
}
char *getPicBase64FromFile(char *picPath)
{
char *buf;
char cmd[128] = {'\0'};
sprintf(cmd,"base64 %s > pictureFile",picPath);
//获取第一张照片的base64数据
system(cmd);//吧jpg格式照片base64化
//打开这个文件,把内容存到buf1中
int fd = open("./pictureFile",O_RDWR);//打开该目录下的pictureFile,可读可写
//计算文件的大小,会议sleek函数
int fileLength = lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);//回到文章的开头
buf = (char *)malloc(fileLength+2);
memset(buf,'\0',fileLength+2);//清空数据
int n_read1 = read(fd,buf,fileLength);
if(n_read1 < 0){
perror("read1:");
return false;
}
system("rm -f pictureFile");
close(fd);
return buf;
}
bool postUrl()
{
CURL *curl;
CURLcode res;
char *postString;
char *appcode = "自己的AppCode";
//int typeId = 21;
char *format = "xml";
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization:APPCODE 自己的AppCode");
char *picBuf1 = getPicBase64FromFile("./img1.jpg");
char *picBuf2 = getPicBase64FromFile("./img2.jpg");
int totalLen = (strlen(appcode) + strlen(picBuf1) + strlen(picBuf2) + 128);
postString = (char *)malloc(totalLen);
memset(postString,'\0',totalLen);
sprintf(postString,"&img1=%s&img2=%s",picBuf1,picBuf2);
curl = curl_easy_init();//初始化
if(curl){
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);// 改协议头
// curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"/tmp/cookie.txt");// 指定cookie文件
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,postString);//指定post内容
curl_easy_setopt(curl,CURLOPT_URL,"http://facematch.sinosecu.com.cn/api/faceliu.do");//指定URL
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION, getData);
res = curl_easy_perform(curl);//执行
//curl_easy_cleanup(curl);
printf("OK:%d\n",res);
if(strstr(buff,"是") != NULL){
printf("yes\n");
}else{
printf("no\n");
}
curl_easy_cleanup(curl);
}
return true;
}
int main(int argc, char **argv)
{
postUrl();
return 0;
}
主函数
main.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<wiringPi.h>
void initWiringPi()
{
int ret = wiringPiSetup();
if(ret == -1){
printf("wiringPi初始化失败\n");
perror("init");
}
}
void initLock()
{
pinMode(24,OUTPUT);//24引脚
digitalWrite(24,LOW);
}
int main(int argc, char const *argv[])
{
FILE *fp;
int n_read;
char buff[128];
int num = 0;
//1.初始化wiringPi库
initWiringPi();
//2.初始化门锁(保持闭合的状态)
initLock();
while(1){
//3.摄像头拍照,获取一张照片
printf("是否进行人脸识别开锁?1是,0否\n");
scanf("%d",&num);
if(num == 1){
printf("准备开启摄像头拍照\n");
system("raspistill -o img2.jpg");
memset(buff,'\0',128);//清空数据
//4.得到照片后和之前的照片进行对比
fp = popen("./face","r");//运行人脸识别的程序(两张照片对比,取出结果,是或否)
//5.读取fp内容,根据结果来判断是否要开锁
n_read = fread(buff,1,3,fp);
if(n_read < 0){
printf("读取失败\n");
perror("n_read");
}
if(strstr(buff,"y") != NULL){
digitalWrite(24,HIGH);
printf("好家伙,是自己人,门已经打开,3s后关闭\n");
delay(3000);
digitalWrite(24,LOW);
}else{
printf("好家伙,不认识你\n");
printf("buff = %s\n",buff);
}
}
}
return 0;
}
问题
目前出现了一个问题,人脸识别接口,同样的代码,在ubuntu下能完美运行,在树莓派下运行失败.
经过大量的测试我发现只要是树莓派摄像头拍的照片就有问题,会出现传的参数为空,但是我查看阿里云,次数还是消耗了,这也太坑了。
经过折腾发现是树莓派的摄像头拍的照片很大,经过上网查询降低质量的方法成功了
system("raspistill -o img2.jpg -q 5");
四、结果
成功运行!
五、总结
期间还是遇到很多很多问题,有时心态都搞炸了,特别是这树莓派的摄像头一开始拍出来的照片有问题……多折腾多折腾多折腾!!!!!!!