当前位置:   article > 正文

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

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

目录

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

 完成操作指引

开通

查看车牌识别的api文档

​编辑​编辑

查看自己应用的api key

查看回应的数据格式 

编程步骤

ui界面编辑

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

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

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

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

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

编写识别按钮的点击事件


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

 完成操作指引

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

开通

查看车牌识别的api文档

查看自己应用的api key

查看回应的数据格式 

编程步骤

ui界面编辑

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

  1. 在pro中添加模块
  2. QT += core gui network
  3. 在ui界面类的.h里添加
  4. #include <QDebug>
  5. #include <QJsonArray>
  6. #include <QJsonDocument>
  7. #include <QJsonObject>
  8. #include <QThread>
  9. #include <QFileDialog>
  10. #include "image.h"
  11. #include "http.h"

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

Image类

  1. #include <QString>
  2. #include <QImage>
  3. #include <QBuffer>
  4. #include <QTextCodec>
  5. public:
  6. static QByteArray imageToBase64(QString fileName);

Http类

  1. #include <QString>
  2. #include <QNetworkAccessManager>
  3. #include <QNetworkReply>
  4. #include <QNetworkRequest>
  5. #include <QEventLoop>
  6. public:
  7. static bool post_syns(QString url,QMap<QString,QString>header,QByteArray& requestData,QByteArray&replyData);

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

Image类

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

Http类

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

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

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

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

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

编写识别按钮的点击事件

  1. //判断有没有图片路径
  2. if(fileName.isEmpty())
  3. return ;
  4. //调用自己定义的静态函数将图片转换为base64
  5. QByteArray img = Image::imageToBase64(fileName);
  6. //组合成包体的一部分
  7. //"image="字符串和转换后的Base64图片数据拼接在一起,形成完整的图片数据,用于后续的网络请求
  8. QByteArray imgData = "image=" + img; //body
  9. //获取access_token,文档中提到要先获取access_token
  10. //保存回复信息的对象
  11. QByteArray replyData; //保存回复信息
  12. //组合url
  13. QString url = QString(baiduTokenUrl).arg(client_id).arg(secret_id);
  14. //封装头部信息
  15. //创建一个QMap对象来存储HTTP头部信息。
  16. QMap<QString,QString> header; //封装头部信息
  17. //这里只插入了一个头部信息,即"Content-Type",其值为"application/x-www-form-urlencoded"
  18. header.insert(QString("Content-Type"),QString("application/x-www-form-urlencoded"));
  19. //调用自己定义的静态函数提交http
  20. //url为接口地址
  21. //header是Content-Type:application/x-www-form-urlencoded,接口文档里有规定
  22. //imgData是图片的base64数据
  23. //replyData是回应的数据
  24. bool result = Http::post_syns(url,header,imgData,replyData);
  25. //判断是否提交成功,有数据返回
  26. if(result)
  27. {
  28. //从字符串中解析为一个json对象
  29. QJsonObject obj = QJsonDocument::fromJson(replyData).object();
  30. //获取对象里keyaccess_token的值,该值就是access_token
  31. accessToken = obj.value("access_token").toString();
  32. }
  33. //清除回应的数据
  34. replyData.clear();
  35. //将url和access_token组合
  36. QString imgurl = baiduImageUrl.arg(accessToken);
  37. //调用自己定义的静态函数提交http,和第一次只是url不一样
  38. //url为接口地址
  39. //header是Content-Type:application/x-www-form-urlencoded,接口文档里有规定
  40. //imgData是图片的base64数据
  41. //replyData是回应的数据
  42. result = Http::post_syns(imgurl,header,imgData,replyData);
  43. //判断是否提交成功
  44. if(result)
  45. {
  46. //打印回应的结果
  47. qDebug()<<"replyData:"<<replyData;
  48. //解析结果成一个json对象
  49. QJsonObject obj = QJsonDocument::fromJson(replyData).object();
  50. //获取key为words_result的对象
  51. QJsonValue val = obj.value("words_result");
  52. //获取keynumber的值
  53. QString carId = val.toObject().value("number").toString();
  54. //输出车牌
  55. qDebug()<<"carId:"<<carId;
  56. //显示车牌
  57. ui->lineEdit->setText(carId);
  58. }
  59. else
  60. {
  61. //提交失败
  62. ui->lineEdit->setText("unkown");
  63. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/372986
推荐阅读
相关标签
  

闽ICP备14008679号