C语言实现基于翔云平台的人脸识别demo2(树莓派3B)

  • 实现目标
  • 树莓派安装mjpg-streamer
    • 在树莓派下依次执行以下指令
    • 修改start.sh文件(用来开启摄像头进行监控)
      • A:树莓派摄像头为CSI接口
      • B:树莓派摄像头为USB接口
  • 树莓派开启摄像头
  • mjpg-streamer监控功能的测试
  • 实现方式
    • 方式一(不带实时监控功能)
    • 方式二(使用mjpg-streamer来进行拍照)
  • 实时监控和人脸识别开门

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

实现目标

在demo1的基础上,使用树莓派摄像头(CSI接口)获取第二张照片(访问者),再进行人脸识别;

树莓派安装mjpg-streamer

在树莓派下依次执行以下指令

sudo apt-get update     //更新软件列表
sudo apt-get upgrade    //更新软件sudo apt-get install subversion
sudo apt-get install libjpeg8-dev  //JPEG支持库
sudo apt-get install imagemagick
sudo apt-get install libv4l-dev
sudo apt-get install cmake  //下载编译工具sudo apt-get install git
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer-master/mjpg-streamer-experimentalmake all
sudo make install

修改start.sh文件(用来开启摄像头进行监控)

打开在mjpg-streamer-experimental目录下的start.sh文件

./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"

A:树莓派摄像头为CSI接口

第一步:将input_uvc.so修改为input_raspicam.so
第二步:将相对路径修改为绝对路径,使得在任意工作目录下调用start.sh文件,都能够成功开启摄像头进行监控。下面的绝对地址是我自己的,请修改为自己相应的绝对地址

/home/pi/mjpg-streamer/mjpg-streamer-experimental/mjpg_streamer -i "/home/pi/mjpg-streamer/mjpg-streamer-experimental/input_raspicam.so" -o "/home/pi/mjpg-streamer/mjpg-streamer-experimental/output_http.so -w /home/pi/mjpg-streamer/mjpg-streamer-experimental/www"

B:树莓派摄像头为USB接口

只需将相对路径修改为绝对路径即可

树莓派开启摄像头

执行以下代码

sudo raspi-config

界面如下:

按上下键选中第5个Interfacing Options后,敲击Enter键,如下图所示:

选中Camera,敲击Enter

选中yes,敲击Enter

按左右键选中Finish,敲击Enter

同意重启树莓派或执行以下代码进行重启

sudo reboot

mjpg-streamer监控功能的测试

运行start.sh可执行文件
若程序没有报错退出,则运行成功
通过网页访问: http://<树莓派地址>:8080
查看Stream那一栏,即可观察到实时的监控图像

实现方式

方式一(不带实时监控功能)

在调用getBase64()函数获取第二张的Base64流前,使用system函数让树莓派开启摄像头进行拍照。即在postUrl()函数的第五行加一句代码

#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("./host.jpg");/*************************添加的代码**************************************///其中-w和-h:来设定照片的大小; -o:来设置生成的照片名字为visitor.jpg; ./:放在当前目录下system("raspistill -w 700 -h 525 -o ./visitor.jpg");/************************************************************************/char* img2 = getBase64("./visitor.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");// 指定urlcurl_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;
}

方式二(使用mjpg-streamer来进行拍照)

首先使用system函数调用在mjpg-streamer-experimental目录下的start.sh可执行文件来开启摄像头进行监控;
再在调用getBase64()函数获取第二张的Base64流前,使用system函数获取访问者的脸部照片;

#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("./host.jpg");/*************************添加的代码**************************************///openCamera为start.sh可执行文件的绝对地址,请根据自己的路径改const char* openCamera = "/home/pi/mjpg-streamer/mjpg-streamer-experimental/start.sh";system(openCamera); //调用start.sh可执行文件//获取访问者的照片system("wget http://<树莓派ip地址>:8080/?action=snapshot -O ./visitor.jpg");/************************************************************************/char* img2 = getBase64("./visitor.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");// 指定urlcurl_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;
}

实时监控和人脸识别开门

对第二种方式的代码进行修改和使用,即能完成

添加的器材:一个电磁门锁模块,一个5V的电池(给电磁门锁供电)、一个继电器(作为电磁门锁和5V电池之间的开关)

大概思路说明
1、添加接收命令端(如:语音识别模块、socket,也可通过scanf来获得)
2、先开启摄像头,即先执行start.sh可执行文件
3、让接收命令端不停地获取命令,并对得到的命令进行判断
4、若触发开门,则调用postUrl()函数,对返回值进行判断;
5、若为1,则将继电器的引脚电平拉低;否则,引脚电平为高

C语言实现基于翔云平台的人脸识别demo2(树莓派)相关推荐

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

    C语言实现基于翔云平台的人脸识别demo1(linux) 实现的目标 安装openssl第三方的库 安装libcurl第三方的库 购买使用翔云平台人脸识别的次数 libcurl的使用 **参考以下博文 ...

  2. 基于翔云平台做人脸识别

    目录 1.[翔云人脸识别的API](https://www.netocr.com/face.html) 1.1 图片img上传是以base64流的形式上传 2.代码 1.翔云人脸识别的API 1.1 ...

  3. 基于翔云OCR云平台的人脸识别(1)

    基于翔云OCR云平台的人脸识别 本节通过翔云OCR云平台来实现人脸识别.调用人脸对比API,通过https post方式向云服务器提交两张需要对比的图片Base64流以及其他信息,云服务器处理后返回判 ...

  4. 基于翔云OCR云平台的人脸识别(2)

    基于翔云OCR云平台的人脸识别(2) 项目思路 raspistill命令的相关参数说明 -v:调试信息查看 -w:图像宽度 -h:图像高度 -rot:图像旋转角度,只支持 0.90.180.270 度 ...

  5. opensll、libcurl库安装的使用,树莓派CSI摄像头的配置,树莓派调用智能API平台实现人脸识别、树莓派配置中文环境

    接着上一节人工智能翔云平台介绍: 人工智能OCR识别: OCR 是英文Optical Character Recognition的缩写,意思是光学字符识别,也可简单地称为文字识别,是文字自动输入的一种 ...

  6. 基于百度AI平台的人脸识别评分小程序

    face-recognition-scoring-applet 开放源代码,遵循Apache License 2.0 效果展示 可切换摄像头.拍照.从相册选择 效果预览 小程序账号注册及配置 地址:h ...

  7. 基于汉王云API的人脸识别

    http://down.51cto.com/data/2076078 源码地址,使用汉王云API,得预先申请汉王API key 转载于:https://blog.51cto.com/p6xos/167 ...

  8. AI 实战篇 |基于 AI开放平台实现 人脸识别对比 功能,超详细教程【附带源码】

  9. 阿里云平台的人脸识别接口测试

    需要导入的包: 必备模块:import urllib 请求模块:import urllib.request 解析模块:import urllib.parse  可以拆分URL,也可以拼接URL 数据交 ...

最新文章

  1. [导入]控制IFrame里的页面滚动原来如此简单:)
  2. 第十七届全国大学生完全车模组竞速赛方案 - 草案
  3. php里面的mark,PHP CommonMarkCQL 用法 手册 | 示例代码
  4. CIFAR和SVHN在各CNN论文中的结果
  5. iOS 应用内跳转到appstore里下载
  6. 【转载】那么明亮的sz4j
  7. python3生成器类题目易错写法
  8. 沃尔沃召回部分进口及国产车 共计131591辆
  9. android权限申请方法,安卓开发Android6+权限申请管理用户拒绝权限一键解决方案...
  10. 汇编语言及应用——程序设计
  11. 数字信号处理matlab版答案,数字信号处理matlab版答案
  12. Win7安装IIS详解
  13. word2vec使用说明
  14. CDH安装服务和下载parcels包
  15. 袁腾飞老师的幽默历史课
  16. 小程序拼团商城系统开发
  17. 如何编写智能合约(Smart Contract)?(II)建立加密代币
  18. Win11共享文件夹打不开怎么办
  19. 信息安全概论(第3版)课后习题答案 牛少彰 崔宝江 李剑编著
  20. SQLyog连接本地数据库报2003错误

热门文章

  1. 笔记-【游戏制作教程】30分钟制作一款游戏 (1)【Unity】
  2. vue项目实战--如何在手机中查看vuecli3/vuecli2项目?
  3. 关于恶魔与天使的断想
  4. NYOJ-325Zb的生日
  5. 可编程电源输出过冲怎么办?解决方案在这里
  6. Paint画笔常用API
  7. Java查询每个部门总人数(包含每个部门层级的总数)
  8. EasyDSS如何解决并发过大,磁盘读写跟不上的问题?
  9. 1. maven环境本地搭建配置
  10. 计算机网络原理期末复习