简单实现树莓派人脸识别开锁(翔云方案)

一、购买翔云人脸识别接口次数

注册登录过后选择人脸识别,点击购买
在这里插入图片描述
选择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"); 

四、结果

成功运行!
在这里插入图片描述

五、总结

期间还是遇到很多很多问题,有时心态都搞炸了,特别是这树莓派的摄像头一开始拍出来的照片有问题……多折腾多折腾多折腾!!!!!!!

  • 14
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值