ai人脸识别测温一体机设计(代码片段)

DS小龙哥 DS小龙哥     2023-03-09     156

关键词:

1. 前言

在AI人工智能发展应用的过程中,人脸识别技术得到了重用。目前在人脸识别相关的技术已经深入到生活方方面面。在公共安全、智能安防、手机认证等多个领域得到应用,比如: 通过人脸识别来解锁手机,通过人脸识别进入某些政务软件平台或是银行APP, 还是各大门店,超市使用的"支付宝刷脸支付"等等,这些应用大大方便了人们生活。

目前,因为新冠疫情防控的需要,人人出门都需要戴口罩,查验健康码和测量体温,在办公大楼门口、地铁口、小区门口、商场门口人流量都比较大,传统的人工测量体温方式,费时费力、效率比较低,而且人工近距离核验温度,易产生交叉感染风险。

当前文章就利用华为云提供的AI人脸识别接口+红外测温传感器MLX90614ESF(DCI)+瑞芯微RK3399完成AI人脸测温一体机设计,方便测量来往人员的体温,减轻防疫防控工作人员的负担。

实现的具体功能: 当检测到人脸时,就测量温度,并检测有没有带口罩;在显示屏上实时显示温度信息,如果温度超出设置值,会通过语音播报提示。如果人员没有戴口罩,会语音提示带口罩。

2. 软硬件设计

(1)核心板采用瑞芯微RK3399,运行ubuntu18.04 64位系统,编译器采用aarch64-linux-gcc。摄像头采用罗技的720p摄像头。

(2)软件界面采用QT设计,在RK3399的ubuntu18.04系统里可以直接安装QT开发环境完成开发,也可以在PC机上交叉编译后将程序和相关库拷贝过来。

(3)测温传感器采用MLX90614ESF(DCI),这个是红外非接触式测温传感器,测量距离可达到1米左右,这个模块是IIC协议接口。

3. 华为云人脸识别服务

3.1 开通人脸识别服务

官网地址: https://www.huaweicloud.com/product/face.html

3.2 人脸识别接口功能

华为云提供的人脸检测可以对输入图片进行人脸检测和分析,输出人脸在图像中的位置、人脸关键点位置、人脸关键属性等信息。支持识别JPG、PNG、JPEG、BMP等格式的图片,上传图片时选择将图片转为Base64编码上传。

(1)接口请求方式: POST

(2)接口请求地址

格式:
https://face.endpoint.myhuaweicloud.com/v2/project_id/face-detect

示例:
https://face.cn-north-4.myhuaweicloud.com/v2/0e5957be8a00f53c2fa7c0045e4d8fbf/face-detect

(3)请求头的参数


 "X-Auth-Token": "******"   

X-Auth-Token字段是访问华为云的任何API接口都需要填,获取方法看这里: https://bbs.huaweicloud.com/blogs/317759 翻到2.3小节。

(4)请求Body参数

image_base64字段   : 存放Base64编码后的图片数据,大小不超过8MB,建议小于1MB。

attributes字段     :这个参数可以选择不填,不填就只是返回人脸的在图片里的尺寸位置。如果希望获取更多的属性列表,可以填下面之这些属性:
2:年龄
4:装束(帽子、眼镜)
6:口罩
7:发型
8:胡须
11:图片类型
12:质量
13:表情
21:人脸图片旋转角(顺时针偏转角度),支持0°、90°、180°和270°图片旋转。

多个属性间使用逗号(,)隔开。

(5)响应参数

如果图像里没有人脸,返回的数据是这样的:
"faces":[]

如果没有填额外的属性,返回的数据是这样的:

 "faces": [
  
   "bounding_box": 
    "top_left_x": 61,
    "top_left_y": 54,
    "width": 114,
    "height": 151
   
  
 ]


填了额外的属性,返回的数据是这样的:

 "faces": [
  
   "bounding_box": 
    "top_left_x": 61,
    "top_left_y": 54,
    "width": 114,
    "height": 151
   ,
   "attributes": 
    "age": 30,
    "dress": 
     "glass": "none",
     "hat": "none"
    ,
    "mask": "none",
    "hair": "short",
    "beard": "none",
    "phototype": "internet photo",
    "quality": 
     "total_score": 0.62109375,
     "blur": 0.3359375,
     "pose": 0.266357421875,
     "occlusion": 0.330810546875,
     "illumination": 0.378662109375
    ,
    "expression": 
     "type": "neutral",
     "probability": 0.9991200566291809
    
   
  
 ]

3.3 调试接口

地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product=FRS&api=DetectFaceByFile

如果最开始想体验一下接口,了解参数的含义,可以先使用在线调试接口测试一下效果。

现在人脸检测的调试接口可以直接在网页上选择本地图片,不用再传bash64数据,测试更加方便。

4. 设计设备端程序

4.1 调用人脸检测接口

//人脸检测
void Widget::FaceCheck(QImage image)

    QString requestUrl;
    QNetworkRequest request;

    //存放图片BASE64编码
    QString imgData;

    //设置请求地址
    QUrl url;

    //人脸检测请求地址
    requestUrl = QString("https://face.%1.myhuaweicloud.com/v2/%2/face-detect")
            .arg(SERVER_ID)
            .arg(PROJECT_ID);

    //设置数据提交格式
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));

    //将图片进行Base64编码
    imgData = QString(toBase64(image)); //编码后的图片大小不超过2M
    //设置token
    request.setRawHeader("X-Auth-Token",Token);

    //构造请求
    url.setUrl(requestUrl);
    request.setUrl(url);

    QString post_param=QString
               (""
                 "\\"image_base64\\": \\"%1\\","
                 "\\"attributes\\":%2"
                "").arg(imgData).arg("6");

    //发送请求
    manager->post(request, post_param.toUtf8());

4.2 接口数据解析

    if(function_select==6)
    
        //解析数据
        QJsonParseError json_error;
        QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);
        if(json_error.error == QJsonParseError::NoError)
        
            //判断是否是对象,然后开始解析数据
            if(document.isObject())
            
                QJsonObject obj = document.object();
                //解析错误代码
                if(obj.contains("faces"))
                
                    QJsonArray face_arr=obj.take("faces").toArray();

                    for(int i=0;i<face_arr.size();i++)
                    
                        QJsonObject object=face_arr.at(i).toObject();
                        if(object.contains("bounding_box"))
                        
                            QJsonObject obj1=object.take("bounding_box").toObject();

                            int top_left_x=0;
                            int top_left_y=0;
                            int width=0;
                            int height=0;

                            if(obj1.contains("top_left_x"))
                            
                                top_left_x=obj1.take("top_left_x").toInt();
                            
                            if(obj1.contains("top_left_y"))
                            
                                top_left_y=obj1.take("top_left_y").toInt();
                            
                            if(obj1.contains("width"))
                            
                                width=obj1.take("width").toInt();
                            
                            if(obj1.contains("height"))
                            
                                height=obj1.take("height").toInt();
                            

                            qDebug()<<"top_left_x:"<<top_left_x;
                            qDebug()<<"top_left_y:"<<top_left_y;
                            qDebug()<<"width:"<<width;
                            qDebug()<<"height:"<<height;
                        

                        //属性
                        QString mask;
                        if(object.contains("attributes"))
                        
                            QJsonObject obj1=object.take("attributes").toObject();
                            mask=obj1.take("mask").toString();
                            qDebug()<<"带口罩的状态:"<<mask;
                        
                    
                
             
         
    

4.3 token获取

void Widget::GetToken()

    //表示获取token
    function_select=3;

    QString requestUrl;
    QNetworkRequest request;

    //设置请求地址
    QUrl url;

    //获取token请求地址
    requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens")
                 .arg(SERVER_ID);

    //自己创建的TCP服务器,测试用
    //requestUrl="http://10.0.0.6:8080";

    //设置数据提交格式
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));

    //构造请求
    url.setUrl(requestUrl);

    request.setUrl(url);

    QString text =QString("\\"auth\\":\\"identity\\":\\"methods\\":[\\"password\\"],\\"password\\":"
    "\\"user\\":\\"domain\\": "
    "\\"name\\":\\"%1\\",\\"name\\": \\"%2\\",\\"password\\": \\"%3\\","
    "\\"scope\\":\\"project\\":\\"name\\":\\"%4\\"")
            .arg(MAIN_USER)
            .arg(IAM_USER)
            .arg(IAM_PASSWORD)
            .arg(SERVER_ID);

    //发送请求
    manager->post(request, text.toUtf8());

4.4 摄像头初始化

//查找系统可用摄像头
void Widget::Find_CameraNumber()

    //清空列表
    ui->comboBox_camera_number->clear();

    /*查找电脑当前可用摄像头*/
    cameras = QCameraInfo::availableCameras();
    if(cameras.count())
    
        for(int i=0;i<cameras.count();i++)
        
            ui->comboBox_camera_number->addItem(tr("%1").arg(i));
        
        ui->pushButton_start_camera->setEnabled(true);
    
    else
    
        QMessageBox::warning(this,tr("提示"),"本机没有可用的摄像头!\\n"
                                                 "软件作者:DS小龙哥\\n"
                                                 "BUG反馈:1126626497@qq.com");
        ui->pushButton_start_camera->setEnabled(false);
    

    /*摄像头没有启动时,按钮不可用*/
    ui->pushButton_find->setEnabled(false);
    ui->pushButton_delete->setEnabled(false);
    ui->pushButton_update->setEnabled(false);
    ui->pushButton_register->setEnabled(false);



//启动摄像头
void Widget::on_pushButton_start_camera_clicked()

    //摄像头启动标志
    if(camera_flag) //如果摄像头已经启动一次,再次启动需要将之前的空间释放掉
    
        camera->stop();
        delete camera;
        ui->horizontalLayout_2->removeWidget(videoWidget);
        delete videoWidget;
    

    camera_flag=1;  //标志摄像头已经启动一次

    //摄像头启动之后,就无法在重复启动
    ui->pushButton_start_camera->setEnabled(false);

   /*创建摄像头对象,根据选择的摄像头打开*/
   camera = new QCamera(cameras.at(ui->comboBox_camera_number->currentIndex()));

   /*构造捕获的对象*/
   camera_image_capture = new QCameraImageCapture(camera);

   /*设置捕获的目的地*/
   camera_image_capture->setCaptureDestination(QCameraImageCapture::CaptureToFile);

   //设置截图输出、缓冲区格式、分辨
   camera_image_capture->setCaptureDestination(QCameraImageCapture::CaptureToBuffer);
   camera_image_capture->setBufferFormat(QVideoFrame::PixelFormat::Format_Jpeg);

   //设置截图的图片尺寸
   iamge_setting.setResolution(320,240);
   camera_image_capture->setEncodingSettings(iamge_setting);

   //关联捕获的信号,发出捕获截图信号时,发出信号
  connect(camera_image_capture,&QCameraImageCapture::imageCaptured,this,&Widget::processCapturedImage);

   /*配置摄像头捕获模式为帧捕获模式*/
   camera->setCaptureMode(QCamera::CaptureViewfinder);

   videoWidget = new QVideoWidget();
   videoWidget->setMinimumSize(320,240);

   //将摄像头显示窗口加入到布局中
   ui->horizontalLayout_2->insertWidget(0,videoWidget);

   /*设置取景器显示*/
   camera->setViewfinder(videoWidget);

   /*启动摄像头*/
   camera->start();

   /*摄像头启动时,按钮可用*/
   ui->pushButton_find->setEnabled(true);
   ui->pushButton_delete->setEnabled(true);
   ui->pushButton_update->setEnabled(true);
   ui->pushButton_register->setEnabled(true);

基于stm32单片机设计的红外测温仪(带人脸检测)(代码片段)

...#xff0c;主要用在地铁、车站入口等地方,可以准确识别人脸进行测温,如果有人温度超标会进行语音提示并 查看详情

基于python的百度ai人脸识别api接口(可用于opencv-python人脸识别)(代码片段)

基于Python的百度AI人脸识别API接口(可用于OpenCV-Python人脸识别)资源:https://download.csdn.net/download/weixin_53403301/43644312之前的项目:【最新】基于OpenCV的Python人脸识别、检测、框选(遍历目录下所有照片依次识别... 查看详情

基于百度ai开放平台的人脸识别及语音合成(代码片段)

基于百度AI的人脸识别及语音合成课题课题需求(1)人脸识别在Web界面上传人的照片,后台使用Java技术接收图片,然后对图片进行解码,调用云平台接口识别人脸特征,接收平台返回的人员年龄、性别、颜值等信息,将信息返... 查看详情

ai人脸识别/烟火检测/车牌识别智能分析网关新增mqtt服务(代码片段)

...场景中的监控视频图像进行智能识别与分析,可提供人脸、人体、车辆、烟火、物体、行为等识别、抓拍、比对、告警等服务,支持对场景中的异常及违规现象进行精准研判、数据分析、结果汇聚、智能预警、辅助决策... 查看详情

python+opencv人脸识别身份认证系统设计:专栏总述

本专栏依托于Python编程语言,在内容上尽可能涵盖了人脸识别的各个技术模块,从人脸数据采集、数据预处理、数据分析、人脸识别模型的训练到最后的人脸识别,均有详细的操作步骤和注释代码,能帮助学习者... 查看详情

干货|ai人脸识别之人脸搜索(代码片段)

本文档将利用京东云AISDK来实践人脸识别中的人脸搜索功能,主要涉及到分组创建/删除、分组列表获取、人脸创建/删除、人脸搜索,本次实操的最终效果是:创建一个人脸库,拿一张图片在人脸库中搜索出相似度最高的一张,... 查看详情

python实现人脸识别(代码片段)

...备工作代码流程叨叨几句哈喽兄弟们,今天实现一下人脸识别。先问大家一个问题什么是百度Aip模块?百度AI平台提供了很多的API接口供开发者快速的调用运用在项目中本文写的是使用百度AI的在线接口SDK模块(baidu-ai... 查看详情

人脸识别(基于arcface)(代码片段)

 我们先来看看效果上面是根据图片检测出其中的人脸、每个人脸的年龄还有性别,非常强大第一步:登录https://ai.arcsoft.com.cn/,注册开发者账号,身份认证,注册应用,得到APPID和SDKKEY第二步:阅读SDK接入文档https://ai.arcsoft.c... 查看详情

图像处理——基于机器视觉技术的人脸在线识别系统设计(代码片段)

  基于机器视觉技术的人脸在线识别系统设计  本设计研究人脸检测与识别技术,在基于机器视觉技术上,构建了一套人脸在线检测识别系统,系统将由以下几个部分构成:计算机图像预处理、数据收集和预处理、人脸... 查看详情

毕业设计深度学习机器视觉人脸识别系统-opencvpython(代码片段)

文章目录0前言1机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别2深度学习-人脸识别过程人脸检测人脸识别MetricLarning3最后0前言🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题... 查看详情

基于k210芯片的人脸识别智能门禁系统

设计了一个人脸识别智能门禁系统,该系统人脸识别及红外测温模块、门禁和蓝牙模块组成。人脸识别及红外测温无需工作人员直接接触,只有体温正常才可以通过,达到了门禁的效果;可以把采集到的信息反馈... 查看详情

借助百度云api进行人脸识别(代码片段)

前言:本篇博客是笔者第一次使用百度云api进行人脸检测,主要内容包括两部分,一是获取接口,二是借助接口进行人脸检测,最终可以给出一个百分比判别两张人脸是否属于同一个人。笔者也是初步了解这方面的内容,也是参... 查看详情

7行python代码的人脸识别(代码片段)

...科技公司的宠儿。AI涉及的领域众多,图像识别中的人脸识别是其中一个有趣的分支。百度的BFR,Face++的开放平台,汉王,讯飞等等都提供了人脸识别的API,对于老码农而言,自己写一小段代码,... 查看详情

硬核防疫!神目测温系统护航某市百余所学校顺利复学(代码片段)

...学习生活。这个给小云带来安心的设备是来自神目科技的人脸识别测温机。除了市第二中学,神目人脸识别测温系统还部署于该地级市全市近百所中、小学校门、食堂及宿舍,全力为复学工作服务。通行效率翻3倍,检测快,测... 查看详情

ai识别照片是谁,人脸识别face_recognition开源项目安装使用|机器学习(代码片段)

...xff0c;给大家分享分享。face_recognition项目能做的很多,人脸检测功能也是有的,是一个比较成熟的项目。该项目的github地址:github仓库本文主要是对该项目的安装使用,后面会更新一篇我自己写的实现人 查看详情

ai实战篇|基于ai开放平台实现人脸识别对比功能,超详细教程附带源码(代码片段)

🎬博客主页:https://xiaoy.blog.csdn.net🎥本文由呆呆敲代码的小Y原创,首发于CSDN🙉🎄学习专栏推荐:Unity系统学习专栏🌲游戏制作专栏推荐:游戏制作🌲Unity实战100例专栏推荐:Unity实战... 查看详情

tsingsee青犀视频调用ai人脸识别出现跨域问题如何解决?(代码片段)

人脸识别已经是智慧化发展的一个重要标志了,一般分为两个步骤:前端人脸图像采集系统通过抓拍采集人脸图像、实时视频流等,后端的智能平台可将前端采集的相关数据统一进行汇聚、处理、存储、应用、管理与... 查看详情

阵列相机-光场相机-ai双目测温相机-红外ai识别相机

阵列相机-光场相机-AI双目测温相机-红外AI识别相机阵列式相机,就是用多个小镜头来代替一个大镜头的拍摄效果,其原理和阵列式天文望远镜及昆虫的复眼类似。相比于传统的相机来说,阵列式相机的视野更广,... 查看详情