QT+百度Ai车牌识别

QT+百度Ai车牌识别

文章目录

1.申请网页

c 复制代码
https://cloud.baidu.com/product/ocr_cars/plate

2.创建应用

3.获取AK与SK


4.根据AK与SK获取token

5.图片转Base64

接口文档需要我们把需要上传的车牌图片转为Base64格式

c 复制代码
//图片转base64
QByteArray carNum::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编码
        //对图片urlencode
        QByteArray imaData = codec->fromUnicode(base64).toPercentEncoding();
        return imaData;
  }

6.示例代码

c 复制代码
#include "carnum.h"
#include "ui_carnum.h"

carNum::carNum(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::carNum)
{
    ui->setupUi(this);
    ui->pushButton->setStyleSheet("QPushButton {"
                                  "    border: 2px solid #87CEEB;"
                                  "    border-radius: 15px;"
                                  "    background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1,"
                                  "                                      stop: 0 #F0FFFF, stop: 1 #87CEEB);"
                                  "    font-weight: bold;"
                                  "    padding: 5px;"
                                  "}");
    ui->pushButton_2->setStyleSheet("QPushButton {"
                                  "    border: 2px solid #87CEEB;"
                                  "    border-radius: 15px;"
                                  "    background-color: qlineargradient(x1: 0, y1: 0, x2: 1, y2: 1,"
                                  "                                      stop: 0 #F0FFFF, stop: 1 #87CEEB);"
                                  "    font-weight: bold;"
                                  "    padding: 5px;"
                                  "}");
    ui->pushButton_2->setEnabled(false);
    manager=new QNetworkAccessManager(this);
    connect(manager,&QNetworkAccessManager::finished,this,&carNum::reply);
    speech= new QTextToSpeech(this);

}


carNum::~carNum()
{
    delete ui;
}
void carNum::on_pushButton_clicked()
{
    QFileDialog dialog(this);
    dialog.setDirectory("C:/Users/19811/Desktop/carPic");
    //设置打开文件过滤屏蔽不需要的文件
    //QString filter = "车牌图片类型二(*.png;;*.jpg)";
    //获取文件路径
    QString fileName=dialog.getOpenFileName(this,NULL, QString(),NULL);
    if (!fileName.isEmpty()) {
        //设置label自适应
        ui->label->setScaledContents(true);
        //设置label图片
        ui->label->setPixmap(QPixmap(fileName));
        if(!fileName.isEmpty()){
            ui->pushButton_2->setEnabled(true);
        }
        //
        QString client_id="申请的AK";
        QString secret_id="申请的Sk";
        QString access_token="生成的token";
           // 打开文件
        QFile file(fileName);
           if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
               // 读取文件内容
               //QTextStream in(&file);

               //QString picData=in.readAll();
               //qDebug()<<content;
               //创建网络请求
               QNetworkRequest request;
               //baidu url需要三个参数 client_id,secret_id,access_token;
               QString url=(QString("https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate?"
                                    "client_id=%1&secret_id=%2&access_token=%3")
                                    .arg(client_id).arg(secret_id).arg(access_token)
                            );

               QByteArray body= imageToBase64(fileName);
               QByteArray imgData = "image=" + body;
               qDebug()<<body;
               //设置url
               request.setUrl(url);
               //设置头
               request.setHeader(QNetworkRequest::ContentTypeHeader,QString("application/x-www-form-urlencoded"
                                                                            "Accept: application/json"
                                                                            ));
               manager->post(request,imgData);

               // 在文本编辑框中显示文件内容
           }
       }


}

void carNum::reply(QNetworkReply *workReply)
{
    QByteArray data =workReply->readAll();

    QJsonObject root=QJsonDocument::fromJson(data).object();
    //获取key为words_result的对象
    QJsonValue val = root.value("words_result");

    //获取key为number的值
    QString carId = val.toObject().value("number").toString();
    ui->lineEdit->setText(carId);
    int carNum=2000;
    QString num= QString::number(carNum);
    speech->say(QString("车牌号"+ carId)+"欢迎进入"+"剩余车位"+ num);
    //speech->say(QString());
    qDebug()<<QString("welcome"+ carId);


}
//图片转base64
QByteArray carNum::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编码
        //对图片urlencode
        QByteArray imaData = codec->fromUnicode(base64).toPercentEncoding();
        return imaData;
  }

7.效果展示

相关推荐
冻柠檬飞冰走茶2 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing033 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊3 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆6754 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩4 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
Hhy_11076 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
starzy19906 小时前
深入理解Scala函数定义:从方法到函数的类型跨越
开发语言·scala
starzy19906 小时前
深入理解Scala递归函数:从栈溢出到尾调用优化
开发语言·scala
三*一7 小时前
Mapbox‑GL JS 多边形折点编辑工具:实现原理、功能拆解与踩坑总结
开发语言·javascript·ecmascript
YSL0701247 小时前
C++基础
开发语言·c++