前言
百度AI接口可以免费试用,本文描述如何申请使用该资源,以及在QT-Demo下使用百度AI接口,实现图像文字识别功能。
一、百度AI资源申请使用
1.浏览器访问:https://apis.baidu.com, 注册百度智能云账号
2.可以购买试用资源:
购买成功后,显示订单状态-支付完成:
3.菜单栏:产品-》图像技术-》图像识别
4.可以领取免费资源,领取免费资源后,点击创建应用:
5.点击API在线调试,可以进行在线API调试
通过以上AK 和 SK 可以获取 access_token,复制access_token的值:
点击通用文字识别(标准版)-》粘连access_token -》上传带文字的图片 -》点击调试按钮,如下图所示,返回内容显示出识别的文字:
二、Qt-Demo中调用百度AI接口,实现图像文字识别功能
1.通过python,获取access_token
通过执行GetToken.py, python方式获取access_token,注意检查python是否安装,是否安装了requests模块,是否安装pip。检查是否安装python,可以使用命令:python --version , 安装高版本的python会自动安装pip,通过pip可以下载requests模块,命令是:cmd切换到C:\Users\FF\AppData\Local\Programs\Python\Python38\Scripts\,执行:pip install requests。
更改GetToken.py文件,替换为自己申请的AK与SK的值:
如未安装python,python的安装包在该文件中:
执行GetToken.py后,获取到access_token的值:
2.在qt工程中,由于接口访问的是https,会出现openssl报错问题
qt中,用百度api请求时,出现openssl问题:qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
解决办法:
代码中加入:
qDebug()<<"QSslSocket="<<QSslSocket::sslLibraryBuildVersionString();
qDebug() << "OpenSSL support:" << QSslSocket::supportsSsl();
可以提示该QT版本下,需要安装的openssl的版本,我的是需要安装OpenSSL 1.1.1d版本,安装后,安装之后,找到安装目录下的两个文件(libcrypto-1_1-x64.dll 和libssl-1_1-x64.dll),拷贝到QT编译器目录下即可(E:\Qt-5.14\5.14.0\msvc2017_64\bin)。拷贝后,再次执行,就会显示true:
openssl的安装包openssl-1.1.1d也在下载文件夹中:
3.demo核心代码
mianwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pManager = new QNetworkAccessManager(this);
connect(m_pManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
initLPR();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initLPR()
{
m_sRequestUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic";
m_sAccessToken = "24.63fb5160d1eee513974b0f1433d21d08.2592000.1722418605.282335-89662542";
}
void MainWindow::replyFinished(QNetworkReply *reply)
{
int nStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
if(nStatus != 200)
{
qDebug() << "Status code is error:" << nStatus;
return;
}
QByteArray replyData = reply->readAll();
qDebug() << "reply data is:" << QString(replyData);
QJsonParseError json_error;
QJsonDocument doc = QJsonDocument::fromJson(replyData, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
if(doc.isObject())
{
QJsonObject obj = doc.object();
if(obj.contains("words_result"))
{
QJsonArray resultsArray = obj["words_result"].toArray();
for (const QJsonValue& val : resultsArray)
{
QJsonObject resultObj = val.toObject();
QString text = resultObj["words"].toString();
ui->label_result->setText(text);
}
}
}
}
}
void MainWindow::on_pushButton_LPR_selectPic_clicked()
{
ui->label_result->clear();
ui->label_pic->clear();
m_sImagePath = QFileDialog::getOpenFileName(this, tr("Open Image"), "./", tr("Image files(*.jpg *.png *.jpeg);All file(*.*)"));
if(m_sImagePath.isEmpty())
{
QMessageBox msgBox;
msgBox.warning(this, "Warn", "Open picture failed!");
return;
}
else
{
QImage img(m_sImagePath);
img = img.scaled(ui->label_pic->width(), ui->label_pic->height());
ui->label_pic->setPixmap(QPixmap::fromImage(img));
}
ui->lineEdit_Path->setText(m_sImagePath);
}
void MainWindow::on_pushButton_LPR_Identify_clicked()
{
//qDebug()<<"QSslSocket="<<QSslSocket::sslLibraryBuildVersionString();
//qDebug() << "OpenSSL support:" << QSslSocket::supportsSsl();
QUrl url(m_sRequestUrl + "?access_token=" + m_sAccessToken);
qDebug() << "url:" << url;
QNetworkRequest req(url);
req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
QFile file(m_sImagePath);
file.open(QIODevice::ReadOnly);
QByteArray buf = file.readAll();
//转成base64
QByteArray buf64 = buf.toBase64().toPercentEncoding();
QByteArray body = "image="+buf64;
//发送请求
m_pManager->post(req, body);
}
4.demo执行效果:
5.QT-demo下载:
链接: link