Qt调用百度AI接口--车牌识别

本文介绍如何使用Qt调用百度智能云的车牌识别服务,包括注册账号、创建应用、获取access_token等步骤,并提供了一个具体的Qt实现示例。

一、前言

当下的人工智能势头很盛,虽然咱不是搞算法开发的,但是也不妨碍咱用他们的成果做应用,出于好奇,探索了一下如果使用Qt连接百度AI接口,下面是整个详细历程。


二、运行结果

在这里插入图片描述

三、详细过程

1、注册百度智能云

网站链接:https://cloud.baidu.com/?from=console
在这里插入图片描述


2、购买服务

百度API商城:https://apis.baidu.com/
在这里插入图片描述
找一个白嫖资源
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


3、创建应用

在首页中,依此选择:产品–>人工智能–>图像识别
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选上车牌识别接口
在这里插入图片描述
创建完成之后点击管理应用即可看到自己创建的应用
在这里插入图片描述
最终对我们有用的就是:API Key和Secret Key,这两个是用来申请access_token的,access_token就是我们在编码过程中访问的地址。


4、申请access_token

点击技术文档
在这里插入图片描述
我选择的是调用方式一
在这里插入图片描述
在这里插入图片描述
可以看到文档中提供了多种方式获取access_token,例如:bash、PHP、Java、Python、C++、C#、Node等

在此我选择使用Python:
在这里插入图片描述
然后access_token就获取成功了。


5、Qt调用

准备工作

  • 打开OpenSSL下载网站,下载Qt对应版本的OpenSSL安装程序并安装:
    在这里插入图片描述
  • 在Qt工程文件中(.pro)添加:
//注:与安装路径无关,之间复制粘贴即可
INCLUDEPATH += C:/OpenSSL-Win32/include

创建工程

识别流程:本地选中一张图片–>转为base64格式–>post()–>收到结果

QT       += core gui network texttospeech
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QNetworkAccessManager>
#include<QtTextToSpeech/QTextToSpeech>

class Widget : public QWidget
{
    Q_OBJECT

public slots:
    void read_ack(QNetworkReply*);
    void load_pix();
    void decode_pix();

public:
    Widget(QWidget *parent = 0);
    ~Widget();

    QLabel *lb_pix;
    QLabel *lb;
    QLineEdit *le_path;
    QLineEdit *le_code;
    QPushButton *btn_load;
    QPushButton *btn_decode;
    QNetworkAccessManager *httpmanager;
    QTextToSpeech *speeker;
};

#endif // WIDGET_H
#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFileDialog>
#include <QNetworkRequest>
#include <QFile>
#include <QNetworkReply>
#include <QUrl>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QMovie>
#include <QtTextToSpeech/QTextToSpeech>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //1. 构造所有需要的控件
    lb_pix = new QLabel;
    lb_pix->setFixedSize(470,530);
    lb_pix->setScaledContents(true);
    btn_load = new QPushButton("载入车牌");
    btn_load->setFixedSize(100, 48);
    btn_decode = new QPushButton("识别");
    btn_decode->setFixedSize(100, 48);
    le_path = new QLineEdit;
    le_path->setPlaceholderText("车牌图片路径");
    le_code = new QLineEdit;
    le_code->setPlaceholderText("识别结果");
    le_code->setMinimumHeight(50);
    le_code->setStyleSheet("QLineEdit{font: 30px;};");
     speeker = new QTextToSpeech;

    httpmanager = new QNetworkAccessManager;
    connect(httpmanager, SIGNAL(finished(QNetworkReply*)), this, SLOT(read_ack(QNetworkReply*)));

    //2. 排版
    QHBoxLayout *hbox = new QHBoxLayout;
    hbox->addWidget(btn_load);
    //hbox->addStretch();
    hbox->addWidget(btn_decode);
    QVBoxLayout *mainbox = new QVBoxLayout;
    //mainbox->addWidget(lb);
    mainbox->addWidget(lb_pix);
    mainbox->addWidget(le_path);
    mainbox->addWidget(le_code);
    mainbox->addLayout(hbox);
    setLayout(mainbox);

    //3. 前后台挂接
    connect(btn_load, SIGNAL(clicked(bool)), this, SLOT(load_pix()));
    connect(btn_decode, SIGNAL(clicked(bool)), this, SLOT(decode_pix()));

    //4. 美化
    le_path->setStyleSheet("color:#747d8c;font-weight:500;font-size:20px;border-radius: 3px;");
    le_code->setStyleSheet("color:#747d8c;font-weight:700;font-size:35px;border-radius: 3px;");
    btn_load->setStyleSheet("QPushButton{"
                             "background-color:#f1f2f6;"
                             "border-radius: 10px;"
                             "font: 25px;}"
                             "QPushButton:hover{"
                             "background-color:#38ada9;"
                             "border-radius: 10px;"
                             "font: 30px;}"
                             );
    btn_decode->setStyleSheet("QPushButton{"
                             "background-color:#f1f2f6;"
                             "border-radius: 10px;"
                             "font: 25px;}"
                             "QPushButton:hover{"
                             "background-color:#38ada9;"
                             "border-radius: 10px;"
                             "font: 30px;}"
                             );
}
Widget::~Widget()
{

}

//将二维码路径和图片显示出来
void Widget::load_pix()
{
    QString filename =  QFileDialog::getOpenFileName(this, "打开车牌照片", ".", "Images (*.png *.bmp *.jpg)");
    le_path->setText(filename);
    lb_pix->setPixmap(QPixmap(filename));
}

void Widget::decode_pix()
{
    //向百度发送一个二维码识别请求(HTTP)
    QNetworkRequest myrequset;// = new QNetworkRequest;
    //填充请求url
    myrequset.setUrl(QUrl("https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate?"
                      "access_token=24.7d894444f8eb3d4d9d413409aafd2048.2592000.1627629226.282335-24468114"));
    //填充header
    myrequset.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

    //填充请求的body
    //1.挖出照片内容
    QFile file(le_path->text());
    file.open(QIODevice::ReadOnly);
    QByteArray buf = file.readAll();

    //2.转成base64及urlcode
    QByteArray buf64 = buf.toBase64().toPercentEncoding();
    QByteArray body = "image="+buf64;
    //发送完整的一次识别请求
    httpmanager->post(myrequset, body);
}

//结果解析
void Widget::read_ack(QNetworkReply* r)
{
    //提取json格式的返回
    QByteArray buf = r->readAll();
    qDebug() << buf;

    //提取json中的感兴趣的内容
    QJsonDocument myjson = QJsonDocument::fromJson(buf);
    QJsonObject node = myjson.object();
    QJsonObject arr = node.value("words_result").toObject();
    QString text = arr.value("number").toString();
    le_code->setText(text);
    //speeker->say("欢迎光临"+text);
}

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.setStyleSheet("Widget{background-color: #82ccdd};");
    w.setWindowTitle("车牌识别");
    w.setMinimumSize(500, 600); //设置窗口大小
    QIcon icon("src/1.png");
    w.setWindowIcon(icon);
    w.show();

    return a.exec();
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值