资讯详情

AI人脸识别测温一体机设计

1. 前言

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

目前,由于新冠肺炎疫情防控的需要,每个人出门都需要戴口罩,检查健康码,测量体温。办公楼门口、地铁门口、社区门口、商场门口的人流量比较大。传统的人工测温方法费时费力,效率相对较低,人工近距离检测温度容易产生交叉感染风险。

使用当前文章,方便人员体温测量,减轻防疫防控人员负担。

当检测到人脸时,测量温度,检测是否戴口罩;温度信息实时显示在显示屏上。如果温度超过设定值,则通过语音广播提示。如果人员不戴口罩,他们会用语音提示戴口罩。

image-20220126144246822

2. 软硬件设计

(1)核心板采用瑞芯微RK3399,运行ubuntu18.04 编译器采用64位系统aarch64-linux-gcc。罗技720摄像头采用罗技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编码上传。

格式: https://face.{endpoint}.myhuaweicloud.com/v2/{project_id}/face-detect  示例: https://face.cn-north-4.myhuaweicloud.com/v2/0e5957be8a00f53c2fa7c0045e4d8fbf/face-detect 

{  "X-Auth-Token": "******"    } 

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

image_base64字段   : 存放Base64编码后的图片数据尺寸不超过8MB,建议小于1MB。  attributes字段     :这个参数可以选择不填写,不填写只是返回图片中人脸的大小。如果您想获得更多的属性列表,请填写以下属性: 2:年龄 4:装束(帽子、眼镜) 6:口罩 7:发型 8:胡须 11:图片类型 12:质量 13:表情 21:人脸图片旋转角(顺时针偏转角)支持0°、90°、180°和270°图片旋转。  逗号(,)用于隔离多个属性。 

如果图像中没有人脸,返回的数据是这样的: { 
        "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);
}

标签: 红外传感器的帽子ds流量传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台