qt学习:停车场管理系统+摄像头+http识别车牌+sqlite3数据库

目录

参考前面发的几篇文章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界面

  1. 一个QTableWidget表格用于显示数据库数据
  2. 两个QPushButton按钮
  3. 一个QtextBrowser显示金额
  4. 一个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();
    }
相关推荐
@小博的博客1 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生2 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步3 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
love_and_hope3 小时前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen3 小时前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习
芊寻(嵌入式)3 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
hong1616884 小时前
跨模态对齐与跨领域学习
学习
阿伟来咯~4 小时前
记录学习react的一些内容
javascript·学习·react.js
Suckerbin5 小时前
Hms?: 1渗透测试
学习·安全·网络安全
水豚AI课代表5 小时前
分析报告、调研报告、工作方案等的提示词
大数据·人工智能·学习·chatgpt·aigc