QT+百度Ai车牌识别

QT+百度Ai车牌识别

1.申请网页

https://cloud.baidu.com/product/ocr_cars/plate

在这里插入图片描述

2.创建应用

在这里插入图片描述在这里插入图片描述

3.获取AK与SK

在这里插入图片描述
在这里插入图片描述

4.根据AK与SK获取token

在这里插入图片描述

5.图片转Base64

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

//图片转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.示例代码

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

在这里插入图片描述

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值