Qt+百度API实现人脸对比寻找明星脸

一、要求

1、使用百度人脸识别库
2、识别对比图片,获取图片相似度
3、显示最相似的明星照片、显示本人照片
4、调用摄像头拍照、比对查找最相似的明星脸
5、录入明星照片、查看照片列表、修改、删除照片

二、实现方式

2.1百度API封装

1、获取Token

鉴权认证参考:http://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu

填写API_Key和Secret_Key,运行程序后会自动读取,并保存在本地

2、配置https访问

需要依赖libcrypto-1_1.dll和libssl-1_1.dll库,可以在qt路径下找到,放在与exe同级目录下

编译器要选择32位的,62位无效

void BaiduFaceOnline::https_ssl_config(QNetworkRequest& NetworkRequest)
{QSslConfiguration config = NetworkRequest.sslConfiguration();config.setPeerVerifyMode(QSslSocket::VerifyNone);config.setProtocol(QSsl::TlsV1SslV3);NetworkRequest.setSslConfiguration(config);
}

3、相似度比对

访问API,https://aip.baidubce.com/rest/2.0/face/v3/match

使用QEventLoop阻塞等待响应结果

QNetworkReply * reply = NetAccManager->post(NetRequest, post_param);
QEventLoop eventLoop;
connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec(QEventLoop::ExcludeUserInputEvents);

4、QImage转base64编码字符

图片的格式统一位为jpg

QString BaiduFaceOnline::image2base64_str(const QImage& img)
{QByteArray data;QBuffer buf(&data);img.save(&buf, "jpg");QString b64str = QString(data.toBase64());buf.close();return b64str;
}

baidufaceonline.h

#ifndef BAIDUFACEONLINE_H
#define BAIDUFACEONLINE_H#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QUrl>
#include <QNetworkReply>
#include <QMessageBox>
#include <QImage>
#include <QFile>
#include <QTextStream>
#include <QBuffer>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>class BaiduFaceOnline : public QObject
{Q_OBJECT
public:explicit BaiduFaceOnline(QObject *parent = nullptr);void https_ssl_config(QNetworkRequest& NetworkRequest);QString image2base64_str(const QImage& img);QImage base64_str2image(const QString & base64_str);void writeAccToken(const QString& token);QString readAccToken();public slots:void getAccToken();double FaceMatch(const QImage& image1, const QImage& image2);private slots:void getAccTokenReply(QNetworkReply* reply);double getFaceMatchReply(QNetworkReply* reply);private:QNetworkAccessManager* NetAccManager;QNetworkRequest NetRequest;/* 应用参数 */const QString API_Key = "填写自己的";const QString Secret_Key = "填写自己的";QString AccToken = "";/* 应用参数end */const QString FaceMatchUrl = "https://aip.baidubce.com/rest/2.0/face/v3/match";
};#endif // BAIDUFACEONLINE_H

baidufaceonline.cpp

#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif#include "baidufaceonline.h"#include <QEventLoop>BaiduFaceOnline::BaiduFaceOnline(QObject *parent) : QObject(parent)
{NetAccManager = new QNetworkAccessManager(this);https_ssl_config(NetRequest);AccToken = readAccToken();qDebug() << "AccToken" <<AccToken;getAccToken();
}//配置https访问,win32依赖libcrypto-1_1.dll和libssl-1_1.dll,放在与exe同级目录下
void BaiduFaceOnline::https_ssl_config(QNetworkRequest& NetworkRequest)
{QSslConfiguration config = NetworkRequest.sslConfiguration();config.setPeerVerifyMode(QSslSocket::VerifyNone);config.setProtocol(QSsl::TlsV1SslV3);NetworkRequest.setSslConfiguration(config);
}
//QImage转base64编码字符串
QString BaiduFaceOnline::image2base64_str(const QImage& img)
{QByteArray data;QBuffer buf(&data);img.save(&buf, "jpg");QString b64str = QString(data.toBase64());buf.close();return b64str;
}
//base64编码字符串转QImage
QImage BaiduFaceOnline::base64_str2image(const QString & base64_str)
{QImage image;QByteArray base64_data = base64_str.toLatin1();image.loadFromData(QByteArray::fromBase64(base64_data));return image;
}
void BaiduFaceOnline::writeAccToken(const QString& token)
{QFile f("AccToken.txt");if(!f.open(QIODevice::WriteOnly | QIODevice::Text)){qDebug() << ("打开文件失败");}QTextStream txtOutput(&f);txtOutput << token;f.close();}
QString BaiduFaceOnline::readAccToken()
{QFile f("AccToken.txt");if(!f.open(QIODevice::ReadOnly | QIODevice::Text)){qDebug() << ("打开文件失败");return "";}QTextStream txtInput(&f);QString lineStr;lineStr = txtInput.readLine();f.close();return lineStr;
}//获取token
void BaiduFaceOnline::getAccToken()
{//鉴权认证参考:http://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhuif(AccToken.isEmpty()) {QStringList parlist;parlist.append(QString("grant_type=%1").arg("client_credentials"));parlist.append(QString("client_id=%1").arg(API_Key));parlist.append(QString("client_secret=%1").arg(Secret_Key));QByteArray parameters = parlist.join("&").toUtf8();QUrl url("https://aip.baidubce.com/oauth/2.0/token");NetRequest.setUrl(url);NetRequest.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));connect(NetAccManager,&QNetworkAccessManager::finished,this,&BaiduFaceOnline::getAccTokenReply);NetAccManager->post(NetRequest,parameters);}
}
//获取token槽
void BaiduFaceOnline::getAccTokenReply(QNetworkReply* reply)
{QString error = reply->errorString();if (!error.isEmpty() && error != "Unknown error") {return;}if (reply->error() != QNetworkReply::NoError) {QMessageBox::warning(0,"","请求错误!");return;}else {QByteArray content = reply->readAll();reply->deleteLater();QJsonParseError jsonError;QJsonDocument doucment = QJsonDocument::fromJson(content, &jsonError);  // 转化为 JSON 文档if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)){  // 解析未发生错误if (doucment.isObject()){ // 文档只有一个json对象QJsonObject object = doucment.object();  // 转化为对象if (object.contains("access_token")){  // 包含指定的 keyQJsonValue value = object.value("access_token");  // 获取指定 key 对应的 valueif (value.isString()){  // 判断 value 是否为字符串AccToken =  value.toString();  // 将 value 转化为字符串qDebug()<< "parse AccToken:"<<AccToken;writeAccToken(AccToken);    //写入txt文件}}}}}disconnect(NetAccManager,&QNetworkAccessManager::finished,this,&BaiduFaceOnline::getAccTokenReply);
}//人脸对比
double BaiduFaceOnline::FaceMatch(const QImage& image1, const QImage& image2)
{qDebug() <<image1;qDebug() <<image2;QString img1_base64 = image2base64_str(image1);QString img2_base64 = image2base64_str(image2);QJsonObject post_data1;post_data1.insert("image", img1_base64);post_data1.insert("image_type", "BASE64");QJsonObject post_data2;post_data2.insert("image", img2_base64);post_data2.insert("image_type", "BASE64");QJsonArray img_array;img_array.append(post_data1);img_array.append(post_data2);QJsonDocument document;document.setArray(img_array);QByteArray post_param = document.toJson(QJsonDocument::Indented);qDebug() <<post_param;QUrl url(FaceMatchUrl + "?access_token=" + AccToken);NetRequest.setUrl(url);NetRequest.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));QNetworkReply * reply = NetAccManager->post(NetRequest, post_param);QEventLoop eventLoop;connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);eventLoop.exec(QEventLoop::ExcludeUserInputEvents);double score = getFaceMatchReply(reply);qDebug() <<"score:" << score;return  score;
}double BaiduFaceOnline::getFaceMatchReply(QNetworkReply* reply)
{double  score = 0;qDebug() <<"reply";QString error = reply->errorString();if (!error.isEmpty() && error != "Unknown error"){return score;}if (reply->error() != QNetworkReply::NoError){qDebug() <<"请求错误!";return score;}else{QByteArray content = reply->readAll();QJsonParseError jsonError;QJsonDocument doucment = QJsonDocument::fromJson(content, &jsonError);  // 转化为 JSON 文档if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)){if (doucment.isObject()){QJsonObject root_object = doucment.object();if (root_object.take("error_code").toInt() == 0 && root_object.take("error_msg").toString() == "SUCCESS"){QJsonObject result_object = root_object.take("result").toObject();score = result_object.take("score").toDouble(); /*相似度: */}}}reply->deleteLater();}return score;
}

2.2 人脸搜索并找出最相似的

该任务比较耗时,放入线程中执行,采用moveToThread的方式

    // 调用 moveToThread 将该任务交给 workThreadauto *searchWorker = new SearchWorker ;searchWorker->moveToThread(&workerThread);// operate 信号发射后启动线程工作connect(this, SIGNAL(operate()), searchWorker, SLOT(doWork()));// 该线程结束时销毁connect(&workerThread, &QThread::finished, searchWorker, &QObject::deleteLater);// 线程结束后发送信号,对结果进行处理connect(searchWorker, &SearchWorker::resultReady, this, &CameraWidget::slot_handleResults);// 启动线程workerThread.start();

seachWorker封装

#ifndef SEARCHWORKER_H
#define SEARCHWORKER_H#include <QObject>class BaiduFaceOnline;
class SearchWorker: public QObject
{Q_OBJECT
public:explicit SearchWorker(QObject *parent = nullptr);public slots:void doWork();signals:/*** @brief resultReady 线程完成工作时发送的信号* @param score  相似度* @param name   图片名称*/void resultReady(double score, const QString &name);private:BaiduFaceOnline *m_baiduFace;
};#endif // SEARCHWORKER_H
#include "baidufaceonline.h"
#include "searchworker.h"
#include <QDir>SearchWorker::SearchWorker(QObject *parent):QObject(parent)
{m_baiduFace = new BaiduFaceOnline(this);
}void SearchWorker::doWork()
{/* 读取文件 */QString path = "./faces";QDir dir(path);if (!dir.exists()) {return;}// 设置过滤器dir.setFilter(QDir::Files | QDir::NoSymLinks);QStringList filters;filters << "*.jpg";dir.setNameFilters(filters);QStringList imgList = dir.entryList();if (imgList.count() <= 0) {return;}// 创建单元项double maxScore = 0;   /* 最大分数 */QString maxScoreName;for (int i = 0; i<imgList.count(); ++i) {QImage face1 = QImage("./m.jpg");QImage face2 = QImage(path + "/" + imgList.at(i));qDebug() <<face1.isNull() <<face2.isNull();double score = m_baiduFace->FaceMatch(face1, face2);if(score>=maxScore){maxScore = score;maxScoreName = imgList.at(i);}}qDebug() <<"end";qDebug() <<maxScoreName;emit resultReady(maxScore, maxScoreName);
}

2.3摄像头采集

可以查看我另一篇文章,使用qt自带封装的摄像头类QCamera、QCameraInfo、QCameraViewfinder、QCameraImageCapture

【QT】qt操作摄像头_Jason~shen的博客-CSDN博客_qt调用摄像头先上效果图左上角显示摄像头下拉选项,右上角分别是打开摄像头、关闭摄像头、截图保存的功能,左下显示摄像头内容,右下显示截图图片如何实现?1、在工程文件中添加,QT += multimedia(多媒体),QT += multimediawidgets2、主要用到的部件3、获取摄像头信息 //读取所有摄像头信息 QList<QCameraI...https://blog.csdn.net/qq_40602000/article/details/98875026

三、效果展示

 

源码下载qt+百度API实现人脸对比寻找明星脸-C++文档类资源-CSDN下载icon-default.png?t=M3K6https://download.csdn.net/download/qq_40602000/85287399

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/61164.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

根据姓名判断性别-人工智能

本帖训练一个可以根据姓名判断性别的CNN模型&#xff1b;我使用自己爬取的35万中文姓名进行训练。 使用同样的数据集还可以训练起名字模型&#xff0c;参看&#xff1a; TensorFlow练习7: 基于RNN生成古诗词https://github.com/tensorflow/models/tree/master/namignizerTensor…

一个很强大的人脸识别库face_recognition

官方网址&#xff1a;https://github.com/ageitgey/face_recognition 在图片中查找面孔&#xff1a; import face_recognition image face_recognition.load_image_file("your_file.jpg") face_locations face_recognition.face_locations(image) 查找和操作图片中…

人脸性别识别与表情识别代码——基于python深度学习的人脸属性识别

最近又到了毕业设计开题阶段了&#xff0c;想起当年毕业的时候因为不懂深度学习&#xff0c;做了很多功课&#xff0c;翻阅论文、Github&#xff0c;查找各类资源网站去学习&#xff0c;最后在公开资源的基础上调试了无数次&#xff0c;成功实现了基于深度学习的人脸属性识别课…

Java使用百度AI实现识别图片文字信息、身份证信息

百度AI识别API http://ai.baidu.com/docs#/OCR-API/top 这个官网里有丰富的识别示例文档、本文以识别身份证信息作为例子讲解 1、首先登录自己的 “百度智能云-管理中心” 创建应用获取app账号密码等信息 网址&#xff1a;https://console.bce.baidu.com 找到 “人工智能-文字…

Python实现AI图像识别-身份证识别

图像识别说白了就是把一张照片上面的文字进行提取&#xff0c;提供工作效率 需求分析 身份证识别主要是把一张身份证照片上面的文字信息进行提取&#xff0c;不用再使用人工去手动抄写了&#xff0c;下面给大家说的这个身份识别主要是使用pythonflask华为云OCR进行实现的。 …

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

文章目录 目录 一.UI界面设计 1.获取Access Token 二 http协议头构造 三.对接百度云人脸注册和识别 四.json数据处理 五&#xff0c;数据----->UI界面 六&#xff0c;效果 ​编辑 总结&#xff1a; 一.UI界面设计 左上lineedit是处理后的解析的json数据 下方的linee…

基于MobileNetv3实现人脸面部表情识别

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

Qt+百度AI实现人脸识别之人脸检测

文章目录 简单需求Demo运行结果百度AI人脸识别接入为什么使用百度AI接口接入步骤如何获取Access Token Qt软件开发人脸检测Qt编程步骤知识点网络编程get、put、post请求方式的区别简述POST 提交数据方式如何对图片进行BASE64编码JSON数据解析 核心代码数据上传请求反馈数据解析…

眼见不为“实”,人们更信任人工智能合成的假脸

常言道&#xff0c;耳听为虚&#xff0c;眼见为实。但是现在随着人工智能技术的发展&#xff0c;眼见可不一定为实。而造成这一结果的全都是因为深度伪造技术&#xff0c;简称深伪技术或者深度伪造。是Deep Learing&#xff08;深度学习&#xff09;和Fake&#xff08;伪造&…

LiveData数据倒灌?你真的用对了吗?源码解析

文章目录 livedata/lifecycleandroidx-lifecycle基本使用uml-关键角色关系观察者模式关键源码分析 livedata基本使用源码分析还是从observe开始livedata变化通知观察者 viewmodel源码分析 FAQlifecycle用到的设计模式lifecycle是如何监听aty生命周期的一些废弃和原因为什么废弃…

Spring Boot 优雅实现多租户架构,so easy~!

点击关注公众号&#xff0c;Java干货及时送达 国内最强微服务框架&#xff0c;没有之一&#xff01; 几乎覆盖 Spring Boot 所有操作&#xff01; 一、概述 1.什么是多租户架构&#xff1f; 多租户架构是指在一个应用中支持多个租户&#xff08;Tenant&#xff09;同时访问&…

Jenkins + Docker 一键自动化部署 Spring Boot 项目,步骤齐全,少走坑路!

点击关注公众号&#xff0c;Java干货及时送达 国内最强微服务框架&#xff0c;没有之一&#xff01; 几乎覆盖 Spring Boot 所有操作&#xff01; 本文章实现最简单全面的 Jenkinsdockerspringboot 一键自动部署项目&#xff0c;步骤齐全&#xff0c;少走坑路。 环境&#xff1…

MyBatis-Plus 可视化代码生成器来啦,让你的开发效率大大提速!!

点击关注公众号&#xff0c;Java干货及时送达 学习 Spring Cloud 微服务的正确姿势&#xff01; 用上 ChatGPT 啦&#xff0c;强的离谱&#xff01; 终于把 Spring Boot 3.0 写成书了&#xff01; 前言 在基于Mybatis的开发模式中&#xff0c;很多开发者还会选择Mybatis-Plus来…

农民工与学生为楼癫狂 富人加速撤离

首先是各级政府不约而同开始鼓励农民工进城买房。然后&#xff0c;国家信息中心宏观经济形势课题组的报告&#xff0c;甚至把这件事提高到了生死攸关的高度&#xff1a;农民工市民化&#xff0c;是消化住宅库存的关键环节和成败所在。特别想请教国家信息中心宏观经济形势课题组…

计算机成下一个土木了??

来源&#xff1a;知乎 最近互联网裁员&#xff0c;有网友热议&#xff1a;2022年大规模裁员后&#xff0c;计算机专业会不会成为下一个土木&#xff1f; 前些年抓住了互联网行业的红利期&#xff0c;进入大厂的员工&#xff0c;基本可以实现在一线城市买房扎根。 但反观现在&am…

读书笔记-大颠狂(非同寻常的大众幻想与群众性癫狂)

本书内容概要 《财富》杂志鼎力推荐的75本商务必读书之一&#xff0c;《金融时报》评选的史上最佳10部金融作品之一。本书在金融史上的地位不言自喻&#xff0c;在世界各地流传了近200年依然畅销不衰。它不单是一本金融投资领域的超级经典&#xff0c;也是一部有关人类愚行的编…

让人癫狂的24号,请你慢点离开

那一年&#xff0c;你18岁&#xff0c;初进联盟&#xff0c;受世人怀疑&#xff0c;拿下扣篮冠军  那一年&#xff0c;你19岁&#xff0c;史上ALL STAR首发&#xff0c;惊艳世人  那一年&#xff0c;你20岁&#xff0c;坐稳球队先发&#xff0c;场均19&#xff0c;成为一股…

IntelliJ IDEA 2019,从入门到癫狂,图文教程

点击上方“小哈学Java”&#xff0c;选择“星标” 回复“666”&#xff0c;领取100G独家整理的学习资料哟~ 来源&#xff1a;http://t.cn/Eiv6CTU 如果说IntelliJ IDEA是一款现代化智能开发工具的话&#xff0c;Eclipse则称得上是石器时代的东西了。 其实笔者也是一枚从Eclipse…

IntelliJ IDEA 2019从入门到癫狂 图文教程!

点击上方“方志朋”&#xff0c;选择“设为星标” 回复”666“获取新整理的面试资料 作者&#xff1a;yizhiwazi 来源&#xff1a;www.jianshu.com/p/9c65b7613c30 前言&#xff1a;IntelliJ IDEA 如果说IntelliJ IDEA是一款现代化智能开发工具的话&#xff0c;Eclipse则称得上…

新世纪的群众性幻想与癫狂3

又泡沫的地方&#xff0c;就有财富的地方 自我意淫的人造牛市 进入2015年以来&#xff0c;静默已久的A股股价就出现了一个令人意想不到的暴涨。到2015年6月中旬&#xff0c;上证综指已较2014年7月上涨了152%、较年初上涨了59.7%&#xff0c;中小企业板、创业板较年初更是上涨了…