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

相关推荐
Scott9999HH16 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社17 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海17 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖18 小时前
JDK 26 新特性详解
java·开发语言
马优晨18 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区20 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大21 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai21 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜21 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa21 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio