第二章 人脸识别
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}]}}"
手动提升颜值,(●ˇ∀ˇ●)