我是靠谱客的博主 感性酸奶,最近开发中收集的这篇文章主要介绍智能家居—— 树莓派摄像头捕捉人脸并识别下载安装mjpg-streamer树莓派安装libcurl库树莓派安装openssl库语音控制开启摄像头线程拍照语音控制摄像头拍照,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- 下载安装mjpg-streamer
- 树莓派安装libcurl库
- 树莓派安装openssl库
- 语音控制开启摄像头线程拍照
- 代码及步骤
- 语音控制摄像头拍照
- camera.c
- controlDevice.h
下载安装mjpg-streamer
- 参考博文:智能家居 —— 树莓派下载安装mjpg-streamer(完成拍照+录像+监控)
- 验证拍照功能是否正常
树莓派安装libcurl库
- 下载可以执行
wget --no-check-certificate https://curl.se/download/curl-7.71.1.tar.bz2
- 后续安装编译可以看智能家居——libcurl库简介中的步骤完成
- 验证访问百度网站是否正常
树莓派安装openssl库
-
执行:
wget https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1i.tar.gz
-
报错:
-
解决wget错误:
wget --no-check-certificate https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1i.tar.gz
- 参考博文:解决wget错误:ERROR: The certificate of ‘xxx’ is not trusted.
-
解压、配置、编译并安装
tar -xzf openssl-1.1.1i.tar.gz cd openssl-1.1.1i/ ./config make -j4 sudo make install
- 参考博文:树莓派4B开发笔记(四)c语言https访问百度AI人脸识别接口之安装相关库
语音控制开启摄像头线程拍照
因为祥云后台所要求的图片大小在200k左右
拍照的关键指令:
raspistill -q 5 -t 1 -o image.jpg
- -q 是图片质量,在0~100之间,我们调成5,压缩图片质量,
- -t 是拍照延时,设定1s后拍照
代码及步骤
由于翔云人脸识别次数有限,无法通过每个一段时间拍一次照片,而是采用语音控制开启摄像头线程,识别到人脸就进行拍照,需要用到motion库的人脸识别和拍照指令
- 语音线程会调用command函数,在mian.c的command函数中添加“启动摄像头线程”
if(strcmp("OCR",CmdHandler->command) == 0){
pthread_t cameraThread;
pthread_create(&cameraThread,NULL,cameraThread_func,NULL);
return; //执行拍照就不往下走了,返回
}
- 在main.c文件中执行“摄像头线程调用”函数
void *cameraThread_func(void* data)//起线程的函数有格式要求
{
struct Devices *cameraTemp;
cameraTemp = findDeviceByNum(pDeviceHead, "c1"); //摄像头的设备编号为c1
if(cameraTemp == NULL){ //防止段错误的必需判断
printf("find camera errorn");
pthread_exit(NULL); //在线程中不用return
}
cameraTemp->justDoOnce(); //调用设备的justDoOnce函数
}
- 定义摄像头对象:camera.c文件
#include "controlDevice.h" //自定义设备类的文件
#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>
#include<malloc.h>
#include <fcntl.h>
#include <unistd.h>
size_t readData(void *ptr, size_t size, size_t nmemb, void *stream)
//回调函数,把从后台的数据拷贝给ocrRetBuf
{
strncpy(ocrRetBuf,ptr,1024);
}
char* getFace()
{
printf("人脸数据采集中...n");
system("raspistill -q 5 -t 1 -o image.jpg");//关键命令
while(access("./image.jpg",F_OK) != 0); //判断是否拍照完毕
printf("数据采集完毕n");
char* base64BufFaceRec = getBase64FromFile("./image.jpg");
system("rm image.jpg"); //采集完成删除,防止占内存
return base64BufFaceRec; //返回刚才拍照的base64
}
char * getBase64FormFile(char * filePath){
char *baseBuff =NULL;
char cmd[256] = {'