人脸识别的环境搭建可以看一下https://blog.csdn.net/weixin_48856218/article/details/124407139?spm=1001.2014.3001.5501
我这里就不再赘述了

翔云方案

翔云官网https://www.netocr.com/
代码编写
需要修改的地方:
填写自己的翔云账号的 keysecret

    char *key = "";char *secret = "";

修改为自己图片的名称:

    char *bufPic1 = getPicBase64FromFile("./img1.jpg");char *bufPic2 = getPicBase64FromFile("./img2.jpg");

xianyundemo.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>#define true  1
#define false 0typedef unsigned int bool;char buf[1024] = {'\0'};size_t readData( void *ptr, size_t size, size_t nmemb, void *stream)
{strncpy(buf, ptr, 1024);
//        printf("=======================get Data=========================\n");
//        printf("%s\n",buf);
}char* getPicBase64FromFile(char *filePath)
{char *bufPic;char cmd[128] = {'\0'};sprintf(cmd, "base64 %s > tmpFile",filePath);system(cmd);int fd = open("./tmpFile", O_RDWR);int filelen = lseek(fd, 0, SEEK_END);lseek(fd, 0, SEEK_SET);bufPic = (char *)malloc(filelen + 2);memset(bufPic, '\0', filelen+2);read(fd, bufPic, filelen);close(fd);system("rm -f tmpFile");return bufPic;
}bool postUrl()
{CURL *curl;CURLcode res;char *postString;char *key = "";char *secret = "";int typeId = 21;char *format = "xml";char *bufPic1 = getPicBase64FromFile("./img1.jpg");char *bufPic2 = getPicBase64FromFile("./img2.jpg");int len = strlen(key)+strlen(secret)+strlen(bufPic1)+strlen(bufPic2)+124;postString = (char *)malloc(len);memset(postString, '\0', len);sprintf(postString, "&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s",bufPic1,bufPic2,key,secret,21,format);curl = curl_easy_init();if (curl){curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString);    // 指定post内容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(buf,"是") != NULL){printf("yes\n");}else{printf("no\n");}curl_easy_cleanup(curl);}return true;
}
int main(void)
{postUrl();
}

编译

gcc xianyundemo.c -lcurl -lssl -o xyface

百度方案

官网地址:需要自己注册认证领取免费资源,网上注册教程很多,自行百度
https://login.bce.baidu.com/?redirect=https%3A%2F%2Fconsole.bce.baidu.com%2Fai%2F%3F_%3D1650961199726%26fromai%3D1#/ai/face/report/index~apiId=206
需要修改的地方:
填写自己的百度账号的 keysecret

        char AK[] = "";char SK[] = "";

修改对应图片名:

        char *image1_base64 = getbase64("img1.jpg");char *image2_base64 = getbase64("img2.jpg");

baidudemo.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <curl/curl.h>
#include <cjson/cJSON.h>#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>size_t access_token_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{char *buf = (char *)malloc (size * nmemb + 8 );memset(buf,'\0',size * nmemb + 8);strncpy(buf, ptr, size * nmemb);cJSON *json= cJSON_Parse(buf);char *access_token_result = (char *)stream;strncpy(access_token_result,cJSON_GetObjectItem(json,"access_token")->valuestring,128);//printf("stream:%s\n",(char *)stream);cJSON_Delete(json);free(buf);return size * nmemb;
}
int post_access_token(char *access_token)
{CURL *curl;CURLcode result_code;int error_code = 0;char url[256] = {0};char access_token_url[] = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials";char AK[] = "";char SK[] = "";char access_token_result[128] = {0};curl = curl_easy_init();if (curl) {//std::string url = access_token_url + "&client_id=" + AK + "&client_secret=" + SK;sprintf(url,"%s&client_id=%s&client_secret=%s",access_token_url,AK,SK);//printf("url: %s\n",url );curl_easy_setopt(curl, CURLOPT_URL, url);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);curl_easy_setopt(curl, CURLOPT_WRITEDATA, access_token_result);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, access_token_callback);result_code = curl_easy_perform(curl);if (result_code != CURLE_OK) {fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(result_code));return 1;}//printf("access_token_result:%s\n",access_token_result);strcpy(access_token,access_token_result);curl_easy_cleanup(curl);error_code = 0;} else {fprintf(stderr, "curl_easy_init() failed.");error_code = 1;}return error_code;
}size_t faceMatch_callback(void *ptr, size_t size, size_t nmemb, void *stream) {// 获取到的body存放在ptr中,先将其转换为string格式char *buf = (char *)malloc (size * nmemb + 8 );memset(buf,'\0',size * nmemb + 8);strncpy(buf, ptr, size * nmemb);cJSON *json = cJSON_Parse(buf);printf("data:%s\n",cJSON_Print(json));if(strstr(cJSON_Print(json),"SUCCESS") ==NULL){*((double *)stream) = 0;}else{cJSON *result = cJSON_GetObjectItem(json,"result");//printf("data:%s\n",cJSON_Print(result));      double *faceMatch_result = (double *)stream;*faceMatch_result = cJSON_GetObjectItem(result,"score")->valuedouble;//printf("stream:%f\n",*faceMatch_result);}cJSON_Delete(json);free(buf);return size * nmemb;
}/*** 人脸对比* @return 调用成功返回0,发生错误返回其他错误码*/
int post_faceMatch(double *faceMatch, char *access_token)
{//std::string url = request_url + "?access_token=" + access_token;char url[256] = {0};char request_url[] = "https://aip.baidubce.com/rest/2.0/face/v3/match";sprintf(url,"%s?access_token=%s",request_url,access_token);char *getbase64(char *photoname);char image[] = "\"image\": ";char image_type[] = "\"image_type\": \"BASE64\"";char *image1_base64 = getbase64("img1.jpg");char *image2_base64 = getbase64("img2.jpg");char *params = (char *)malloc(strlen(image1_base64) + strlen(image2_base64)+ 2 * strlen(image) + 2 * strlen(image_type) + 128 );sprintf(params,"[{%s\"%s\", %s}, {%s\"%s\", %s}]",image,image1_base64,image_type,image,image2_base64,image_type);cJSON *json = cJSON_Parse(params);
//      printf("%s\n",cJSON_Print(json));//printf("param : %s\n",params);CURL *curl = NULL;CURLcode result_code;int is_success;curl = curl_easy_init();double faceMatch_result;if (curl) {curl_easy_setopt(curl, CURLOPT_URL, url);curl_easy_setopt(curl, CURLOPT_POST, 1);struct curl_slist *headers = NULL;headers = curl_slist_append(headers, "Content-Type:application/json;charset=UTF-8");curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);//curl_easy_setopt(curl, CURLOPT_POSTFIELDS, params);curl_easy_setopt(curl, CURLOPT_POSTFIELDS, cJSON_Print(json));curl_easy_setopt(curl, CURLOPT_WRITEDATA, &faceMatch_result);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, faceMatch_callback);result_code = curl_easy_perform(curl);free(image1_base64);free(image2_base64);free(params);cJSON_Delete(json);if (result_code != CURLE_OK) {fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(result_code));is_success = 1;return is_success;}*faceMatch = faceMatch_result;curl_easy_cleanup(curl);is_success = 0;} else {fprintf(stderr, "curl_easy_init() failed.");is_success = 1;}return is_success;
}char *getbase64(char *photoname)
{char order[128] = {0};char file[32] = {0};char *base64 = NULL;sprintf(order,"base64 %s > %s_base64",photoname,photoname);system(order);sprintf(file,"%s_base64",photoname);int fd = open(file,O_RDWR);int len = lseek(fd,0,SEEK_END);lseek(fd,0,SEEK_SET);base64 = (char *)malloc(len+1);read(fd,base64,len);base64[len] = '\0';//printf("%d\n",strlen(base64));return base64;
}int main ()
{char access_token[128];double faceMatch = 0;post_access_token(access_token);//printf("access_token: %s\n", access_token);post_faceMatch(&faceMatch,access_token);//printf("faceMatch : %f \n",faceMatch);if(faceMatch > 80){printf("yes\n");}else{printf("no\n");}return 0;
}

编译

gcc baidudemo.c -lcurl -lcjson -o bdface

主函数编写

用继电器来连接电磁锁,继电器引脚初始化为输出(OUTPUT),电磁锁吸合,继电器引脚初始化为输出(INPUT),电磁锁松开。
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");}}int main(int argc, char const *argv[])
{FILE *fp;int n_read;char buff[1280];int num = 0;//1.初始化wiringPi库initWiringPi();//2.初始化门锁(保持闭合的状态)pinMode(24, INPUT);while(1){//3.摄像头拍照,获取一张照片printf("是否进行人脸识别开锁?1是,0否\n");scanf("%d",&num);if(num == 1){printf("准备开启摄像头拍照\n");system("raspistill  -o img2.jpg -q 5");memset(buff,'\0',1280);//清空数据//4.得到照片后和之前的照片进行对比fp = popen("./bdface","r");//(用百度方案)运行人脸识别的程序(两张照片对比,取出结果,是或否)//fp = popen("./xyface","r");//(用翔云方案)//5.读取fp内容,根据结果来判断是否要开锁n_read = fread(buff,1,1280,fp);if(n_read < 0){printf("读取失败\n");perror("n_read");}if(strstr(buff,"yes") != NULL){pinMode(24,OUTPUT);printf("好家伙,是自己人,门已经打开,3s后关闭\n");delay(3000);pinMode(24,INPUT);}else{printf("好家伙,不认识你\n");printf("buff = %s\n",buff);}}}return 0;
}

编译

gcc main.c -lwiringPi -o chack

运行

./chack

基于树莓派实现人脸识别开锁相关推荐

  1. 200行代码如何实现人脸识别开锁应用?

    多种条件限制之下,如何完成真人实景游戏场景下的人脸识别开锁功能?云加社区邀请到腾讯科技产品经理-高树磊,分享他是如何用200行代码,从系统架构.硬件选型.到系统搭建,一步步地实现此精致小巧的人脸识别开 ...

  2. V831——人脸识别开锁

    V831 文章目录 V831 前言 一.读取模型文件 二.识别人脸 1.找人脸 2.添加人脸 3.识别人脸 三.代码实现 总结 人脸开锁 前言 前面做了关于人脸识别的项目,后续会发出来,下午顺便做了一 ...

  3. 基于树莓派的人脸识别解锁门锁设计

    点击查看:基于树莓派的人脸识别解锁门锁设计

  4. 单片机开发---基于ESP32-CAM的人脸识别应用

    背景 学习了一下OpenCV,熟悉了一点基础概念,就寻找了一下单片机上能否支持人脸识别,用来做一些小玩意. 结果还真发现了一个模块叫ESP32-CAM.ESP32-CAM算得上是一款最便宜的支持人脸识 ...

  5. 小米一键上锁工具_小米新品人脸识别智能锁:3D识别加红外,开门只需看一眼...

    随着智能家居不断深入人心,更智慧更便捷的各种产品充盈着我们的生活:就拿最简单的锁门来说,从早些年的挂锁,到执手锁,再到防盗锁,后来经常有人忘记带钥匙,所以又出现了密码锁和指纹锁. 近日,小米有品又刚刚 ...

  6. 树莓派 --- 基于OpenCV实现人脸识别

    目录 参考博客 调百度人脸识别的API也能达到目的,我这里是基于OpenCV进行人脸识别 OpenCV(Open source Computer Vision Library) 是一个开源的计算机视觉 ...

  7. 【优秀毕设】基于OpenCV的人脸识别打卡/签到/考勤管理系统(最简基本库开发、可基于树莓派)

    [优秀毕设]基于OpenCV的人脸识别打卡/签到/考勤管理系统(最简基本库开发.可基于树莓派) 该系统利用Harr级联检测和LPBH进行人脸检测和训练.识别 利用Tkinter完成界面搭建 利用Fla ...

  8. 人脸扫描建模_人脸识别智能锁安全吗?

    人脸识别智能锁从诞生之日开始,社会大众对它的讨论就没有停止过,它的安全性如何?和指纹锁相比,哪个更靠谱?这是大家关注最多的两个问题.今天来系统分析一下人脸识别智能锁的优缺点和发展方向! 人脸识别技术已 ...

  9. 人脸识别智能锁OTP语音芯片选型指南

    人脸识别智能锁是基于人脸识别技术制造的人脸识别技术是基于人的脸部特征,对输入的人脸图像或者视频流进行识别处理.与指纹识别相比,人脸识别锁的主要优点是人脸识别锁可以在不与用户接触的情况下主动获取用户信息 ...

最新文章

  1. 机器学习在线手册:像背托福单词一样学机器学习
  2. >mysql -uroot -p Enter password: ERROR 1045 (28000): Access denied ,被mysql连接问题折磨到问题解决,分享
  3. jdbc java_Java中使用JDBC
  4. java求n个分数之和_N个快速提升分数的学习方法
  5. PHPCMS之 列表和内容页
  6. WPF布局控件AvalonDock介绍以及应用中遇到的一个问题
  7. 二叉树先序、中序、后序的递归算法---《数据结构》
  8. 计算机网络知识点1——概述
  9. arduino驱动步进电机 附代码
  10. windows10 8081端口被占用如何解决
  11. python 生成有效的四要素
  12. 说说C/C++编译的那些事儿
  13. linux下使用安装包安装git
  14. 尚硅谷大数据视频_Hive视频教程
  15. 在Vue中使用icon 字体图标
  16. 计算机应用计术,计算机应用技术.ppt
  17. 计算机系统的环境变量,电脑path环境变量不见了怎么恢复_教你恢复电脑path环境变量的方法...
  18. vue组件引入scss变量_SCSS特色的Vue.js ui组件设计系统
  19. 我得了手机选择恐惧症
  20. 解除安卓车机禁止安装软件_每次换新机后第一时间会安装的安卓软件

热门文章

  1. Console 3000字完整指南,让你不只会用console.log !
  2. MySQL8报错:Public Key Retrieval is not allowed
  3. HTTP ERROR 405 Method Not Allowed
  4. php xls导出文件到本地_使用PHPExcel将数据导出至Excel
  5. 新能源汽车的上游资源争夺战
  6. Nginx动态网站LNMP
  7. matlab代做mhslogic,MATLAB代做|FPGA代做|simulink代做——基于遗传算法的车间布局优化MATLAB源码...
  8. 微信小程序云开发——实现 线上注册,登录的逻辑,并保存账号到云数据库( 四 ):修改密码
  9. JQ input 文件上传并预览 选择图片后,在页面上预览图片,页面渲染
  10. photoshop基础教程 2:界面