准备安装的东西
1.安装mjpg-streamer
链接: 树莓派3代 B型 Cortex-A53安装实现MJPG-streamer.
2.安装curl、openssl
链接: 树莓派学习:ARM-Linux搭建https的访问环境(curl、openssl).
3.安装wget
- sudo apt-get update
- sudo apt-get install wget
- wget --version
使用mjpg—streamer获得人脸识别比对照片
//运行start.sh,打开摄像头//
system("/home/pi/mjpg-streamer/mjpg-streamer-experimental/start.sh");
//获得访问者实时照片//
system("wget http://192.168.43.125:8080/?action=snapshot -O ./interviewer.jpg");
//获得照片Base64(平台需要这个)
char *basepic2 = getpictureBase("interviewer.jpg");
实际运用中,使用了线程,以下是我的代码
#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
typedef unsigned int bool;
size_t readData(void *ptr,size_t size,size_t nmemb,void *stream)
{
char buf[1024]={'\0'};
strncpy(buf,ptr,1024);
//printf("%s\n",buf);
if(strstr(buf,"是")!=NULL){
printf("the same people\n");
}
else {
printf("It's two different people\n");
}
}
char *getpictureBase(char *picturepath)
{
char *cmd =(char *)malloc(128);
sprintf(cmd,"base64 %s > basefile",picturepath);
system(cmd);
free(cmd);
int fp=open("./basefile",O_RDWR);
int nut=lseek(fp,0,SEEK_END);
lseek(fp,0,SEEK_SET);
char *getbase =(char *)malloc(nut+2);
memset(getbase,'\0',nut+2);
read(fp,getbase,nut);
close(fp);
system("rm basefile -rf");
return getbase;
}
void *open_mjpg()
{
system("/home/pi/mjpg-streamer/mjpg-streamer-experimental/start.sh");
pthread_exit(NULL);
return NULL;
}
bool postUrl(char *filename)
{
CURL *curl;
CURLcode res;
char *postString ;
pthread_t mjpg_pthid;
char *key="xxxxxx";
char *secret="xxxxxxxx";
int typeId=21;
char *format="xml";
char *basepic1 = getpictureBase("host.jpg");
//printf("pic1=%s\n",basepic1);//
//运行start.sh,打开摄像头//
pthread_create(&mjpg_pthid,NULL,open_mjpg,NULL);
//获得访问者实时照片//
system("wget http://192.168.43.125:8080/?action=snapshot -O ./interviewer.jpg");
//获得照片Base64(平台需要这个)
char *basepic2 = getpictureBase("interviewer.jpg");
//printf("pic2=%s\n",basepic2);
pthread_cancel(mjpg_pthid);
int length = strlen(key)+strlen(secret)+strlen(basepic1)+strlen(basepic2);
postString=(char *)malloc(length);
memset(postString,'\0',length);
//将所有信息拼接在一起(无论是整型还是字符串),由postString里存储要发送信息//
sprintf(postString,"&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s", basepic1,basepic2,key,secret,21,format);
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); // 指定cookie文件
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString); // 指定post内容
curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do "); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,readData);
res = curl_easy_perform(curl);
printf("OK:%d\n",res);
curl_easy_cleanup(curl);
}
return 1;
}
int main(void)
{
postUrl("/tmp/post.html");
return 0;
}
//调用curl_global_init()初始化libcurl
//调用curl_easy_init()函数得到 easy interface型指针
//调用curl_easy_setopt()设置传输选项
//根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务
//调用curl_easy_perform()函数完成传输任务
//调用curl_easy_cleanup()释放内存
//调用curl_global_cleanup()清理掉初始化
注意:
编译时:gcc xxxx.c -lcurl -lssl -lcrypto -lpthread
用处功能
可融入智能家居项目(简易),实现人脸识别开门
硬件:继电器模块、电磁锁、若干导线和树莓派
实际问题处理
在用system打开mjpg时,发生错误:
error:30: ./mjpg_streamer: not found
实则为:start.sh文件未进行相对路径的更换及更换为绝对路径,使得未能在其他文件目录下,打开摄像头。
解决方法:将相对路径修改为绝对路径,使得在任意工作目录下调用start.sh文件,都能够成功开启摄像头进行监控。(此为树莓派上)
将
./mjpg_streamer -i "./input_raspicam.so" -o "./output_http.so -w ./www"
/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"