目录
参考前面发的几篇文章http识别车牌,sqlite3数据库、摄像头的文章
步骤 部分代码
新建一个项目,加入前面用到的http和image两个文件,和加入用到的模块和头函数和成员,加入前面用到的全局变量
配置ui界面
在构造函数中初始化数据库,表格控件,摄像头,开启摄像头
在析构函数中停止摄像头
在车辆入库和车辆出库按钮点击函数中实现拍照
在拍照完成的槽函数中实现判断标志位来决定是出库还是入库
上传http,查询数据库计算价格显示
参考前面发的几篇文章http识别车牌,sqlite3数据库、摄像头的文章
qt学习:多媒体Multimedia摄像头-CSDN博客
qt学习:QTSQL+连接sqlite数据库+增删改查-CSDN博客
qt学习:http+访问百度智能云api实现车牌识别-CSDN博客
步骤 部分代码
完整项目
qt学习:停车场管理系统+摄像头+http识别车牌+sqlite3数据库资源-CSDN文库https://download.csdn.net/download/weixin_59669309/88800578
新建一个项目,加入前面用到的http和image两个文件,和加入用到的模块和头函数和成员,加入前面用到的全局变量
头函数
#include <QFileDialog>
#include <QThread>
#include <QWidget>
#include <QDebug>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QThread>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QCamera>
#include <QCameraInfo>
#include <QImage>
#include <QBuffer>
#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QEventLoop>
#include <QTextCodec>
#include "image.h"
#include "http.h"成员
private:QString fileName ;//图片文件名QString accessToken;//access-TokenQSqlDatabase db;//数据库对象QCamera *camera;//摄像头对象QCameraImageCapture* imageCapture;//摄像头拍照类的对象enum CaptureIdentify flag;//标志位全局变量
const QString baiduTokenUrl = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%1&client_secret=%2&";const char *client_id = "";//API Key
const char *secret_id = "";//Secret Key
const QString baiduImageUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate?access_token=%1";
配置ui界面
- 一个QTableWidget表格用于显示数据库数据
- 两个QPushButton按钮
- 一个QtextBrowser显示金额
- 一个QLabel用于显示摄像头画面
在构造函数中初始化数据库,表格控件,摄像头,开启摄像头
//界面全屏this->showMaximized();//数据库的初始化//连接数据库,并且要指定你要连接哪一种数据库db = QSqlDatabase::addDatabase("QSQLITE");//指定你要操作的数据库文件名字db.setDatabaseName("xxx.db");//打开数据库文件,如果该文件不存在 则创建bool ret = db.open();if(ret == false){qDebug()<<db.lastError().text();return ;}//创建表QString sql = QString("create table if not test user(carId text,enterTime text,leaveTime text,money double);");//使用QSqlQuery类来执行操作,实例化一个sql语句执行类QSqlQuery的对象QSqlQuery query;//执行sql语句,如果执行成功,返回trueret = query.exec(sql);if(ret == false){qDebug()<<"create table error:"<<query.lastError().text();}//表格控件的初始化//设置表头列标题的文本QStringList list;list<<"车牌号"<<"入库时间"<<"出库时间"<<"消费金额";//设置表格控件的列数ui->tableWidget->setColumnCount(4);//设置颜色交替ui->tableWidget->setAlternatingRowColors(true);//设置列的宽度自适应ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置单元格嵌套到水平表头表格上for(int i=0; i<ui->tableWidget->columnCount(); i++){//实例化一个单元格类的对象QTableWidgetItem *item = new QTableWidgetItem;//向单元格写入文字item->setText(list.at(i));//设置字体QFont font = item->font();font.setBold(true);//加粗font.setPixelSize(32);item->setFont(font);//设置单元格嵌套到水平表头表格上ui->tableWidget->setHorizontalHeaderItem(i,item);}//从数据库中初始化数据updateTableUi();//摄像头的初始化initCamerea();//设置文件名fileName = "1.jpg";
在析构函数中停止摄像头
//关闭命令camera->stop();//释放内存delete camera;
在车辆入库和车辆出库按钮点击函数中实现拍照
//入库标志位,标志位会随着拍照完成的信号一起传入槽函数flag = Identify_Enter;//捕捉画面imageCapture->capture();//入库标志位,标志位会随着拍照完成的信号一起传入槽函数flag = Identify_Leave;//捕捉画面imageCapture->capture();
在拍照完成的槽函数中实现判断标志位来决定是出库还是入库
qDebug()<<"onSaveCaptureImage";//将图片保存为1.jgp图片preview.save("1.jpg");if(flag == Identify_Enter){//入库,上传http,加入数据库,更新表格,显示价格onEnterIdentify();}else if(flag == Identify_Leave){//出库,上传http,加入数据库,更新表格,显示价格onLeaveIdentify();}
上传http,查询数据库计算价格显示
//进行车牌识别//将图片上传http获取车牌号码QString carId = carIdentify();if(carId.isEmpty()){return;}//进入数据库中,进行比较,获取到该车牌的入库时间QString sql = QString("select * from user where carId='%1';").arg(carId);//执行sql语句,如果执行成功,返回trueQSqlQuery query;int ret = query.exec(sql);if(ret == false){qDebug()<<"select error:"<<query.lastError().text();}//如果找到了QString enterTime;QString leaveTime;double money;while (query.next()) {//找到了才会进来enterTime = query.value("enterTime").toString();leaveTime = query.value("leaveTime").toString();money = query.value("money").toDouble();if(leaveTime.isEmpty())break;}//跟出库时间进行相减,得出停车时间,算出停车费用QDateTime lTime = QDateTime::currentDateTime();//相差的秒数int timeLength = QDateTime::fromString(enterTime).secsTo(lTime);money = timeLength;//更新数据库 --更新数据sql = QString("update user set leaveTime='%1',money=%2 where carId='%3';").arg(lTime.toString()).arg(money).arg(carId);//执行sql语句,如果执行成功,返回trueret = query.exec(sql);if(ret == false){qDebug()<<"update error:"<<query.lastError().text();}//显示QString text = QString("车牌号为%1 出库,出库时间:%2 停车时间:%3秒 费用:%4").arg(carId).arg(lTime.toString()).arg(timeLength).arg(money);ui->textBrowser->append(text);//更新表格控件updateTableUi();//出库的时候从数据库中进行删除sql = QString("delete from user where carId='%1';").arg(carId);//执行sql语句,如果执行成功,返回trueret = query.exec(sql);if(ret == false){qDebug()<<"delete error:"<<query.lastError().text();}