首页 > 其他分享 >项目分享|基于ELF 1开发板的远程监测及人脸识别项目

项目分享|基于ELF 1开发板的远程监测及人脸识别项目

时间:2024-03-13 14:34:22浏览次数:30  
标签:人脸识别 ELF cv2 开发板 char 人脸 curl buf

今天非常荣幸地向各位小伙伴分享一个由共创社成员完成的远程监测及人脸识别项目,该项目依托ELF 1开发板为核心硬件平台,构建了一套完整的视频监控系统,并在此基础上集成了人脸识别功能。接下来,就为各位小伙伴详尽展示这一项目的相关细节。

项目实现步骤

1.视频监控

这一步骤中需要实现两个程序:

(1)在连接摄像头的ELF 1开发板上实现一个服务器程序:它一边读取摄像头数据,一边等待客户端连接并发送数据。可以用两个线程实现,一个负责采集图像信息;一个负责等待链接,并发送数据。

(2)在手机或电脑上,编写客户端程序,它会从ELF 1开发板上获得数据并显示出来。同样,也可以用两个线程来实现。一个负责接受数据,一个负责显示数据。这2个程序之间,并不需要实现复杂的协议。

MJPG‐streamer是一个开源软件。MJPG-streamer从Linux UVC兼容的网络摄像头、文件系统或其他输入插件获取JPG,并通过HTTP、RTSP、UDP等将其作为M-JPEG流式传输到WebBrowser、VLC和其他软件。

MJPG-streamer 需要很少的CPU和内存资源就可以工作,大部分编码工作都是摄像头完成的,所以对于内存和性能都有限的嵌入式系统十分适用。

将MJPG-streamer移植并运行在ARM板上,在同一局域网内的设备输入正确的ip地址即可直接观看到视频画面。对ARM板的性能要求不高,主频200MHz的ARM芯片也能实现。

下载MJPG-streamer:

git clone https://github.com/shrkey/mjpg-streamer

启动MJPG-streamer后,输入ip地址以及端口号即可看到摄像头内容如下图:

同时后续人脸识别功能中需要能够从视屏流中提取出照片,需要修改MJPG-streamer源码,使其支持拍照功能。具体修改如下:

修改完成之后只要向有名管道/tmp/webcom写入相应的字符串就能实现拍照功能。

# cd mjpg-streamer-rc63/plugins/output_file
 
# vim output_file.c
 
//在96行 函数 void*worker_thread(void *arg) 体中加入以下代码:
 
charbuf[10];   //
intflags = 0;   //
intfd_com = 0; //打开管道
stop_num = 0; //拍照计数
 
if ( access(“/tmp/webcom”,F_OK) < 0 )    //创建有名管道用于接收拍照命令
{
    if ( mkfifo(“/tmp/webcom”,0666 ) < 0)
    {
        Printf(“ photo fifo create failed\n”);
    }
}
  fd_com = open (“/tmp/webcom”,O_RDONLY,0666);
  if (fd < 0)
{
    perror (“open the file webcom error”);
}
 
//在while( ok >= 0 && !pglobal->stop){ 后加入
 
if (flags == 0)
{
    while(1)
    {
        reade(fd_com,buf,sizeof(buf));
        if(strncmp(buf,”danger”,6) == 0)    //拍11张照片
        {
            flags = 1;   
            bzero(buf,sizeof(buf));
            break;
        }
    if(strncmp(buf,”one”,3) == 0)   //拍1张照片
    {
        flags = 2;
        bzero(buf,sizeof(buf));
        break;
    }
}
}
 
 
//在if (delay > 0){
 
   usleep(1000*delay);
 
}后加入
 
stop_num++
if(flags == 1)        //判断拍照的数量
{
    if ( stop_num > 9)
   {
        stop_num= 0;
        flsgs= 0;    
    }
}
elseif (flags == 2)
{
    stop_num= 0;
    flags= 0;
}
2.人脸检测

'haarcascade_frontalface_default.xml'是Opencv中已经训练好的人脸分类器文件。它是基于Haar特征的级联分类器,可以用于检测正面的人脸。该文件是通过大量的正负样本训练而成,可以用于人脸检测的应用中。具体调用代码如下:

#! user/bin/python
#- * -coding:UTF-8 - * -
 
import cv2
import numpy as np
 
 
def myfilter(img):
    # 图像转化为灰度格式
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
 
    # 导入人脸级联分类器引擎,'xml'文件包含训练好的人脸特征
          
    face_cascade=cv2.CascadeClassifier('  \
    /home/xuyang/test1/haarcascade_frontalface_default.xml')
    #为防止报错使用该文件在opencv下的绝对路径
    # 用人脸级联分类器引擎进行人脸识别,返回的faces为人脸坐标列表
    faces = face_cascade.detectMultiScale(gray)
    
    return faces
 
def myfaces_count(img,faces):    
    count = 0 #人脸计数初值
    # 对每张脸,操作如下
    for (x,y,w,h) in faces:
        '''画矩形圈出人脸
        输入参数依次为:图片,右上角的点坐标,矩形大小,线条颜色,宽度
        '''
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),2)
        count += 1 # 累计人数
        # 把统计人数显示出来
        cv2.putText(img,'{}'.format(count),(x,y-7),3,1.2,(0,0,255),2)
 
    return img
 
#打开mjpg-streamer视频流(通过URL)
#cap = cv2.VideoCapture('http://192.168.106.128:8080/?action=stream')
#打开视频
cap = cv2.VideoCapture('video.mp4')
y = 0
#获取视频相关数据以便于保存视频
width = int(cap.get(3))
height = int(cap.get(4))
fps = cap.get(5)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
output_file  = 'output_video.mp4'
video_writer = cv2.VideoWriter(output_file,fourcc,fps,(width,height),isColor = True)
while True:
    # 读取每一帧图像
    ret, frame = cap.read()
    
    if not ret:
        break
    if y == 0:
        faces = myfilter(frame)  #人脸识别特征每10次循环做一次 不然运行速度太慢了
    y = y + 1
    if y == 10:
        y =0
    frame = myfaces_count(frame,faces)
    # 在窗口上显示当前帧的图像
    cv2.imshow("Frame", frame)
    video_writer.write(frame) #保存视频
    # 按下 'q' 退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
 
# 关闭所有窗口及释放对象
cap.release()
video_writer.release()
cv2.destroyAllWindows()

3.人脸识别

鉴于开发板运行人脸检测模型已经有一定的运算压力,同时为了丰富项目内容,人脸识别部分我们通过传送照片在云端完成。

本文通过libcurl库调用云端API实现人脸识别。需要libcurl库支持https协议。要让LibCurl库支持https协议实现人脸识别,就需要安装移植Openssl这个库。此篇人脸识别介绍主要目的是判断两张人脸图片的相似程度或者接近程度。安装移植LibCurl库和Openssl库不多赘述。

首先是注册一个OCR云识别平台账号如图:

询对应平台的API和接口地址:

下面是调用人脸识别API的代码:

#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>
#include <time.h> 
 
typedef unsigned int bool;
#define true 1            
#define false 0
 
 
char buf[1024]={'\0'};
 
 
size_t readData(void *ptr, size_t size, size_t nmemb, void *stream)
{
    strncpy(buf,ptr,1024);
}
 
char* getPic(char *pic)
{
    char cmd[128]={'\0'};
    memset(cmd,'\0',128);
    sprintf(cmd,"base64 %s > tmpFile",pic);
    system(cmd);
    int fd = open("./tmpFile",O_RDWR);
    int filelen = lseek(fd,0,SEEK_END);
    lseek(fd,0,SEEK_SET);
    char *base64Buf = (char*)malloc(filelen + 8);
    memset(base64Buf,'\0',filelen + 8);
    read(fd,base64Buf,filelen+8);
    close(fd);
    system("rm -f tmpFile");
    return base64Buf;
}
 
 
 
bool postUrl()//POST请求
{
    char buf1[1024] = {0},buf2[1024] = {0};
    unsigned long long counter = 0;
 
    static char *folder = "/tmp";
    time_t t;
    struct tm *now;
    t = time(NULL);
    now = localtime(&t);
  
    system("echo one > /tmp/webcom"); //向有名管道webcom写入字符串实现拍照
    strftime(buf1, sizeof(buf1), "%%s/%Y_%m_%d_%H_%M_%S_picture_%%09llu.jpg", now);
    snprintf(buf2, sizeof(buf2), buf1,"/tmp", counter);
    sleep(1);
    CURL *curl;
    CURLcode res;
    char *postString = NULL;
    char *base64Buf1 = getPic(buf2);
    char *base64Buf2 = getPic("./me5.jpg");
 
    char *key = "xxxxxxxxxxxxxxxxxxxxxxx";
    char *secret = "xxxxxxxxxxxxxxxxxxxxxxx";
    int typeld = 21;
    char *format = "xml";
    int len = strlen(key)+strlen(secret)+strlen(format)+ \
    strlen(base64Buf1)+strlen(base64Buf2)+128;
    printf("%d",len);
    postString = (char *)malloc(len);
                
    sprintf(postString,"img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s",\
    base64Buf1,base64Buf2,key,secret,typeld,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("res = %d\n",res);
        if(strstr(buf,"是")!=NULL)
        {
            printf("is same people\n");
        }
        else
        {
            printf("not the same people\n");
        }
            curl_easy_cleanup(curl);
    }
    return true;
}
 
int main(void)
{
    postUrl();
}

本项目的工作流程设计逻辑是,首先系统启动视频监控机制,智能判断画面中是否存在人脸;一旦检测到人脸,则触发拍照动作,然后通过调用云端API进行人脸识别对比并返回结果,上述视频的对比结果如下:

左图为提前准备好的相关人脸的照片,右图为拍照得到的照片,下面为对比结果判定为是同一个人。同时开发板返回结果也正确:

至此,关于基于ELF 1开发板实现的远程监测及人脸识别项目的介绍告一段落。衷心期待这项案例能够对正在钻研嵌入式开发的小伙伴带来启示与借鉴,助力各位的学习之旅。 

标签:人脸识别,ELF,cv2,开发板,char,人脸,curl,buf
From: https://blog.csdn.net/ElfBoard/article/details/136642385

相关文章

  • Be Your Own Teacher: Improve thePerformance of Convolutional Neural Networks via
    摘要本文中,提出了一种名为自蒸馏的通用训练框架,该框架通过缩小网络的规模而不是扩大网络的规模,而提高卷积神经网络的性能。传统的知识蒸馏是一种网络之间的知识转换方法,它迫使学生神经网络接近预先训练的教师神经网络的softmax层输出,与此不同,所提出的自蒸馏框架提取网络......
  • 详解Go程序添加远程调用tcpdump功能,exec.Command("sh", "-c", "ps -elf | grep xxx |
    摘自:https://www.jb51.net/article/249001.htm这篇文章主要介绍了go程序添加远程调用tcpdump功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 最近开发的telemetry采集系统上线了。听起来高大上,简单来说就是一个grpc/udp服务端,用......
  • golang,再也不用管道了,exec.Command("bash", "-c", "ps -elf | grep xxx")
    摘自:https://www.jb51.net/article/249001.htmfuncSystem_CmdCombinedOutput(cmd_linestring)([]byte,error){mutex_exec.Lock()defermutex_exec.Unlock()//old_handler:=C.set_SIGCHLD_DFL()//自己实现,用c语言保存当前的信号屏蔽字//def......
  • Self-Attention和Attentiond的区别
    2024.3.12Self-Attention和Attentiond的区别注意力机制是一个很宽泛(宏大)的一个概念,QKV相乘就是注意力,但是他没有规定QKV是怎么来的通过一个查询变量Q,去找到V里面比较重要的东西假设K==V,然后QK相乘求相似度A,然后AV相乘得到注意力值Z,这个Z就是V的另外一种形式的表示Q可以是任何......
  • OMAP-L138 + FPGA开发板(Pin-To-Pin国产FPGA)
    XQ138F-EVM是广州星嵌电子科技有限公司基于TIOMAP-L138(定点/浮点DSPC674x+ARM9)+FPGA处理器研制的开发板;OMAP-L138选用TI德州仪器的TMS320C6748+ARM926EJ-S异构双核处理器,主频456MHz,高达3648MIPS和2746MFLOPS的运算能力;FPGA采用中科亿海微eHiChip6家族EQ6......
  • Pixel 刷机教程(已Root 保数据升级)(使用PixelFlasher)
    本教程留作本人备用,下面教程基于Pixel6Pro复现⚠️警告☣️如果想保留数据一定不要:下载出厂镜像然后解压,然后双击flash-all.bat,此操作会清空数据!!!!!!!!下载刷机包去官网下载刷机包即可(国内可访问):https://developers.google.cn/android/images?hl=zh-cn出厂映像就是线刷包⭐建议......
  • 人脸识别算法
    人脸识别已经成为了计算机视觉与生物识别领域被研究最多的主题之一人脸检测 :提取图像中的人脸,划定边界;人脸对齐 :使用一组位于图像中固定位置的参考点来缩放和裁剪人脸图像;人脸表征 :人脸图像的像素值会被转换成紧凑且可判别的特征向量,或称模板;人脸匹配 :选取并计算两个模板......
  • Augmentation-Free Self-Supervised Learning on Graphs论文阅读笔记
    Abstract我们认为,如果没有精心设计的增强技术,图上的扩充可能会任意的做出表现,因为图的底层语义会极大地变化。因此,现有的基于增强的方法的性能高度依赖于增强方案的选择,即与增强相关的超参数。在本文中,我们提出了一种新的无增强图自监督学习框架,即AFGRL。具体地说,我们发现通过与......
  • Self-attention
    输入n个向量,要输出相同个数的向量(比如,输入一个句子,输出句子中每个词的词性。每个单词转化为向量可以用one-hotvector或者wordembedding方法)如果将每个向量连一个FC(fullyconnectednetwork),会出现像Isawasaw这种情况,两个saw单词一样,所以两个FC输出结果也会一样这时,我们可以......
  • Bootstrap Your Own Latent A New Approach to Self-Supervised Learning论文阅读笔记
    BootstrapYourOwnLatentANewApproachtoSelf-SupervisedLearning论文阅读笔记Abstract​ 我们提出了BYOL,一种新的自监督图像表示学习的方法。BYOL依赖于两个神经网络,即在线网络和目标网络,它们相互作用和相互学习。从一个图像的增广视图出发,我们训练在线网络来预测同一图......