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();
    }
相关推荐
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码3 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下3 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。3 天前
2026.2.25监控学习
学习
im_AMBER3 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J3 天前
从“Hello World“ 开始 C++
c语言·c++·学习