目录
参考前面发的几篇文章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-Token
QSqlDatabase 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语句,如果执行成功,返回true
ret = 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语句,如果执行成功,返回true
QSqlQuery 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语句,如果执行成功,返回true
ret = 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语句,如果执行成功,返回true
ret = query.exec(sql);
if(ret == false)
{
qDebug()<<"delete error:"<<query.lastError().text();
}