QT結(jié)合百度Ai實(shí)現(xiàn)車(chē)牌識(shí)別
1.申請(qǐng)網(wǎng)頁(yè)
2.創(chuàng)建應(yīng)用
3.獲取AK與SK
4.根據(jù)AK與SK獲取token
5.圖片轉(zhuǎn)Base64
接口文檔需要我們把需要上傳的車(chē)牌圖片轉(zhuǎn)為Base64格式
//圖片轉(zhuǎn)base64 QByteArray carNum::imageToBase64(QString fileName) { //創(chuàng)建一個(gè)QImage對(duì)象img,并使用傳入的文件名fileName來(lái)初始化它 QImage img(fileName); //創(chuàng)建一個(gè)空的QByteArray對(duì)象ba,用于存儲(chǔ)圖片的二進(jìn)制數(shù)據(jù) QByteArray ba; //用QByteArray構(gòu)造QBuffer //創(chuàng)建一個(gè)QBuffer對(duì)象buf,并將之前創(chuàng)建的QByteArray對(duì)象ba的地址傳遞給它。 //這樣,我們可以將數(shù)據(jù)寫(xiě)入這個(gè)緩沖區(qū) QBuffer buf(&ba); //打開(kāi)緩沖區(qū)buf以進(jìn)行寫(xiě)操作。這是為了準(zhǔn)備將圖片數(shù)據(jù)寫(xiě)入緩沖區(qū) buf.open(QIODevice::WriteOnly); //將圖片對(duì)象img保存到緩沖區(qū)buf中,使用JPG格式。 //這樣,圖片的二進(jìn)制數(shù)據(jù)將被寫(xiě)入到之前創(chuàng)建的QByteArray對(duì)象中 img.save(&buf,"JPG");//把img 寫(xiě)入QBuffer //將之前存儲(chǔ)的圖片二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為Base64編碼的字符串,并存儲(chǔ)在新的QByteArray對(duì)象中 QByteArray base64 = ba.toBase64();//不包含編碼頭 //創(chuàng)建一個(gè)指向UTF-8編碼的文本編解碼器的指針。 QTextCodec *codec = QTextCodec::codecForName("utf-8"); //對(duì)Base64編碼的字符串進(jìn)行URL編碼 //對(duì)圖片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è)置打開(kāi)文件過(guò)濾屏蔽不需要的文件 //QString filter = "車(chē)牌圖片類(lèi)型二(*.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="申請(qǐng)的AK"; QString secret_id="申請(qǐng)的Sk"; QString access_token="生成的token"; // 打開(kāi)文件 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ò)請(qǐng)求 QNetworkRequest request; //baidu url需要三個(gè)參數(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的對(duì)象 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("車(chē)牌號(hào)"+ carId)+"歡迎進(jìn)入"+"剩余車(chē)位"+ num); //speech->say(QString()); qDebug()<<QString("welcome"+ carId); } //圖片轉(zhuǎn)base64 QByteArray carNum::imageToBase64(QString fileName) { //創(chuàng)建一個(gè)QImage對(duì)象img,并使用傳入的文件名fileName來(lái)初始化它 QImage img(fileName); //創(chuàng)建一個(gè)空的QByteArray對(duì)象ba,用于存儲(chǔ)圖片的二進(jìn)制數(shù)據(jù) QByteArray ba; //用QByteArray構(gòu)造QBuffer //創(chuàng)建一個(gè)QBuffer對(duì)象buf,并將之前創(chuàng)建的QByteArray對(duì)象ba的地址傳遞給它。 //這樣,我們可以將數(shù)據(jù)寫(xiě)入這個(gè)緩沖區(qū) QBuffer buf(&ba); //打開(kāi)緩沖區(qū)buf以進(jìn)行寫(xiě)操作。這是為了準(zhǔn)備將圖片數(shù)據(jù)寫(xiě)入緩沖區(qū) buf.open(QIODevice::WriteOnly); //將圖片對(duì)象img保存到緩沖區(qū)buf中,使用JPG格式。 //這樣,圖片的二進(jìn)制數(shù)據(jù)將被寫(xiě)入到之前創(chuàng)建的QByteArray對(duì)象中 img.save(&buf,"JPG");//把img 寫(xiě)入QBuffer //將之前存儲(chǔ)的圖片二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為Base64編碼的字符串,并存儲(chǔ)在新的QByteArray對(duì)象中 QByteArray base64 = ba.toBase64();//不包含編碼頭 //創(chuàng)建一個(gè)指向UTF-8編碼的文本編解碼器的指針。 QTextCodec *codec = QTextCodec::codecForName("utf-8"); //對(duì)Base64編碼的字符串進(jìn)行URL編碼 //對(duì)圖片urlencode QByteArray imaData = codec->fromUnicode(base64).toPercentEncoding(); return imaData; }
7.效果展示
到此這篇關(guān)于QT結(jié)合百度Ai實(shí)現(xiàn)車(chē)牌識(shí)別的文章就介紹到這了,更多相關(guān)QT 車(chē)牌識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ Primer Plus 第四章之C++ Primer Plus復(fù)合類(lèi)型學(xué)習(xí)筆記
數(shù)組(array)是一種數(shù)據(jù)格式,能夠存儲(chǔ)多個(gè)同類(lèi)型的值。每個(gè)值都存儲(chǔ)在一個(gè)獨(dú)立的數(shù)組元素中,計(jì)算機(jī)在內(nèi)存中依次存儲(chǔ)數(shù)組的各個(gè)元素,今天給大家重點(diǎn)介紹C++ Primer Plus復(fù)合類(lèi)型的實(shí)例詳解,感興趣的朋友一起看看吧2021-07-07c++元編程模板函數(shù)重載匹配規(guī)則示例詳解
這篇文章主要為大家介紹了c++元編程模板函數(shù)重載匹配規(guī)則示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01C++報(bào)錯(cuò)`Null Pointer Dereference`的解決方法
在軟件開(kāi)發(fā)中,Null Pointer Dereference 是一種常見(jiàn)的錯(cuò)誤,它發(fā)生在程序試圖訪問(wèn)或操作一個(gè)空指針指向的內(nèi)存位置時(shí),這種情況通常會(huì)導(dǎo)致程序崩潰,給 debug 工作帶來(lái)很大困擾,今天,我們將探討如何解決 Null Pointer Dereference 報(bào)錯(cuò),需要的朋友可以參考下2024-07-07C語(yǔ)言中結(jié)構(gòu)體和共用體實(shí)例教程
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中結(jié)構(gòu)體和共用體的相關(guān)資料,結(jié)構(gòu)體是一種自定義的復(fù)合數(shù)據(jù)類(lèi)型,共用體也叫聯(lián)合體,使幾個(gè)不同類(lèi)型的變量共占一段內(nèi)存(相互覆蓋),需要的朋友可以參考下2021-06-06C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞)
不論是哪種參數(shù)傳遞方式,都有形參和實(shí)參之分,本文主要介紹了C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03C++中的可移植性和跨平臺(tái)開(kāi)發(fā)教程詳解
這篇文章主要為大家介紹了C++中的可移植性和跨平臺(tái)開(kāi)發(fā)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05純c語(yǔ)言優(yōu)雅地實(shí)現(xiàn)矩陣運(yùn)算庫(kù)的方法
本文主要介紹了純c語(yǔ)言優(yōu)雅地實(shí)現(xiàn)矩陣運(yùn)算庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08C語(yǔ)言實(shí)現(xiàn)括號(hào)配對(duì)的方法示例
本文主要介紹了C語(yǔ)言實(shí)現(xiàn)括號(hào)配對(duì)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09C語(yǔ)言實(shí)現(xiàn)超市計(jì)價(jià)收款系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)超市計(jì)價(jià)收款系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C語(yǔ)言中對(duì)字母進(jìn)行大小寫(xiě)轉(zhuǎn)換的簡(jiǎn)單方法
這篇文章主要介紹了C語(yǔ)言中對(duì)字母進(jìn)行大小寫(xiě)轉(zhuǎn)換的簡(jiǎn)單方法,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08