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.效果展示

相关推荐
How_doyou_do1 分钟前
数据传输优化-异步不阻塞处理增强首屏体验
开发语言·前端·javascript
只因在人海中多看了你一眼11 分钟前
B.50.10.09-RPC核心原理与电商应用
qt·网络协议·rpc
jingfeng51418 分钟前
C++11可变参数模板、emplace系列接口、包装器
开发语言·c++
云天徽上19 分钟前
【数据可视化-107】2025年1-7月全国出口总额Top 10省市数据分析:用Python和Pyecharts打造炫酷可视化大屏
开发语言·python·信息可视化·数据挖掘·数据分析·pyecharts
Tina表姐28 分钟前
(C题|NIPT 的时点选择与胎儿的异常判定)2025年高教杯全国大学生数学建模国赛解题思路|完整代码论文集合
c语言·开发语言·数学建模
轮到我狗叫了2 小时前
牛客.小红的子串牛客.kotori和抽卡牛客.循环汉诺塔牛客.ruby和薯条
java·开发语言·算法
yudiandian20142 小时前
【QT 5.12.12 下载 Windows 版本】
开发语言·qt
高山有多高2 小时前
详解文件操作
c语言·开发语言·数据库·c++·算法
狂奔的sherry3 小时前
单例模式(巨通俗易懂)普通单例,懒汉单例的实现和区别,依赖注入......
开发语言·c++·单例模式
EnigmaCoder3 小时前
【C++】引用的本质与高效应用
开发语言·c++