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

文章目录

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

简单需求

本篇笔记中的示例实现了打开一张人脸图片,识别出年龄、性别、颜值等人脸属性信息。其它的人脸比对、身份验证、活体检测等等功能都可以在此基础上进行扩展,差不多都是对人脸识别接口的调用和信息处理。

Demo运行结果

这个功能可以当做是娱乐功能,同一个人不同风格的照片识别结果可能不同。
这里写图片描述


百度AI人脸识别接入

为什么使用百度AI接口

人脸识别可接入的平台挺多的,阿里云、腾讯云、Face++等等,如果是商用的话就得慎重了,毕竟要考虑的不仅是接口稳定性,还有价格、技术支持、售后等很多方面。这里只是用来学习,所以考虑的问题就比较简单了,只是关乎Money,而百度AI的接口绝大部分都免费,只是商用需要高并发或者一些付费资源的话需要付费,学习的话免费资源完全满足需求了。同样注册了阿里云的应用,直接收费,Face++给了限定的测试次数,所以选择了百度AI。技术而言,Face++可能在人脸识别这方面更专业一点,但目前各大平台的识别率基本没有什么区别。
这里写图片描述

接入步骤

  1. 注册百度账号,用来登录百度AI开发平台(http://ai.baidu.com/),有账号的可以直接登录
  2. 注册成为开发者
  3. 创建应用,应用创建成功之后也就开通了人脸检测、人脸比对等等相关业务
  4. 获取密钥,AppID、API Key和Secret key
  5. 生成签名(Access Token),这个写代码的时候要用到,每个应用的Access Token有效期为30天,到期后要重新获取,或者是在写代码时每次都获取一下
  6. 启动开发

百度AI开放平台上有详细的接入指南:http://ai.baidu.com/docs#/Begin/top

如何获取Access Token

向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:

  • grant_type: 必须参数,固定为client_credentials
  • client_id: 必须参数,应用的API Key
  • client_secret: 必须参数,应用的Secret Key

具体的参数值可以在下图位置中的“应用列表”里查看:
这里写图片描述
使用在线post工具按照上面的地址和参数进行请求就可以得到Access Token了,百度搜索“在线post工具"有很多可用的,这里使用http://coolaf.com/举例:
这里写图片描述


Qt软件开发

编程部分并不复杂,主要是对百度AI接口的调用及对请求数据的解析。但实现示例的功能还是用到了挺多知识点,下面会进行记录。

人脸检测Qt编程步骤

  1. 绑定请求服务器地址和密钥
  2. 按照百度人脸检测接口的格式要求添加header
  3. 将要检测的图片转换为为BASE64编码(这里需要注意一下,官方说上传的图片不能大于2M,测试了一个3M的图片依然可以请求成功,不过需要好几秒才能收到反馈,测试的3M的图片转成BASE64编码后长度超过1000万个字节,图片越小识别的速度越快)
  4. 按照百度人脸检测接口的格式要求打包body数据
  5. 使用post方式上传请求
  6. 解析反馈数据

注意:这里的请求内容必须按照百度接口指定的格式,格式如下
这里写图片描述

知识点

网络编程

这里使用了QtNetwork模块中的网络接口来实现http编程,需要在.pro文件中添加 QT += network,主要用到了下面三个类:

  • QNetworkAccessManager:该类允许应用程序发送网络请求和接收回复,类似于一个中转站或者一个容器,每当有请求创建或者接收到回复都由该类进行调度
  • QNetworkRequest:网络请求
  • QNetworkReply:网络请求的应答,在请求被完成调度是由QNetworkAccessManager创建

get、put、post请求方式的区别简述

这里只用到了post请求,并且目前大多数网络请求的方式均使用post。

  • GET请求(类似于数据库select操作),会向数据库发送数据的请求,从而来获取信息,不会改变数据内容,并且无论进行多少次操作,结果都是一样的
  • PUT请求(类似于数据库update操作),是会向服务器端发送数据的,会修改数据的内容,但是不会增加数据的种类,并且无论进行多少次操作,结果都是一样的
  • POST请求(类似于数据库insert操作),是会向服务器端发送数据的,但是该请求会改变数据的种类等资源,会创建新的内容

POST 提交数据方式

常用格式如下:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • application/json
  • text/xml

这篇文章里有这四种方式的详细介绍

如何对图片进行BASE64编码

  1. 提取图片
  2. 数据转换为BASE64编码

代码如下:

QImage image("H:/test.jpg");
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
//以png格式将图片数据写入ba
image.save(&buffer, "png");
//将图片进行BASE64编码
QString imgData = QString(ba.toBase64());
buffer.close();

JSON数据解析

这部分内容还挺多的,可以从网络学习JSON教程,下面的代码里也有用到。

核心代码

数据上传

//设置请求地址
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);

请求反馈数据解析

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();

完整示例代码

https://download.csdn.net/download/zbw1185/10613073

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

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

相关文章

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

常言道&#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;中小企业板、创业板较年初更是上涨了…

癫狂的dom——利用css3让dom动起来

不废话&#xff0c;先来看一下效果&#xff1a; 下面上代码&#xff1a; html部分&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title></title><link href"shake.css" …

IntelliJ IDEA 2019从入门到癫狂

前言&#xff1a;IntelliJ IDEA 如果说IntelliJ IDEA是一款现代化智能开发工具的话&#xff0c;Eclipse则称得上是石器时代的东西了。 其实笔者也是一枚从Eclipse转IDEA的探索者&#xff0c;随着近期的不断开发实践和调试&#xff0c;逐步体会到这款智能IDE带来的巨大开发便利…

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

历史不会改变&#xff0c;只会一次次的重复 经过了千万年的进化&#xff0c;人类已经站在了食物链的顶端。人类的进化并不是肢体或皮毛上演化所带来的结果&#xff0c;而是人类具有智慧&#xff0c;知道使用大脑去思考判断。但是&#xff0c;人毕竟还是动物&#xff0c;内心所保…

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

点击上方“朱小厮的博客”&#xff0c;选择“设为星标” 做积极的人&#xff0c;而不是积极废人 来源&#xff1a;http://t.cn/Eiv6CTU 前言&#xff1a;IntelliJ IDEA 如果说IntelliJ IDEA是一款现代化智能开发工具的话&#xff0c;Eclipse则称得上是石器时代的东西了。 其实笔…

CXO是什么?医药板块龙头都有哪些?

制药行业是当今最复杂、监管最严格的行业之一。新药的开发&#xff0c;从最初的发现到最终的批准&#xff0c;是一个漫长而昂贵的过程&#xff0c;需要许多不同专业人士的专业知识。而制药公司面临的主要挑战之一是平衡创新需求与成本效率需求&#xff0c;面对这个挑战&#xf…

医疗器械上市公司

内在上交所和深交所上市的公司中&#xff0c;主营业务为医疗器械的一共有35家&#xff0c;在港交所上市的有8家&#xff0c;共计43家。 图片来自“123RF图库” 医疗器械、药品和医疗服务并称为医疗行业的三驾马车。国家政策的支持&#xff0c;市场容量的扩张&#xff0c;无疑…

全网盘点有哪些免费开源提高生产力的 GitHub 项目火了?

全网盘点有哪些免费开源提高生产力的 GitHub 项目火了&#xff1f; 开箱即用的地理信息系统 「地理信息系统&#xff08;Geographic Information System&#xff0c;简称 GIS&#xff09;」是一种用于采集、存储、处理、分析、管理和展示地理信息的计算机系统。 简单来说&…

科普:生成式 AI 简介

What I cannot create, I do not understand. - Richard Feynman 前言 你左拥右抱着 Stable Diffusion 和 MidJourney 创造美轮美奂的图片。 你熟练使用着 ChatGPT 和 LLaMa 创造辞致雅赡的文字。 你来回切换着 MuseNet 和 MuseGAN 创造高山流水的音乐。 毋庸置疑&#xff0c;人…