qt学习:http+访问百度智能云api实现车牌识别

目录

登录到百度智能云,找到文字识别

 完成操作指引

开通

查看车牌识别的api文档

​编辑​编辑

查看自己应用的api key

查看回应的数据格式 

编程步骤

ui界面编辑

添加模块,头文件和定义变量

新建两个类,一个图像Image类,一个http类,http类继承QObject类,并添加头文件并定义成员和函数

实现图像Image类,Http类的函数

在ui界面的cpp中添加全局变量,根据自己的应用来写,开头有获取方法

编写打开图片按钮的点击事件

编写识别按钮的点击事件


登录到百度智能云,找到文字识别

 完成操作指引

  •  免费尝鲜---服务类型选择交通---接口选择全部----0元领取
  • 创建应用---填写应用名称---个人----应用描述

开通

查看车牌识别的api文档

查看自己应用的api key

查看回应的数据格式 

编程步骤

ui界面编辑

添加模块,头文件和定义变量


在pro中添加模块
QT       += core gui network在ui界面类的.h里添加
#include <QDebug>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QThread>
#include <QFileDialog>#include "image.h"
#include "http.h"

新建两个类,一个图像Image类,一个http类,http类继承QObject类,并添加头文件并定义成员和函数

Image类

#include <QString>
#include <QImage>
#include <QBuffer>
#include <QTextCodec>public:static QByteArray imageToBase64(QString fileName);

Http类

#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QEventLoop>public:static bool  post_syns(QString url,QMap<QString,QString>header,QByteArray& requestData,QByteArray&replyData);

实现图像Image类,Http类的函数

Image类

//将图片转换为base64位
QByteArray Image::imageToBase64(QString fileName)
{//创建一个QImage对象img,并使用传入的文件名fileName来初始化它QImage img(fileName);//创建一个空的QByteArray对象ba,用于存储图片的二进制数据QByteArray ba;//用QByteArray构造QBuffer//创建一个QBuffer对象buf,并将之前创建的QByteArray对象ba的地址传递给它。//这样,我们可以将数据写入这个缓冲区QBuffer buf(&ba);//打开缓冲区buf以进行写操作。这是为了准备将图片数据写入缓冲区buf.open(QIODevice::WriteOnly);//将图片对象img保存到缓冲区buf中,使用JPG格式。//这样,图片的二进制数据将被写入到之前创建的QByteArray对象中img.save(&buf,"JPG");//把img 写入QBuffer//将之前存储的图片二进制数据转换为Base64编码的字符串,并存储在新的QByteArray对象中QByteArray base64 = ba.toBase64();//不包含编码头//创建一个指向UTF-8编码的文本编解码器的指针。QTextCodec *codec = QTextCodec::codecForName("utf-8");//对Base64编码的字符串进行URL编码//对图片urlencodeQByteArray imaData = codec->fromUnicode(base64).toPercentEncoding();return imaData;
}

Http类

//提交http并将回应数据接收并判断是否提交成功
bool Http::post_syns(QString url, QMap<QString,QString>header, QByteArray &requestData, QByteArray &replyData)
{//创建管理者对象,负责发送和管理网络请求QNetworkAccessManager manager;//发送请求的动作//创建http请求包对象,用于存储关于HTTP请求的信息QNetworkRequest request;//请求的内容(包含url和头)//设置请求的URL为传入的url参数request.setUrl(url);//创建一个迭代器来遍历传入的请求头QMapIterator<QString,QString> it(header);//循环遍历所有的请求头while(it.hasNext()){//移动迭代器到下一个头it.next();//为请求设置一个原始头//.toLatin1()方法将字符串转换为Latin-1编码的字节数组,//因为Qt的网络模块要求头字段使用Latin-1编码request.setRawHeader(it.key().toLatin1(),it.value().toLatin1());}//使用之前设置的请求信息和请求数据发送一个POST请求,并将返回的响应对象存储在reply指针中QNetworkReply *reply =  manager.post(request,requestData);//创建一个事件循环对象QEventLoop l;//当网络请求完成时,连接的信号(finished)将触发事件循环的退出槽(quit)//当网络请求完成时,事件循环会结束connect(reply,&QNetworkReply::finished,&l,&QEventLoop::quit);//开始事件循环,等待网络请求完成事件发生l.exec();//检查是否有一个有效的响应对象,并且该响应没有错误if(reply != nullptr && reply->error() == QNetworkReply::NoError){//从响应对象中读取所有的数据,并存储在replyData中replyData  = reply->readAll();//返回成功return true;}else//返回失败return false;
}

在ui界面的cpp中添加全局变量,根据自己的应用来写,开头有获取方法

const QString baiduTokenUrl = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%1&client_secret=%2&";const char *client_id = ""; //APP Key
const char *secret_id = "";//Secret Key
const QString baiduImageUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate?access_token=%1";

编写打开图片按钮的点击事件

//打开图片
void Widget::on_btnOpen_clicked()
{//打开文件对话框,获取文件的路径名,返回字符串fileName = QFileDialog::getOpenFileName(this,//当前界面"打开图片",//标题".",//默认路径"Image(*.png *.bmp *.jpg);"//过滤器);//判断文件是否打开成功if(fileName.isEmpty())return ;//创建文件对象QImage img(fileName);//将图片自适应显示到label上img = img.scaled(ui->label->size());ui->label->setPixmap(QPixmap::fromImage(img));
}

编写识别按钮的点击事件

    //判断有没有图片路径if(fileName.isEmpty())return ;//调用自己定义的静态函数将图片转换为base64位QByteArray img = Image::imageToBase64(fileName);//组合成包体的一部分//将"image="字符串和转换后的Base64图片数据拼接在一起,形成完整的图片数据,用于后续的网络请求QByteArray imgData = "image=" + img; //body//获取access_token,文档中提到要先获取access_token//保存回复信息的对象QByteArray replyData; //保存回复信息//组合urlQString url = QString(baiduTokenUrl).arg(client_id).arg(secret_id);//封装头部信息//创建一个QMap对象来存储HTTP头部信息。QMap<QString,QString> header; //封装头部信息//这里只插入了一个头部信息,即"Content-Type",其值为"application/x-www-form-urlencoded"header.insert(QString("Content-Type"),QString("application/x-www-form-urlencoded"));//调用自己定义的静态函数提交http//url为接口地址//header是Content-Type:application/x-www-form-urlencoded,接口文档里有规定//imgData是图片的base64数据//replyData是回应的数据bool result = Http::post_syns(url,header,imgData,replyData);//判断是否提交成功,有数据返回if(result){//从字符串中解析为一个json对象QJsonObject obj = QJsonDocument::fromJson(replyData).object();//获取对象里key为access_token的值,该值就是access_tokenaccessToken = obj.value("access_token").toString();}//清除回应的数据replyData.clear();//将url和access_token组合QString imgurl = baiduImageUrl.arg(accessToken);//调用自己定义的静态函数提交http,和第一次只是url不一样//url为接口地址//header是Content-Type:application/x-www-form-urlencoded,接口文档里有规定//imgData是图片的base64数据//replyData是回应的数据result = Http::post_syns(imgurl,header,imgData,replyData);//判断是否提交成功if(result){//打印回应的结果qDebug()<<"replyData:"<<replyData;//解析结果成一个json对象QJsonObject obj = QJsonDocument::fromJson(replyData).object();//获取key为words_result的对象QJsonValue val = obj.value("words_result");//获取key为number的值QString carId = val.toObject().value("number").toString();//输出车牌qDebug()<<"carId:"<<carId;//显示车牌ui->lineEdit->setText(carId);}else{//提交失败ui->lineEdit->setText("unkown");}

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

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

相关文章

Day01-变量和数据类型课后练习(输出你最想说的一句话,定义所有基本数据类型的变量和字符串变量,用合适类型的变量存储个人信息并输出,定义圆周率PI,简答题)

参考答案博客链接跳转 文章目录 1、输出你最想说的一句话&#xff01;2、定义所有基本数据类型的变量和字符串变量3、用合适类型的变量存储个人信息并输出4、定义圆周率PI5、简答题 1、输出你最想说的一句话&#xff01; 编写步骤&#xff1a;List item定义类 Homework1&…

【嵌入式移植】5、U-Boot源码分析2—make nanopi_neo2_defconfig

U-Boot源码分析2—make nanopi_neo2_defconfig 1 概述2 nanopi_neo2_defconfig3 编译过程分析3.1 编译目标3.2 scripts_basic3.2.1 prefix src定义3.2.2 PHONY3.2.3 __build3.2.4 fixdep3.3 objscripts/kconfig 1 概述 上一章中&#xff0c;对Makefile相关源码进行了初步分析&…

从零开始:CentOS系统下搭建DNS服务器的详细教程

前言 如果你希望在CentOS系统上建立自己的DNS服务器,那么这篇文章绝对是你不容错过的宝藏指南。我们提供了详尽的步骤和实用技巧,让你能够轻松完成搭建过程。从安装必要的软件到配置区域文件,我们都将一一为你呈现。无论你的身份是运维人员,还是程序员,抑或是对网络基础设…

服务端开发小记02——Maven

这里写目录标题 Maven简介Maven在Linux下的安装Maven常用命令 Maven简介 Apache Maven Project是一个apache的开源项目&#xff0c;是用于构建和管理Java项目的工具包。 用Maven可以方便地创建项目&#xff0c;基于archetype可以创建多种类型的java项目&#xff1b;Maven仓库…

5G_RACH(一)

什么是RACH RACH 代表 Random Access Channel。这是开机时UE发给eNB的第一条消息。 为什么选择RACH &#xff1f;&#xff08;RACH 的功能是什么&#xff1f; 当你第一次听到RACH或RACH Process这个词时&#xff0c;你脑海中浮现的第一个问题是“为什么是RACH&#xff1f;”…

05 Redis之Benchmark+简单动态字符串SDS+集合的底层实现

3.8 Benchmark Redis安装完毕后会自动安装一个redis-benchmark测试工具&#xff0c;其是一个压力测试工具&#xff0c;用于测试 Redis 的性能。 src目录下可找到该工具 通过 redis-benchmark –help 命令可以查看到其用法 3.8.1 测试1 3.9 简单动态字符串SDS 无论是 Redis …

网络通信实现

【 一 】网络通信实现 【 1 】实现网络通信的四要素 本机的ip地址 子网掩码 网关的IP地址 DNS的IP地址( 域名系统) DNS服务器是指提供域名解析服务的服务器。它负责将域名转换为相应的IP地址&#xff0c;以便计算机可以通过IP地址与其他设备进行通信。 通过使用DNS服务器…

【C语言】linux内核ipoib模块 - ipoib_netdev_ops_pf结构

一、ipoib_netdev_ops_pf结构 static const struct net_device_ops ipoib_netdev_ops_pf {.ndo_init ipoib_ndo_init,.ndo_uninit ipoib_ndo_uninit,.ndo_open ipoib_open,.ndo_stop ipoib_stop,.ndo_change_mtu ipoib_change_mtu,.ndo_…

java servlet勤工助学家教管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet 勤工助学家教管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myecli…

绝地求生:【PC】开发者日志:竞技比赛地图轮换

各位玩家大家好&#xff0c;欢迎收看闲游盒本期开发者日志。 今天闲游盒想和大家分享一下2024年竞技比赛地图轮换的几项主要改动。 从第28赛季第1轮更新&#xff08;2月&#xff09;开始&#xff0c;竞技比赛的地图阵容中将包含所有8x8尺寸的地图&#xff0c;在电竞赛事中出场…

SpringBoot-yml文件的配置与读取

配置 值前边必须要有空格&#xff0c;作为分隔符 使用空格作为缩进表示层级关系&#xff0c;相同的层级左侧对齐 获取 使用Value(”${键名}”) 使用ConfigurationProperties(prefix "前缀") 1.前缀要与yml配置文件中的前缀一致 2.实体类的字段名与配置文件中的键名一…

【微服务】springboot集成ELK使用详解

目录 一、前言 二、为什么需要ELK 三、ELK介绍 3.1 什么是elk 3.2 elk工作原理 四、ELK环境搭建 4.1 搭建es环境 4.1.1 获取es镜像 4.1.2 启动es容器 2.1.3 配置es参数 2.1.4 重启es容器并访问 4.2 搭建kibana 4.2.1 拉取kibana镜像 4.2.2 启动kibana容器 4.2.3 …

GitLab16.8配置webhooks、Jenkins2.4配置GitLab插件实现持续集成、配置宝塔面板实现持续部署

看本篇文章的前提是已经部署完GItlab和Jenkins服务器&#xff0c;已经可以手动构建成功&#xff0c;并且经过了很多次实践&#xff0c;对这两款软件基本熟悉。 建议大家按以下顺序看 前端自动化&#xff08;其一&#xff09;部署gitlab https://blog.csdn.net/weixin_45062076…

【Redis】Redis集群方案应该怎么做 都有哪些方案

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Redis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 &#xff08;1&#xff09;twemproxy &#xff08;2&#xff09;codis &#xff08;3&#xff09;redis cluster3.0自带的集群 …

爬虫基础-前端基础

Html是骨骼、css是皮肤、js是肌肉&#xff0c;三者之间的关系可以简单理解为m(html)-v(css)-c(js) 浏览器的加载过程 构建dom树 子资源加载-加载外部的css、图片、js等外部资源 样式渲染-css执行 DOM树 ajax、json、xml AJAX 是一种在无需重新加载整个网页的情况下&#xf…

iOS_Xcode_LLDB调试常用命令

文章目录 结构常用命令&#xff1a;1、流程控制&#xff1a;2、常用命令3、进程信息&#xff1a;4、寄存器&#xff1a;register5、镜像&#xff1a;image6、内存&#xff1a;memory7、符号断点&#xff1a;breakpoint8、内存断点&#xff1a;watchpoint9、Tips&#xff1a; 结…

MySQL 学习记录

基本常识 row-size-limitsblob&#xff1a; BLOB and TEXT columns cannot have DEFAULT values.Instances of BLOB or TEXT columns in the result of a query that is processed using a temporary table causes the server to use a table on disk rather than in memory b…

【vue】图片加载骨架

一、前言 在网速较低或者网站的服务器宽带只有几MB的情况下&#xff0c;网页中的图片加载时&#xff0c;要么空白&#xff0c;要么像打印机一样一行一行地“扫描”出来&#xff0c;为了提升用户体验&#xff0c;可以给图片标签外加一层骨架。 无骨架 有骨架 二、详细设计 每张…

MySQL之索引分类,语法以及SQL性能分析(慢日志,profile,explain)

索引分类 分类含义特定关键字主键索引针对于表中主键创建的索引默认自动创建&#xff0c;只能有一个PRIMARY唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE常规索引快速定位特定数据可以有多个全文索引全文索引查找的文本中的关键字&#xff0c;而不是比较索引中的…

如何在 VM 虚拟机中安装 Deft(数字证据及取证工具箱) 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 先得安装 VM 虚拟机&#xff0c;没有的可以参考这篇文章安装 VM 虚拟机 如何在 VM 虚拟机中安装 Win10 操作系统保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135713915 二、Deft 镜像 下载…