QT请求百度AI接口

第二章 人脸识别

qt0402.h头文件源代码

#ifndef QT0402_H
#define QT0402_H

#include <QWidget>
#include <QNetworkReply>
#include <QWidget>
#include <QDebug>
#include <QString>
#include <QCamera>
#include <QCameraInfo>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QTimer>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QNetworkAccessManager>
#include <QUrl>
#include <QUrlQuery>
#include <QSslConfiguration>
#include <QSslSocket>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QBuffer>
............
中间省略
............
private:
    Ui::qt0402 *ui;
    QCamera *camera;
    QCameraViewfinder *finder;
    QCameraImageCapture *imageCapture;
    QTimer *refreshTimer;

    QSslConfiguration sslConfig;
    QNetworkAccessManager *tokenManager;
    QNetworkAccessManager *imgManager;
    QString accessToken;
    QImage faceImg;
};
#endif // QT0402_H

qt0402.cpp源代码

#include "qt0402.h"
#include "ui_qt0402.h"

qt0402::qt0402(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::qt0402)
{
    ui->setupUi(this);
    //显示了所有摄像头信息
    const QList<QCameraInfo> cameraInfoList = QCameraInfo::availableCameras();
    for (const QCameraInfo &tmpCam:cameraInfoList) {
        qDebug() << tmpCam.deviceName()<< "|||" << tmpCam.description();
        ui->comboBox->addItem(tmpCam.description());

    }
    connect(ui->comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
        [=](int index){
        qDebug() << cameraInfoList.at(index).description();
        refreshTimer->stop();
        camera->stop();
        camera->deleteLater();
        camera = new QCamera(cameraInfoList.at(index));
        imageCapture->deleteLater();
        imageCapture = new QCameraImageCapture(camera);
        camera->setViewfinder(finder);
        camera ->setCaptureMode(QCamera::CaptureStillImage);
        imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToBuffer);
        connect(imageCapture, &QCameraImageCapture::imageCaptured,
                this,[=](int id, const QImage &preview){
            Q_UNUSED(id);
            faceImg = preview;
            ui->label->setPixmap(QPixmap::fromImage(preview)); //图形转换
        });
        camera->start();
        refreshTimer->start(40);
    });

    //摄像头配置
    camera = new QCamera(cameraInfoList.at(0));
    finder = new QCameraViewfinder();
    imageCapture = new QCameraImageCapture(camera);
    camera->setViewfinder(finder);
    camera ->setCaptureMode(QCamera::CaptureStillImage);
    imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToBuffer);

    //拍照与按钮绑定
    connect(imageCapture, &QCameraImageCapture::imageCaptured,
            this,[=](int id, const QImage &preview){
        Q_UNUSED(id);
        faceImg = preview;
        ui->label->setPixmap(QPixmap::fromImage(preview)); //图形转换
    });

    camera->start();

    //定时器刷新拍照
    refreshTimer = new QTimer(this);
    connect(refreshTimer, &QTimer::timeout,
            this, [=](){
       imageCapture->capture();
    });
    //开Timer
    refreshTimer->start(40);

    //设置布局
    QVBoxLayout *vboxl = new QVBoxLayout;
    vboxl->addWidget(ui->label);
    vboxl->addWidget(ui->pushButton);
    //竖直盒子
    QVBoxLayout *vboxr = new QVBoxLayout;
    vboxr->addWidget(ui->comboBox);
    vboxr->addWidget(finder);
    vboxr->addWidget(ui->textBrowser);

    //水平盒子
    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addLayout(vboxl);
    hbox->addLayout(vboxr);

    //最终以水平布局为准hbox
    this->setLayout(hbox);

    imgManager = new QNetworkAccessManager(this);
    connect(imgManager, &QNetworkAccessManager::finished,
            this, [](QNetworkReply *replay){
            if (replay->error() != QNetworkReply::NoError) {
                qDebug() << replay->errorString();
                return ;
            }
            QByteArray replayData =  replay->readAll();
            qDebug() << replayData;
    });

    //设置按钮点击操作
    //[](){}这是lamda函数,也就是槽的定义,[]里=或者&都可以
    connect(ui->pushButton, &QPushButton::clicked,
            this, [&]() {
        //进行人脸检测,把图片转成base64编码,百度AI
        QByteArray ba;
        QBuffer buff(&ba);
        faceImg.save(&buff, "png");
        QString b64str = ba.toBase64();
        qDebug() << b64str;
        //imageCapture->capture();

        //组装请求体
        QJsonObject postJson;
        postJson.insert("image", b64str);
        postJson.insert("image_type", "BASE64");
        postJson.insert("face_field", "age,face_shape,gender,glasses,emotion,face_type,mask,beauty");

        QJsonDocument doc;
        doc.setObject(postJson);
        QByteArray postData =  doc.toJson(QJsonDocument::Compact);   //一行字符串,没有换行

        //组装请求包
        QUrl url("https://aip.baidubce.com/rest/2.0/face/v3/detect");
        QUrlQuery query;
        query.addQueryItem("access_token", accessToken);
        url.setQuery(query);

        QNetworkRequest req;
        req.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
        req.setUrl(url);
        req.setSslConfiguration(sslConfig);
        imgManager->post(req, postData);
    });
    //支持https协议

    tokenManager = new QNetworkAccessManager(this);
    qDebug() << tokenManager->supportedSchemes();

    if (QSslSocket::supportsSsl()) {
        qDebug() << "supporte ssl";
    } else {
        qDebug() << "not support ssl";
    }

    //发起token请求
    QUrl url("https://aip.baidubce.com/oauth/2.0/token");
    QUrlQuery query;   //QUrlQuery提供了一个操纵键值对的方式,;
    query.addQueryItem("grant_type", "client_credentials");     //通过addQueryItem添加 key 和 value
    query.addQueryItem("client_id", "MEEgXrGBVMFeL8NoErsSxaZi");
    query.addQueryItem("client_secret", "cNNHbQiqMWSUBHKI3CoofDO8tXyMW6GN");
    url.setQuery(query);
    qDebug() << url;

    //配置SSL
    sslConfig = QSslConfiguration::defaultConfiguration();  //通过defaultConfiguration()获取ssl的默认配置
    sslConfig.setPeerVerifyMode(QSslSocket::QueryPeer);
    sslConfig.setProtocol(QSsl::TlsV1_2);

    //配置token请求
    QNetworkRequest req;
    req.setUrl(url);
    req.setSslConfiguration(sslConfig);

    tokenManager = new QNetworkAccessManager(this);
    connect(tokenManager, &QNetworkAccessManager::finished,
            this, [=](QNetworkReply *replay){
            //处理应答
            if (replay->error() != QNetworkReply::NoError) {
                qDebug() << replay->errorString();
                return ;
            }
            QByteArray replayData =  replay->readAll();
            //qDebug() << replayData;

            QJsonParseError jsonErr;
            //字节数组转成json文档
            QJsonDocument doc = QJsonDocument::fromJson(replayData, &jsonErr);
            if (jsonErr.error != QJsonParseError::NoError) {
                qDebug() << "json parse error" << jsonErr.errorString();
                return ;
            }

            QJsonObject obj = doc.object();
            if (!obj.contains("access_token")) {
                qDebug() << "no key:" << "access_token";
                return ;
            }
            accessToken = obj.value("access_token").toString();
            ui->textBrowser->setText(accessToken);
    });
    //发送请求
    tokenManager->get(req);

}
qt0402::~qt0402()
{
    delete ui;
}

最终返回结果

"{\"error_code\":0,\"error_msg\":\"SUCCESS\",\"log_id\":2289572821,\"timestamp\":164969
1489,\"cached\":0,\"result\":{\"face_num\":1,\"face_list\":
[{\"face_token\":\"4a54c25658d1a0a307ba0d7083e2b994\",\"location\":
{\"left\":566.91,\"top\":392.86,\"width\":228,\"height\":225,\"rotation\":-1},\"face_probability\"
:1,\"angle\":{\"yaw\":-6.03,\"pitch\":6.72,\"roll\":-3.38},\"age\":30,\"face_shape\":
{\"type\":\"oval\",\"probability\":0.45},\"gender\":
{\"type\":\"female\",\"probability\":1},\"glasses\":
{\"type\":\"common\",\"probability\":1},\"emotion\":
{\"type\":\"neutral\",\"probability\":1},\"face_type\":
{\"type\":\"human\",\"probability\":1},\"mask\":
{\"type\":0,\"probability\":1},\"beauty\":80.91}]}}"

手动提升颜值,(●ˇ∀ˇ●)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值