QT結(jié)合百度Ai實現(xiàn)車牌識別
1.申請網(wǎng)頁

2.創(chuàng)建應(yīng)用


3.獲取AK與SK


4.根據(jù)AK與SK獲取token

5.圖片轉(zhuǎn)Base64
接口文檔需要我們把需要上傳的車牌圖片轉(zhuǎn)為Base64格式
//圖片轉(zhuǎn)base64
QByteArray carNum::imageToBase64(QString fileName)
{
//創(chuàng)建一個QImage對象img,并使用傳入的文件名fileName來初始化它
QImage img(fileName);
//創(chuàng)建一個空的QByteArray對象ba,用于存儲圖片的二進制數(shù)據(jù)
QByteArray ba;
//用QByteArray構(gòu)造QBuffer
//創(chuàng)建一個QBuffer對象buf,并將之前創(chuàng)建的QByteArray對象ba的地址傳遞給它。
//這樣,我們可以將數(shù)據(jù)寫入這個緩沖區(qū)
QBuffer buf(&ba);
//打開緩沖區(qū)buf以進行寫操作。這是為了準備將圖片數(shù)據(jù)寫入緩沖區(qū)
buf.open(QIODevice::WriteOnly);
//將圖片對象img保存到緩沖區(qū)buf中,使用JPG格式。
//這樣,圖片的二進制數(shù)據(jù)將被寫入到之前創(chuàng)建的QByteArray對象中
img.save(&buf,"JPG");//把img 寫入QBuffer
//將之前存儲的圖片二進制數(shù)據(jù)轉(zhuǎn)換為Base64編碼的字符串,并存儲在新的QByteArray對象中
QByteArray base64 = ba.toBase64();//不包含編碼頭
//創(chuàng)建一個指向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");
//設(shè)置打開文件過濾屏蔽不需要的文件
//QString filter = "車牌圖片類型二(*.png;;*.jpg)";
//獲取文件路徑
QString fileName=dialog.getOpenFileName(this,NULL, QString(),NULL);
if (!fileName.isEmpty()) {
//設(shè)置label自適應(yīng)
ui->label->setScaledContents(true);
//設(shè)置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)) {
// 讀取文件內(nèi)容
//QTextStream in(&file);
//QString picData=in.readAll();
//qDebug()<<content;
//創(chuàng)建網(wǎng)絡(luò)請求
QNetworkRequest request;
//baidu url需要三個參數(shù) 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;
//設(shè)置url
request.setUrl(url);
//設(shè)置頭
request.setHeader(QNetworkRequest::ContentTypeHeader,QString("application/x-www-form-urlencoded"
"Accept: application/json"
));
manager->post(request,imgData);
// 在文本編輯框中顯示文件內(nèi)容
}
}
}
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);
}
//圖片轉(zhuǎn)base64
QByteArray carNum::imageToBase64(QString fileName)
{
//創(chuàng)建一個QImage對象img,并使用傳入的文件名fileName來初始化它
QImage img(fileName);
//創(chuàng)建一個空的QByteArray對象ba,用于存儲圖片的二進制數(shù)據(jù)
QByteArray ba;
//用QByteArray構(gòu)造QBuffer
//創(chuàng)建一個QBuffer對象buf,并將之前創(chuàng)建的QByteArray對象ba的地址傳遞給它。
//這樣,我們可以將數(shù)據(jù)寫入這個緩沖區(qū)
QBuffer buf(&ba);
//打開緩沖區(qū)buf以進行寫操作。這是為了準備將圖片數(shù)據(jù)寫入緩沖區(qū)
buf.open(QIODevice::WriteOnly);
//將圖片對象img保存到緩沖區(qū)buf中,使用JPG格式。
//這樣,圖片的二進制數(shù)據(jù)將被寫入到之前創(chuàng)建的QByteArray對象中
img.save(&buf,"JPG");//把img 寫入QBuffer
//將之前存儲的圖片二進制數(shù)據(jù)轉(zhuǎn)換為Base64編碼的字符串,并存儲在新的QByteArray對象中
QByteArray base64 = ba.toBase64();//不包含編碼頭
//創(chuàng)建一個指向UTF-8編碼的文本編解碼器的指針。
QTextCodec *codec = QTextCodec::codecForName("utf-8");
//對Base64編碼的字符串進行URL編碼
//對圖片urlencode
QByteArray imaData = codec->fromUnicode(base64).toPercentEncoding();
return imaData;
}
7.效果展示

到此這篇關(guān)于QT結(jié)合百度Ai實現(xiàn)車牌識別的文章就介紹到這了,更多相關(guān)QT 車牌識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入C語言內(nèi)存區(qū)域分配(進程的各個段)詳解
一般情況下,一個可執(zhí)行二進制程序(更確切的說,在Linux操作系統(tǒng)下為一個進程單元,在UC/OSII中被稱為任務(wù))在存儲(沒有調(diào)入到內(nèi)存運行)時擁有3個部分,分別是代碼段(text)、數(shù)據(jù)段(data)和BSS段。這3個部分一起組成了該可執(zhí)行程序的文件2013-07-07
C語言數(shù)據(jù)結(jié)構(gòu)深入探索順序表
大家好,今天給大家?guī)淼氖琼樞虮?,我覺得順序表還是有比較難理解的地方的,于是我就把這一塊的內(nèi)容全部整理到了一起,希望能夠給剛剛進行學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人帶來一些幫助,或者是已經(jīng)學(xué)過這塊的朋友們帶來更深的理解,我們現(xiàn)在就開始吧2022-05-05
C語言實現(xiàn)學(xué)生信息管理系統(tǒng)(多文件)
這篇文章主要為大家詳細介紹了C語言實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-12-12
C++中::SHCreateDirectoryEx函數(shù)使用方法
::SHCreateDirectoryEx用于創(chuàng)建多級目錄,類似于mkdir -p命令,本文主要介紹了C++中::SHCreateDirectoryEx函數(shù)使用方法,具有一定的參考價值,感興趣的可以了解一下2025-03-03
C++?基礎(chǔ)函數(shù)的介紹及使用(Vector+deque+STL)
這篇文章主要介紹了C++?基礎(chǔ)函數(shù)的介紹及使用(Vector+deque+STL),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06
C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細介紹了C語言實現(xiàn)學(xué)生宿舍信息管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03

