Qt+百度AI实现人脸识别之人脸检测
文章目录
- 简单需求
- Demo运行结果
- 百度AI人脸识别接入
- 为什么使用百度AI接口
- 接入步骤
- 如何获取Access Token
- Qt软件开发
- 人脸检测Qt编程步骤
- 知识点
- 网络编程
- get、put、post请求方式的区别简述
- POST 提交数据方式
- 如何对图片进行BASE64编码
- JSON数据解析
- 核心代码
- 数据上传
- 请求反馈数据解析
- 完整示例代码
简单需求
本篇笔记中的示例实现了打开一张人脸图片,识别出年龄、性别、颜值等人脸属性信息。其它的人脸比对、身份验证、活体检测等等功能都可以在此基础上进行扩展,差不多都是对人脸识别接口的调用和信息处理。
Demo运行结果
这个功能可以当做是娱乐功能,同一个人不同风格的照片识别结果可能不同。
百度AI人脸识别接入
为什么使用百度AI接口
人脸识别可接入的平台挺多的,阿里云、腾讯云、Face++等等,如果是商用的话就得慎重了,毕竟要考虑的不仅是接口稳定性,还有价格、技术支持、售后等很多方面。这里只是用来学习,所以考虑的问题就比较简单了,只是关乎Money,而百度AI的接口绝大部分都免费,只是商用需要高并发或者一些付费资源的话需要付费,学习的话免费资源完全满足需求了。同样注册了阿里云的应用,直接收费,Face++给了限定的测试次数,所以选择了百度AI。技术而言,Face++可能在人脸识别这方面更专业一点,但目前各大平台的识别率基本没有什么区别。
接入步骤
- 注册百度账号,用来登录百度AI开发平台(http://ai.baidu.com/),有账号的可以直接登录
- 注册成为开发者
- 创建应用,应用创建成功之后也就开通了人脸检测、人脸比对等等相关业务
- 获取密钥,AppID、API Key和Secret key
- 生成签名(Access Token),这个写代码的时候要用到,每个应用的Access Token有效期为30天,到期后要重新获取,或者是在写代码时每次都获取一下
- 启动开发
百度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编程步骤
- 绑定请求服务器地址和密钥
- 按照百度人脸检测接口的格式要求添加header
- 将要检测的图片转换为为BASE64编码(这里需要注意一下,官方说上传的图片不能大于2M,测试了一个3M的图片依然可以请求成功,不过需要好几秒才能收到反馈,测试的3M的图片转成BASE64编码后长度超过1000万个字节,图片越小识别的速度越快)
- 按照百度人脸检测接口的格式要求打包body数据
- 使用post方式上传请求
- 解析反馈数据
注意:这里的请求内容必须按照百度接口指定的格式,格式如下
知识点
网络编程
这里使用了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编码
- 提取图片
- 数据转换为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
Qt+百度AI实现人脸识别之人脸检测相关推荐
- SSM+ajax使用百度AI人脸识别(人脸对比)功能心得
最近做毕业设计,算是自己第一次独立完成一个系统,使用了百度ai的接口,查询了大部分网络上的博客,也来分享一下自己的经验. 1.首先,使用之前先注册一个百度AI开放平台的账号 2.登录之后,创建属于自己 ...
- Python基于百度AI的人脸识别系统--颜值检测
基于百度AI的人脸识别系统–颜值检测 刚开始学,觉得好玩就写了这个 主要是分为人脸识别系统的对接,UI的设计 人脸识别系统: 用的百度的AI,其中的AK,SK可以换成自己的,在百度开放平台上注册就能获 ...
- 百度AI实现m:n人脸搜索
利用百度ai实现m:n人脸搜索并标注中文 创建百度智能云账号并登录 注册人脸库,向人脸库添加人脸 调用api,人脸画框 完整代码实现 大家好,我是爱码士_秃头兔子,一个刚毕业从事计算机视觉的新人.如果 ...
- Android 百度人脸识别、人脸采集、文字识别(身份证),人证对比
Android 百度人脸识别.人脸采集.文字识别(身份证),人证对比 Android 拍照.图片压缩(兼容7.0) 由于公司的项目赶在 "某某打车" 事件期间,所以你懂得.老板说要 ...
- flutter 刷脸_GitHub - nnnggel/baidu_face_plugin: 百度人脸识别和活体检测 Flutter 插件(目前版本仅支持 Android)...
baidu_face_plugin 百度人脸识别和活体检测 Flutter 插件(目前版本仅支持 Android) 使用方式 注册百度开发者账号 前往 百度开发者账号 进行注册. 申请并配置licen ...
- Qt+OpenCV之图片中的人脸识别及人脸抠图
效果 OpenCV函数知识点 imread() 功能:载入图像 函数原型:Mat cv::imread ( const String & filename, int flags = IMREA ...
- 人工智能AI系列 - 人脸识别套件列表,包括人脸检测,人脸识别,人脸关键点,人脸比对,人脸搜索等等。
人脸识别套件列表 打造最好的java开源人脸识别套件,包括人脸检测,人脸识别,人脸关键点,人脸比对,人脸搜索等等. 人脸检测SDK 人脸检测SDK 链接 人脸检测 (含5个人脸关键点) SDK 链接 ...
- Python | 人脸识别系统(人脸识别、活体检测、背景模糊、关键点检测)
本博客为人脸识别系统项目简介 项目GitHub完整源代码地址:Su-Face-Recognition: A face recognition for user logining 一.运行环境 本系统能 ...
- 【深度学习】人脸识别和口罩检测的应用
[深度学习]人脸识别和口罩检测的应用 文章目录 1 概述 2 人脸识别模型搭建与训练 3 口罩检测3.1 数据来源3.2 YoloV4简介3.3 数据集处理3.4 开始训练3.5 测试 1 概述 1. ...
- Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)
文章目录 1.获取app_id和sdk_key和下载SDK的步骤 2.填写app_id和sdk_key 4.翻译 5.人脸识别错误码 6.人脸识别界面 7.重要的理解 8.自定义 9.查看手机文件里的 ...
最新文章
- 第一次来请大家多多关照---毕业生找工作篇
- 阳泉师范高等专科学校计算机系,阳泉师范高等专科学校
- amd显卡显存测试程序_AMD发布Radeon 6000系列显卡:能耗比大提升
- DataGrid内容的导出
- 继电器rc吸收电路取值_一文读懂继电器的工作原理以及驱动电路
- pytorch教程龙曲良41-45
- 一个人成为废材的9大原因
- 计算机主机和cpu的区别,服务器CPU和普通电脑CPU有什么区别?
- 华农专业课计算机基础,华南农业大学期末考试大学计算机基础试卷.doc
- WPF Demo15 MVVM
- 关于WP7上音乐播放的嫉妒恶心的一些规则和解决方案。
- Adobe Acrobat软件安装步骤
- office增加自定义文档模板
- 有道词典android wear,iOS版有道词典6.0发布!最好的全能翻译工具
- android字体右对齐,Android TextView将文本右对齐和左对齐
- 什么是搜索引擎?搜索引擎有哪些?
- VSCode JavaScript 代码格式化 美化 Beautify
- python 利用opencv实现颜色检测
- 关于UNIX环境高级编程(第2版)——图灵计算机科学丛书的读后感
- Javascript变量名混淆细节
热门文章
- 论文阅读: B4: Experience with a Globally-Deployed Software Defined WAN
- 0 win10重装partition_用Win10系统自带的DiskPart工具为硬盘进行GPT分区图文教程
- python实现mp3文件播放
- java读取mp3文件头信息
- 【Atcoder Regular Contest 085F】 NRE
- 从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
- SlimDX的DirectSound模块
- 现在有哪些网页防篡改的技术?
- 在工程中加入第三方库
- centos8本地yum源的搭建