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

相关推荐
我不会编程55520 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
李少兄20 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
CoderIsArt20 小时前
QT中已知4个坐标位置求倾斜平面与倾斜角度
qt·平面
无名之逆20 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
似水এ᭄往昔20 小时前
【C语言】文件操作
c语言·开发语言
啊喜拔牙20 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
xixixin_21 小时前
为什么 js 对象中引用本地图片需要写 require 或 import
开发语言·前端·javascript
W_chuanqi21 小时前
安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft
anlogic21 小时前
Java基础 4.3
java·开发语言
A旧城以西21 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea