0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

ElfBoard 2024-03-13 16:41 次阅读

今天非常荣幸地向各位小伙伴分享一个由共创社成员完成的远程监测及人脸识别项目,该项目依托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地址以及端口号即可看到摄像头内容如下图:

wKgaomXxZX2AHZ8CAAdzp1_venQ147.png

同时后续人脸识别功能中需要能够从视屏流中提取出照片,需要修改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云识别平台账号如图:

wKgZomXxZfaAeh-AAAEHOC4OGxA671.png

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

wKgaomXxZhSARgfgAARfyoy2h9Q860.png

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

#include #include #include #include #include #include #include #include #include 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进行人脸识别对比并返回结果,上述视频的对比结果如下:

wKgZomXxZk-Ae-nBAAVrvxL1zDQ043.png

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

wKgZomXxZniAO-gjAAHxpbDUyN0544.png

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19014

    浏览量

    303130
  • Linux
    +关注

    关注

    87

    文章

    11222

    浏览量

    208890
  • 远程监测
    +关注

    关注

    0

    文章

    144

    浏览量

    18225
  • 开发板
    +关注

    关注

    25

    文章

    4943

    浏览量

    97177
  • 人脸识别
    +关注

    关注

    76

    文章

    4005

    浏览量

    81757
收藏 人收藏

    评论

    相关推荐

    如何在NXP源码基础上适配ELF 1开发板的PWM功能

    本次源码适配项目是在NXP i.MX6ULL EVK评估所搭载的Linux内核源码(版本为Linux-imx_4.1.15)基础上进行的,主要目标是通过调整功能接口引脚配置,使其适应ELF
    的头像 发表于 09-10 10:00 875次阅读
    如何在NXP源码基础上适配<b class='flag-5'>ELF</b> <b class='flag-5'>1</b><b class='flag-5'>开发板</b>的PWM功能

    数量有限:6款“入门+项目进阶”开发板限时特惠!30余套项目案例免费领!

    ​华清远见研发中心,面向个人学习、学生毕设、高校教学,精心打造六款“入门+项目进阶”开发板。这六款开发板,面向嵌入式、物联网方向的学习,均配套了丰富的学习资料及综合项目实战案例。后台私
    的头像 发表于 08-20 14:17 322次阅读
    数量有限:6款“入门+<b class='flag-5'>项目</b>进阶”<b class='flag-5'>开发板</b>限时特惠!30余套<b class='flag-5'>项目</b>案例免费领!

    嵌入式学习-飞凌嵌入式ElfBoard-项目分享|基于ELF 1S开发板完成的物联网开源项目

    工程师借助ELF 1S开发板完成的嵌入式物联网项目,见证智慧与技术的火花。 关于这个项目的思维导图,如下图所示: 接下来,将会从云-网-边-
    发表于 05-16 09:19

    飞凌嵌入式-ElfBoard-项目分享|基于ELF 1S开发板完成的物联网开源项目

    工程师借助ELF 1S开发板完成的嵌入式物联网项目,见证智慧与技术的火花。 关于这个项目的思维导图,如下图所示: 接下来,将会从云-网-边-
    发表于 05-16 09:12

    项目分享|基于ELF 1S开发板完成的物联网开源项目

    ElfBoard作为飞凌嵌入式旗下教育品牌,自成立以来,持续吸引着各界的瞩目,其中也赢得了一些工程师的青睐。今天,就和各位小伙伴分享一位杰出工程师借助ELF1S开发板完成的嵌入式物联网项目,见证智慧
    的头像 发表于 05-14 09:03 1316次阅读
    <b class='flag-5'>项目</b>分享|基于<b class='flag-5'>ELF</b> <b class='flag-5'>1</b>S<b class='flag-5'>开发板</b>完成的物联网开源<b class='flag-5'>项目</b>

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-在ELF 1开发环境中使用QT Creator进行远程调试

    所有项目”,可以在/home/elf/work/helloworld目录下看到编译生成的应用程序: (3)把helloworld二进制文件拷贝到ELF 1
    发表于 04-30 09:45

    飞凌嵌入式ElfBoard ELF 1板卡-在ELF 1开发环境中使用QT Creator进行远程调试

    /elf/work/helloworld目录下看到编译生成的应用程序:(3)把helloworld二进制文件拷贝到ELF 1开发板的/home/root路径下进行测试:root@
    发表于 04-30 09:35

    项目分享|基于ELF 1开发板的MQTT远程温湿度监测系统

    今天非常荣幸向各位小伙伴详细展示一个由共创社成员完成的MQTT远程温湿度监控系统项目。该项目借助ELF1开发板作为核心技术支撑,成功实现了对
    的头像 发表于 04-26 09:54 454次阅读
    <b class='flag-5'>项目</b>分享|基于<b class='flag-5'>ELF</b> <b class='flag-5'>1</b><b class='flag-5'>开发板</b>的MQTT<b class='flag-5'>远程</b>温湿度<b class='flag-5'>监测</b>系统

    ELF技术贴|如何在开发板上实现对Java的支持

    Java作为一种功能强大且广泛应用的编程语言,具有广泛的适应性和实用性。在ELF1开发板上集成Java支持,无疑将赋予嵌入式开发者更广阔的选择空间,今天就为各位小伙伴详细解析如何在ELF1
    的头像 发表于 03-13 16:47 473次阅读
    <b class='flag-5'>ELF</b>技术贴|如何在<b class='flag-5'>开发板</b>上实现对Java的支持

    项目分享|基于ELF 1开发板的车牌识别系统

    项目选用ElfBoardELF1开发板作为核心硬件平台,利用USB接口连接的摄像头捕捉并识别车牌信息。一旦车牌成功识别,系统会触发绿灯指示
    的头像 发表于 03-12 09:22 438次阅读
    <b class='flag-5'>项目</b>分享|基于<b class='flag-5'>ELF</b> <b class='flag-5'>1</b><b class='flag-5'>开发板</b>的车牌<b class='flag-5'>识别</b>系统

    ELF 1技术贴|如何将Python3.6.9移植到开发板

    ELF1开发板的Linux4.1.15eMMC镜像中,默认预装了Python2.7。为了适应更多应用场景,有些小伙伴可能需要移植其他版本的Python,下面将以Python3.6.9为例详细介绍
    的头像 发表于 02-22 14:06 404次阅读
    <b class='flag-5'>ELF</b> <b class='flag-5'>1</b>技术贴|如何将Python3.6.9移植到<b class='flag-5'>开发板</b>上

    ELF 1 开发板上实现读取摄像头视频进行目标检测

    当前,将AI或深度学习算法(如分类、目标检测和轨迹追踪)部署到嵌入式设备,进而实现边缘计算,正成为轻量级深度学习算法发展的一个重要趋势。今天将与各位小伙伴分享一个实际案例:在ELF1开发板上成功部署
    的头像 发表于 01-24 10:38 654次阅读
    在<b class='flag-5'>ELF</b> <b class='flag-5'>1</b> <b class='flag-5'>开发板</b>上实现读取摄像头视频进行目标检测

    学习笔记分享|使用C库函数控制ELF 1开发板的LED

    ELF1/ELF1S开发板及显示屏)在嵌入式Linux系统开发中,通过编程控制硬件资源是至关重要的技能之一,今天跟各位小伙伴分享一篇专注于介绍如何使用C库函数控制
    的头像 发表于 01-19 11:12 525次阅读
    学习笔记分享|使用C库函数控制<b class='flag-5'>ELF</b> <b class='flag-5'>1</b><b class='flag-5'>开发板</b>的LED

    ELF 1技术贴|在NXP源码基础上适配ELF 1开发板的LED功能

    本次源码适配工作是在NXPi.MX6ULLEVK评估的Linux内核源码(特定版本:Linux-imx_4.1.15)基础上进行的。主要目标是调整功能接口引脚配置,以适应ELF1开发板。下面以
    的头像 发表于 12-29 10:04 804次阅读
    <b class='flag-5'>ELF</b> <b class='flag-5'>1</b>技术贴|在NXP源码基础上适配<b class='flag-5'>ELF</b> <b class='flag-5'>1</b><b class='flag-5'>开发板</b>的LED功能

    ELF 1开发板试用】+ 8.1 MQTT开发——连接阿里云【项目复现】

    是基于订阅者模型架构的,客户端如果互相通信,必须是在同一订阅主题下,即都订阅了同一个topic,客户端之间是没办法直接通讯的。 项目部署 环境 开发板:ELF1 开发环境
    发表于 12-15 22:00