一.UI界面设计
左上lineedit是处理后的解析的json数据
下方的lineedit2是利用解析数据再进行数据库查询得到的数据
标签 人脸拍照OK是进行一个图片的显示
黑的部分是摄像头//我把摄像头堵了所以看不见
选择图片按钮是为了进行功能测试添加
二、对接百度云
对接格式一定要 严格 严格 严格 按照百度云要求的格式!!!
1.获取Access Token
可以使用在线post工具,也可以在代码中申请,使用Api_Key,Secret_Key获取Token;
QString httpRequest::GetBaidu_Token(QString &Api_Key, QString &Secret_Key)
{
QString Url = "https://aip.baidubce.com/oauth/2.0/token?";
QByteArray append = QString("grant_type=client_credentials&client_id=%1&client_secret=%2").arg(Api_Key).arg(Secret_Key).toLatin1();
Network_Request(Url, append);
QByteArray JsonData;
QEventLoop loop;
auto c = connect(this, Network_Reply_Finish, [&](const QByteArray & data){
JsonData = data;
loop.exit(1);
});
loop.exec();
disconnect(c);
QJsonObject data = QJsonDocument::fromJson(JsonData).object();
if (data.isEmpty() && !data.contains("access_token"))
return "get error";
return data.value("access_token").toString();
}
二 http协议头构造
void httpRequest::Network_Request(QString & Url, QByteArray Request_Data)
{
// 构造请求
QNetworkRequest Request((QUrl(Url)));
Manager = new QNetworkAccessManager(this);
connect(Manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(Network_Reply(QNetworkReply*)));
//设置头信息
Request.setHeader(QNetworkRequest::ContentTypeHeader, "Content-Type: application/json");
//Request.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
// 发送请求
Manager->post(Request, Request_Data);
qDebug()<<"构造HTTP头成功";
}
void httpRequest::Network_Reply(QNetworkReply * Reply)
{
if (Reply->isReadable()){
Reply_Data = Reply->readAll();
emit Network_Reply_Finish(Reply_Data);
}
}
三.对接百度云人脸注册和识别
只给出人脸注册。 识别就按照百度API文档要求更改就可以了
掌握对图片进行BASE64编码,以及按格式进行数据上传
QJsonObject facecheck::insert_face(QImage &image,QString str)
{
QByteArray ba;
QBuffer buffer(&ba);
image.save(&buffer, "jpg");
QString imgData = QString(ba.toBase64());
buffer.close();
QJsonObject insetr_obj;
insetr_obj.insert("image", imgData);
insetr_obj.insert("image_type","BASE64");
insetr_obj.insert("group_id","test_1");
insetr_obj.insert("user_id",str);
QString t1 ="https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add";
QString Url=t1 + "?access_token=" + baiToken;
http->Network_Request(Url, QJsonDocument(insetr_obj).toJson());
QByteArray JsonData;
QEventLoop loop;
auto c = connect(http, http->Network_Reply_Finish, [&](const QByteArray & data){
JsonData = data;
loop.exit(1);
});
loop.exec();
disconnect(c);
QJsonObject data = QJsonDocument::fromJson(JsonData).object();
return data ;
}
四.json数据处理
由于此项目是个人练手,所以要求较为简单。对数据处理也很粗暴
if(data.contains("result"))
{
QJsonObject resobj = data.take("result").toObject();
if(resobj.contains("user_list"))
{
QJsonArray groupArray = resobj.take("user_list").toArray();
for(int i=0; i<groupArray.size();i++)
{
QJsonObject groupobj = groupArray[i].toObject();
double score =groupobj.value("score").toDouble();
info.append("匹配度:"+QString::number(score)+"\n");
if(score > 75)
{
name =groupobj.value("user_id").toString();
info.append("云用户编号"+name+"\n");
pclass=groupobj.value("group_id").toString();
info.append("云所属组:"+pclass+"\n");//班级
}
else
{
info.append("库里没有此人! nohavethepeople\n");
ui->lineEdit->clear();
ui->lineEdit_2->clear();
ui->lineEdit_3->clear();
}
}
}
}
五,数据----->UI界面
解析JSON返回的数据,再利用得到的部分数据去查询数据库,再将查询到的数据显示到UI界面
db_select(name);
ui->textEdit->clear();
QDateTime dtm = QDateTime::currentDateTime();
QString time = dtm.toString("yyyy.MM.dd hh:mm:ss ddd");
info.append(time);
ui->textEdit->setText(info);
代码写的很杂乱,由于数据库的原因,没有单独封装函数
由于注册功能是后面写的,导致图3也就是注册功能没有对原有的界面数据进行全部更高
只讲lineedit的内容改成了???表示库中没有此人,去进行了一个注册,如果库里有此人则是图2状况。正常识别则是图1效果
人脸识别也是一样,如果库中没有此人则识别失败,点击注册再点击识别即可识别成功
可以知道对于人脸注册和识别的功能是有的。同时UI界面数据的更改表示对数据库的查询以及对界面的修改也是有的
六,效果
总结:
还停留在面向过程思维。只会写垃圾轮子。
学习到了{
1.对接百度云
要得到自己的token,可以用代码去申请,也可以在网站申请(但只有30天期限)
采用的post请求 url 和 json 格式必须严格按照文档写
2.json解析
3.复习了QT一些部件功能
}
代码和更多总结,请点击:点这
提取码:XLLL