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,一经查实,立即删除!

相关文章

Linux常用指令的整合

之前面试被问到了Linux相关的指令&#xff0c;所以我整理的一份常用的Linux指令列表&#xff0c;适用于大多数Linux发行版&#xff0c;现分享给大家&#xff1a; 文件操作 ls&#xff1a;列出目录内容。cd [目录]&#xff1a;更改当前目录。pwd&#xff1a;显示当前目录路径。m…

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

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

Qt容器QVariant

在Qt中&#xff0c;QVariant是一个通用的值容器&#xff0c;它可以存储任意类型的数据&#xff0c;例如整数、字符串、列表等等。其主要用于提供一种通用的数据类型&#xff0c;方便在不同的函数、类、模块之间传递数据。 QVariant类是Qt的共用体union数据类型&#xff0c;不仅…

【嵌入式移植】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;”…

HarmonyOS --@Prop和@Link同步信息装饰器

当应用中父子组件需要数据同步时&#xff0c;可以使用Prop和Link装饰器 一个组件被引用时&#xff0c;引用其他组件的组件就是父组件、被引用的组件就是子组件。 由于State装饰器无法执行父子之间的数据通信 Prop&#xff1a;单向同步、父组件中修改数据&#xff0c;会同步到子…

最近公共祖先(LCA)主要算法:

1&#xff09;向上标记法&#xff1a; 从x向上走到根节点&#xff0c;并标记所有经过的节点。 从y向上走到根节点&#xff0c;当第一次遇到已标记的节点时&#xff0c;就找到了LCA&#xff08;x,y&#xff09;. 2&#xff09;树上倍增法&#xff1a; 树上倍增法是一个很重要…

心理学笔记——我们如何思考-思想、语言和手语

我们如何思考-思想、语言和手语 研究语言的理论&#xff1a;计算理论、认知神经学、进化论 当我们讨论语言时&#xff0c;指的是英语、中文、日语这样的语言系统 所有语言都共享一些深层且复杂的共性&#xff0c;最直观的就是每一种语言都能够有效地表达抽象概念——思想、物…

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 …

redis原理(五)Lua语言

一、介绍&#xff1a; 1、背景&#xff1a; 在 Redis 的 2.6 以上版本中&#xff0c;除了可以使用命令外&#xff0c;还可以使用 Lua 语言操作 Redis。 Redis 命令的计算能力并不算很强大&#xff0c;而使用 Lua 语言则在很大程度上弥补了 Redis 的这个不足。 2、特点&#…

网络通信实现

【 一 】网络通信实现 【 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;在电竞赛事中出场…

linux ping 某台服务的端口

在 Linux 中&#xff0c;可以使用 telnet 命令来测试远程主机的端口是否可达。以下是使用 telnet 命令来 ping 端口的示例&#xff1a; telnet <远程主机IP> <端口号> 例如&#xff0c;如果要测试远程主机 192.168.1.100 的端口 80 是否可达&#xff0c;可以使用…

SpringBoot-yml文件的配置与读取

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

Spring中的bean配置

配置说明 类别描述名称bean类型标签所属beans标签功能定义Spring核心容器管理的对象格式 属性列表id:bean的id&#xff0c;使用容器可以通过id值获取对应的bean&#xff0c;在一个容器中id是唯一的class:bean的类型&#xff0c;即配置的bean的全路径类名范例 1、Bean别名配置 …

【微服务】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 …