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

news2024/10/6 1:40:19

目录

参考前面发的几篇文章http识别车牌,sqlite3数据库、摄像头的文章

步骤    部分代码

新建一个项目,加入前面用到的http和image两个文件,和加入用到的模块和头函数和成员,加入前面用到的全局变量

配置ui界面

在构造函数中初始化数据库,表格控件,摄像头,开启摄像头

在析构函数中停止摄像头

在车辆入库和车辆出库按钮点击函数中实现拍照

在拍照完成的槽函数中实现判断标志位来决定是出库还是入库

上传http,查询数据库计算价格显示


参考前面发的几篇文章http识别车牌,sqlite3数据库、摄像头的文章

qt学习:多媒体Multimedia摄像头-CSDN博客

qt学习:QTSQL+连接sqlite数据库+增删改查-CSDN博客

qt学习:http+访问百度智能云api实现车牌识别-CSDN博客

步骤    部分代码

完整项目

qt学习:停车场管理系统+摄像头+http识别车牌+sqlite3数据库资源-CSDN文库icon-default.png?t=N7T8https://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();
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1426761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql指南之null值用法

注明&#xff1a;参考文章&#xff1a; SQL避坑指南之NULL值知多少&#xff1f;_select null as-CSDN博客文章浏览阅读2.9k次&#xff0c;点赞7次&#xff0c;收藏21次。0 引言 SQL NULL&#xff08;UNKNOW&#xff09;是用来代表缺失值的术语&#xff0c;在表中的NULL值是显示…

微服务入门篇:Ribbon负载均衡(原理,均衡策略,饥饿加载)

目录 1.负载均衡原理2.负载均衡策略3.饥饿加载 1.负载均衡原理 在使用 LoadBalanced 注解后&#xff0c;Spring Cloud Ribbon 将会为 RestTemplate 添加负载均衡的能力。 负载均衡的流程如下&#xff1a; 当使用 RestTemplate 发送请求时&#xff0c;会先判断请求的 URL 是否包…

03、全文检索 -- Solr -- Solr 身份验证配置(给 Solr 启动身份验证、添加用户、删除用户)

目录 全文检索 -- Solr -- Solr 身份验证配置启用身份验证&#xff1a;添加用户&#xff1a;删除用户&#xff1a; 全文检索 – Solr – Solr 身份验证配置 学习之前需要先启动 Solr 执行如下命令即可启动Solr&#xff1a; solr start -p <端口>如果不指定端口&#xf…

保姆级的指针详解(超详细)

目录 一.内存和地址  1.初识指针 2.如何理解编址 二. 指针变量 三.指针的解引用操作符 1.指针变量的大小 四.指针变量类型的意义 五.指针的运算 1.指针加减整数 2.指针减指针 3.野指针 3.1指针未初始化 3.2指针越界访问 3.3指针指向的空间被提前释放 3.4如何规…

05:容器镜像技术揭秘|发布容器服务器|私有镜像仓库

容器镜像技术揭秘&#xff5c;发布容器服务器&#xff5c;私有镜像仓库 创建镜像使用commit方法创建自定义镜像。Dockerfile打包镜像创建apache服务镜像制作 php 镜像 微服务架构创建nginx镜像 发布服务通过映射端口发布服务容器共享卷 docker私有仓库 创建镜像 使用commit方法…

Mac用Crossover玩《幻兽帕鲁》手柄不能用怎么办? Mac电脑玩《幻兽帕鲁》怎么连接手柄? 幻兽帕鲁玩家超1900万

2024年首款爆火Steam平台的游戏《幻兽帕鲁》&#xff0c;在使用Crossover后可以用Mac系统玩了&#xff0c;很多玩家喜欢通过手柄玩游戏&#xff0c;它拥有很好的握持体验&#xff0c;长时间玩也不会很累&#xff0c;所以很多《幻兽帕鲁》玩家都喜欢用手柄来操作&#xff0c;很多…

idea 中 tomcat 乱码问题修复

之前是修改 Tomcat 目录下 conf/logging.properties 的配置&#xff0c;将 UTF-8 修改为 GBK&#xff0c;现在发现不用这样修改了。只需要修改 IDEA 中 Tomcat 的配置就可以了。 修改IDEA中Tomcat的配置&#xff1a;添加-Dfile.encodingUTF-8 本文结束

大路灯有必要买吗?五款年度好用大路灯推荐

随着人们生活水平上升&#xff0c;对健康的关注度也不断提高&#xff0c;护眼灯的需求也越来越多。而护眼落地灯作为一种新型的照明产品&#xff0c;具有独特的优点。护眼落地灯采用柔和的自然光源&#xff0c;能有效减少眼睛疲劳和视力损伤&#xff0c;提高工作和学习的效率。…

消息中间件特性

一&#xff1a;消息队列的主要作用是什么&#xff1f; 1.消息队列的特性&#xff1a; 业务无关&#xff0c;一个具有普适性质的消息队列组件不需要考虑上层的业务模型&#xff0c;只做好消息的分发就可以了&#xff0c;上层业务的不同模块反而需要依赖消息队列所定义的规范进行…

亚信安全助力宁夏首个人工智能数据中心建成 铺设绿色算力安全底座

近日&#xff0c;由宁夏西云算力科技有限公司倾力打造&#xff0c;亚信安全科技股份有限公司&#xff08;股票代码&#xff1a;688225&#xff09;全力支撑&#xff0c;总投资达数十亿元人民币的宁夏智算中心项目&#xff0c;其一期工程——宁夏首个采用全自然风冷技术的30KW机…

软考高项十大管理49个过程记忆口诀

一、十大管理口诀 口诀&#xff1a;范进整狗子&#xff0c;成人风采干 内容&#xff1a;范围管理、进度管理、整合管理、沟通管理、质量管理、成本管理、资源管理、风险管理、采购管理、干系人管理 二、49个过程口诀 1、整合管理 口诀&#xff1a;按章程计划指导知识、监控…

Java打印图形 九九乘法表

目录 双重循环九九乘法表打印长方形打印平行四边形打印三角形打印菱形打印空心菱形 三重循坏百钱买百鸡 双重循环 九九乘法表 在Java中&#xff0c;你可以使用嵌套的for循环来打印九九乘法表。以下是一个简单的示例&#xff1a; public class Main {public static void main…

wordpress找不回密码怎么办?4种方法设置新密码

有些WordPress站长太久不登录后台了&#xff0c;所以就忘记了管理员登录密码&#xff0c;这种情况我们应该怎么找回密码呢&#xff1f;或者设置一个新密码呢&#xff1f;下面boke112百科就跟大家分享4种方法设置WordPress新密码。 方法一、登录页面的“忘记密码&#xff1f;”…

React + react-device-detect 实现设备特定的渲染

当构建响应式网页应用时&#xff0c;了解用户正在使用的设备类型&#xff08;如手机、平板或桌面&#xff09;可以帮助我们提供更优化的用户体验。本文将介绍如何在 React 项目中使用 react-device-detect 库来检测设备类型&#xff0c;并根据不同的设备显示不同的组件或样式。…

用Python处理TDC激光测距数据并绘制为图片

用Python处理TDC激光测距数据并绘制为图片 说明一、定义全局变量变二、主函数入口三、处理原始文件数据四、将数据叠加统计生成图片五、额外的辅助函数六、将数据进行各种形式统计叠加七、原始数据形式八、 测试结果 说明 1. 主要是将TDC激光测距数据进行统计叠加并绘制为图片…

网络原理-TCP/IP(3) - 三次握手超详解析

TCP协议 连接管理 TCP的连接是虚拟的,抽象的,目的是让通信双方保存对方信息.在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接. 之前我们在网络编程中的 socket new Socket(ip, port); 这个操作就是建立连接.而这个操作知识调用了socket的api,真正建立的过程,是在…

FW如何区别 PAW3212DB-TJDT 和 PAW3220DB-TJDL/TJDR/TJDS

PAW3212DB-TJDT 和 PAW3220DB-TJDL/TJDR/TJDS 的引脚功能定义是一样的&#xff0c;只是封装有一点不一样。PAW3212DB-TJDT是圆形火山口&#xff0c;配的是圆孔透镜&#xff0c;PAW3220DB-TJDL/TJDR/TJDS是方形火山口&#xff0c;配的是方孔透镜。 PAW3212DB-TJDT 和 PAW3220DB-…

杂题——试题-算法训练-P0602

分析&#xff1a; 把要重排序的数字转成数组对数组进行排序&#xff0c;从小到大排序数组转成字符串&#xff0c;字符串转成数字&#xff0c;得到最小数再把最小数的字符串反转&#xff0c;得到最大数注意&#xff1a; 在java语言中&#xff0c;如果使用Arrays.toString(digits…

C++之平衡二叉搜索树查找

个人主页&#xff1a;[PingdiGuo_guo] 收录专栏&#xff1a;[C干货专栏] 大家好&#xff0c;我是PingdiGuo&#xff0c;今天我们来学习平衡二叉搜索树查找。 目录 1.什么是二叉树 2.什么是二叉搜索树 3.什么是平衡二叉搜索树查找 4.如何使用平衡二叉搜索树查找 5.平衡二叉…

C#,阿格里数(Ugly Number)的多种算法与源代码

1 丑数&#xff0c;阿格里数 阿格里数&#xff0c;即丑数&#xff08;Ugly Number&#xff09;、逊数&#xff08;Humble Number&#xff09;。 一般而言&#xff1a;把只包含质因子2&#xff0c;3和5的数称作丑数&#xff08;Ugly Number&#xff09;。例如6、8都是丑数&…