#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
requestUrl = "https://aip.baidubce.com/rest/2.0/face/v3/detect";
//这里更换为自己的Access Token,每个Access Token的有效期为30天
accessToken = "24.3032d8e3f41f4b16f1e682e55ec0547a.2592000.1536916431.282335-11676799";
imgPath = "";
manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}
Widget::~Widget()
{
delete ui;
}
void Widget::replyFinished(QNetworkReply *reply)
{
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if(200 != statusCode)
{
qDebug() << "Status code is error:" << statusCode;
return;
}
replyData = reply->readAll();
qDebug()<<"reply data is:"<<QString(replyData);
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("result"))
{
QJsonObject resultObj = obj.take("result").toObject();
//解析人脸个数
if(resultObj.contains("face_num"))
{
int faceNum = obj.take("face_num").toInt();
qDebug()<<"查询到了图片中的人脸个数为:"<<faceNum;
}
//解析人脸属性
if(resultObj.contains("face_list"))
{
QJsonArray faceArray = resultObj.take("face_list").toArray();
for(int i = 0; i < faceArray.size(); i++)
{
QJsonObject faceObj = faceArray.at(i).toObject();
if(faceObj.contains("gender"))
{
QJsonObject genderObj = faceObj.take("gender").toObject();
if(genderObj.contains("type"))
{
QString type = genderObj.take("type").toString();;
if(type == "male")
{
ui->lblSex->setText("男");
}
else
{
ui->lblSex->setText("女");
}
}
}
if(faceObj.contains("age"))
{
int age = faceObj.take("age").toDouble();
qDebug()<<"查询到了年龄:"<<age;
ui->lblAge->setText(QString::number(age));
}
if(faceObj.contains("beauty"))
{
int beauty = faceObj.take("beauty").toDouble();;
qDebug()<<"查询到了颜值:"<<beauty;
ui->lblBeauty->setText(QString::number(beauty));
}
if(faceObj.contains("expression"))
{
QJsonObject expressionObj = faceObj.take("expression").toObject();
if(expressionObj.contains("type"))
{
QString type = expressionObj.take("type").toString();;
if(type == "smile")
{
ui->lblFeature->setText("微笑");
}
else if(type == "laugh")
{
ui->lblFeature->setText("大笑");
}
else
{
ui->lblFeature->setText("不笑");
}
}
}
}
}
}
}
}
reply->deleteLater();
}
void Widget::on_btnStartIdentify_clicked()
{
//设置请求地址
QUrl url(requestUrl + "?access_token=" + accessToken);
QNetworkRequest request(url);
//设置数据提交格式,这个不能自己随便写,每个平台的格式可能不一样,百度AI要求的格式为application/json
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
//将要检测的图片进行BASE64编码
QImage image(imgPath);
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
//以png格式将图片数据写入ba
image.save(&buffer, "png");
//将图片进行BASE64编码
QString imgData = QString(ba.toBase64());
buffer.close();
//打包请求参数
QJsonObject post_data;;
QJsonDocument document;
post_data.insert("image", imgData);
post_data.insert("image_type", "BASE64");
post_data.insert("face_field", "age,beauty,gender,expression");
document.setObject(post_data);
QByteArray post_param = document.toJson(QJsonDocument::Compact);
//发送请求
manager->post(request, post_param);
}
void Widget::on_openImgBtn_clicked()
{
ui->lblImg->clear();
ui->lblSex->clear();
ui->lblAge->clear();
ui->lblBeauty->clear();
ui->lblFeature->clear();
imgPath = QFileDialog::getOpenFileName(this, tr("Open Image"),
"./", tr("Image files(*.jpg *.png *.jpeg);;All files (*.*)"));
if(imgPath.isEmpty())
{
QMessageBox msgBox;
msgBox.warning(this,"警告","打开图片失败!");
return;
}
else
{
QImage img(imgPath);
//保持长宽比进行缩放
img = img.scaled(ui->lblImg->width(), ui->lblImg->height(), Qt::KeepAspectRatio);
ui->lblImg->setPixmap(QPixmap::fromImage(img));
}
}
Qt+百度AI接口人脸识别小示例
4星 · 超过85%的资源 需积分: 50 63 浏览量
2018-08-19
02:15:51
上传
评论 11
收藏 7KB ZIP 举报
画茧自缚
- 粉丝: 1w+
- 资源: 15