• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

QT对接百度云实现人脸注册和识别

武飞扬头像
m0_52282946
帮助1

文章目录

一.UI界面设计

左上lineedit是处理后的解析的json数据

下方的lineedit2是利用解析数据再进行数据库查询得到的数据

标签 人脸拍照OK是进行一个图片的显示

黑的部分是摄像头//我把摄像头堵了所以看不见

选择图片按钮是为了进行功能测试添加

学新通

学新通

二、对接百度云

          参考:        Qt 百度AI实现人脸识别之人脸检测

        对接格式一定要 严格 严格 严格 按照百度云要求的格式!!!

1.获取Access Token

       可以使用在线post工具,也可以在代码中申请,使用Api_Key,Secret_Key获取Token;

  1.  
    QString httpRequest::GetBaidu_Token(QString &Api_Key, QString &Secret_Key)
  2.  
    {
  3.  
    QString Url = "https://aip.百度bce.com/oauth/2.0/token?";
  4.  
    QByteArray append = QString("grant_type=client_credentials&client_id=%1&client_secret=%2").arg(Api_Key).arg(Secret_Key).toLatin1();
  5.  
     
  6.  
    Network_Request(Url, append);
  7.  
     
  8.  
    QByteArray JsonData;
  9.  
    QEventLoop loop;
  10.  
    auto c = connect(this, Network_Reply_Finish, [&](const QByteArray & data){
  11.  
    JsonData = data;
  12.  
    loop.exit(1);
  13.  
    });
  14.  
    loop.exec();
  15.  
    disconnect(c);
  16.  
     
  17.  
    QJsonObject data = QJsonDocument::fromJson(JsonData).object();
  18.  
    if (data.isEmpty() && !data.contains("access_token"))
  19.  
    return "get error";
  20.  
    return data.value("access_token").toString();
  21.  
    }
学新通

http协议头构造

  1.  
    void httpRequest::Network_Request(QString & Url, QByteArray Request_Data)
  2.  
    {
  3.  
    // 构造请求
  4.  
    QNetworkRequest Request((QUrl(Url)));
  5.  
     
  6.  
    Manager = new QNetworkAccessManager(this);
  7.  
    connect(Manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(Network_Reply(QNetworkReply*)));
  8.  
     
  9.  
    //设置头信息
  10.  
    Request.setHeader(QNetworkRequest::ContentTypeHeader, "Content-Type: application/json");
  11.  
    //Request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
  12.  
    // 发送请求
  13.  
    Manager->post(Request, Request_Data);
  14.  
    qDebug()<<"构造HTTP头成功";
  15.  
    }
  16.  
     
  17.  
    void httpRequest::Network_Reply(QNetworkReply * Reply)
  18.  
    {
  19.  
    if (Reply->isReadable()){
  20.  
    Reply_Data = Reply->readAll();
  21.  
    emit Network_Reply_Finish(Reply_Data);
  22.  
    }
  23.  
    }
学新通

三.对接百度云人脸注册和识别

只给出人脸注册。     识别就按照百度API文档要求更改就可以了

掌握对图片进行BASE64编码,以及按格式进行数据上传

  1.  
    QJsonObject facecheck::insert_face(QImage &image,QString str)
  2.  
    {
  3.  
    QByteArray ba;
  4.  
    QBuffer buffer(&ba);
  5.  
    image.save(&buffer, "jpg");
  6.  
    QString imgData = QString(ba.toBase64());
  7.  
    buffer.close();
  8.  
    QJsonObject insetr_obj;
  9.  
    insetr_obj.insert("image", imgData);
  10.  
    insetr_obj.insert("image_type","BASE64");
  11.  
    insetr_obj.insert("group_id","test_1");
  12.  
    insetr_obj.insert("user_id",str);
  13.  
     
  14.  
    QString t1 ="https://aip.百度bce.com/rest/2.0/face/v3/faceset/user/add";
  15.  
    QString Url=t1 "?access_token=" baiToken;
  16.  
    http->Network_Request(Url, QJsonDocument(insetr_obj).toJson());
  17.  
    QByteArray JsonData;
  18.  
    QEventLoop loop;
  19.  
    auto c = connect(http, http->Network_Reply_Finish, [&](const QByteArray & data){
  20.  
    JsonData = data;
  21.  
    loop.exit(1);
  22.  
    });
  23.  
    loop.exec();
  24.  
    disconnect(c);
  25.  
    QJsonObject data = QJsonDocument::fromJson(JsonData).object();
  26.  
    return data ;
  27.  
    }
学新通

四.json数据处理

由于此项目是个人练手,所以要求较为简单。对数据处理也很粗暴

  1.  
    if(data.contains("result"))
  2.  
    {
  3.  
    QJsonObject resobj = data.take("result").toObject();
  4.  
    if(resobj.contains("user_list"))
  5.  
    {
  6.  
    QJsonArray groupArray = resobj.take("user_list").toArray();
  7.  
    for(int i=0; i<groupArray.size();i )
  8.  
    {
  9.  
    QJsonObject groupobj = groupArray[i].toObject();
  10.  
    double score =groupobj.value("score").toDouble();
  11.  
    info.append("匹配度:" QString::number(score) "\n");
  12.  
    if(score > 75)
  13.  
    {
  14.  
    name =groupobj.value("user_id").toString();
  15.  
    info.append("云用户编号" name "\n");
  16.  
    pclass=groupobj.value("group_id").toString();
  17.  
    info.append("云所属组:" pclass "\n");//班级
  18.  
    }
  19.  
    else
  20.  
    {
  21.  
    info.append("库里没有此人! nohavethepeople\n");
  22.  
    ui->lineEdit->clear();
  23.  
    ui->lineEdit_2->clear();
  24.  
    ui->lineEdit_3->clear();
  25.  
    }
  26.  
    }
  27.  
    }
  28.  
    }
学新通

五,数据----->UI界面

解析JSON返回的数据,再利用得到的部分数据去查询数据库,再将查询到的数据显示到UI界面

  1.  
    db_select(name);
  2.  
    ui->textEdit->clear();
  3.  
    QDateTime dtm = QDateTime::currentDateTime();
  4.  
    QString time = dtm.toString("yyyy.MM.dd hh:mm:ss ddd");
  5.  
    info.append(time);
  6.  
    ui->textEdit->setText(info);

代码写的很杂乱,由于数据库的原因,没有单独封装函数

由于注册功能是后面写的,导致图3也就是注册功能没有对原有的界面数据进行全部更高

只讲lineedit的内容改成了???表示库中没有此人,去进行了一个注册,如果库里有此人则是图2状况。正常识别则是图1效果

人脸识别也是一样,如果库中没有此人则识别失败,点击注册再点击识别即可识别成功

可以知道对于人脸注册和识别的功能是有的。同时UI界面数据的更改表示对数据库的查询以及对界面的修改也是有的

六,效果 学新通

 学新通

学新通 

 总结:      

        还停留在面向过程思维。只会写垃圾轮子。
        学习到了{
        1.对接百度云
            要得到自己的token,可以用代码去申请,也可以在网站申请(但只有30天期限)
            采用的post请求 url 和 json 格式必须严格按照文档写
        2.json解析
        3.复习了QT一些部件功能
        } 

代码和更多总结,请点击:点这

提取码:XLLL

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbjkbf
系列文章
更多 icon
同类精品
更多 icon
继续加载