C语言人脸识别——翔云平台调用(含wget安装)

准备安装的东西

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"
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值