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文库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-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界面

  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语句,如果执行成功,返回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();}

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

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

相关文章

Qt5 基于OpenGL实现六轴机械臂三维仿真

需求 在Qt中通过OPenGL方式加载三维模型STL文件&#xff0c;然后将多个结构的STL文件类型的模型进行组装&#xff0c;形成6轴机械臂三维模型的显示&#xff0c;并且可以对每个关节进行关节角度的控制。 新建一个C类STLFileLoader&#xff0c;用于加载STL文件&#xff0c;并进…

IP协议(2) 和 数据链路层协议基础

IP协议续 1.路由选择 在复杂的网络结构中,我们需要找到一个通往终点的路线,这就是路由选择 举个例子:我们在没有手机导航之前,想去一个地方得是到一个地方问一下路的方式最终找到目的地 路由的过程,其实就是样子问路的过程 1.当IP数据包到达路由器的时候,会查看目的IP 2.路由器…

Jmeter高级使用

文章目录 JMeter之计数器JMeter之集合点JMeter之断言JMeter之动态关联后置处理器&#xff1a;正则表达式提取器 JMeter之分布式测试JMeter之组件执行顺序元件的作用域元件的执行顺序配置元件Http Cookie管理器 多协议接口的性能测试Debug采样器Http请求中文乱码的解决Post参数设…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起…

Java_简单模拟实现ArrayList_学习ArrayList

文章目录 一、 了解线性表和顺序表区别1.线性表2.顺序表 二、模拟实现1.定义接口2.定义MyArrayList3.成员变量以及构造方法4.实现打印数组5.实现add方法6.实现查找某个数是否存在contains或者某个数的下标indexOf7.获取或更改pos位置的值 get和set8.获取数组大小 size9.删除某个…

Git版本管理工具(实战进阶):零基础到起飞实战项目完整篇 →Git学习一篇就够 从基本指令、到本地仓库、远程仓库、实战项目开发演练介绍超详细!

heima 李师傅最新版 Git的讲解 文章目录 Git在实战项目开发使用功能学习01.Git 初识02.Git 仓库03.Git 的三个区域04.Git 文件状态05.Git 暂存区作用06.练习-登录页面07.Git-切换版本08.删除文件09.忽略文件10.分支的概念11.练习-登录 bug 修复12.分支-合并与删除13.分支-合并与…

循环神经网络RNN专题(01/6)

一、说明 RNN用于处理序列数据。在传统的神经网络模型中&#xff0c;是从输入层到隐含层再到输出层&#xff0c;层与层之间是全连接的&#xff0c;每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如&#xff0c;你要预测句子的下一个单词是什么&a…

【演讲比赛流程管理系统(C++版)】

一、演讲比赛程序需求 1.1、比赛规则 学校举行一场演讲比赛&#xff0c;共有12个人参加。比赛共两轮&#xff0c;第一轮为淘汰赛&#xff0c;第二轮为决赛 每名选手都有对应的编号&#xff0c;如10001~10012 比赛方式:分组比赛&#xff0c;每组6个人 第一轮分为两个小组&a…

【深度测试】如何分析脚本以及对脚本进行测试

线上会存在一种任务&#xff0c;定时或者手动出发&#xff0c;我们称之为“脚本”&#xff0c;也可以称之为“job” 一、脚本的特性 无过程&#xff1a;只有开始和结束&#xff0c;过程迅速且黑盒。无交互&#xff1a;脚本处理的业务场景都几乎没有交互&#xff0c;只有数据被…

算法篇之二分

二分算法简介 特点 最简单的一种算法&#xff0c;也是最恶心&#xff0c;细节最多&#xff0c;最容易写出死循环的算法时间复杂度O(logN) 如何学习 明白其中的算法原理&#xff0c;二分并不是只有数组有序的的时候使用&#xff0c;而是看是否具有二段性。模板 朴素的二分模…

TCP TIME_WAIT 过多怎么处理

文章目录 1.什么是 TCP TIME_WAIT&#xff1f;2.为什么要 TIME_WAIT?3.TIME_WAIT 过多的影响4.解决办法4.1 调整短连接为长连接4.2 调整系统内核参数 5.小结参考文献 1.什么是 TCP TIME_WAIT&#xff1f; TCP 断开连接四次挥手过程中&#xff0c;主动断开连接的一方&#xff…

BeanFactory创建过程(基于Servlet)

BeanFactory创建过程&#xff08;基于Servlet&#xff09; 1. 概述1.2 那么问题就来了1.2.1 谁负责AnnotationConfigServletWebServerApplicationContext实例呢&#xff1f;1.2.2 ApplicationContextFactory初始化过程又是怎么样的&#xff1f; 1.3 总结 2. 最后 1. 概述 Anno…

什么可以用手机蓝牙控制LED???#串口通信【下】

什么可以用手机蓝牙控制LED&#xff1f;&#xff1f;&#xff1f;#串口通信【下】 前言预备知识1.小白玩串口控制的ASSII避坑1.1问题引入1.2解决问题 2.串口支持单词型指令控制2.1实现串口支持单词型指令控制的核心思路2.2利用字符数组来承接单词型指令2.3利用strstr函数来查找…

【Time Series】LSTM代码实战

一、简介 还是那句话&#xff0c;"时间序列金融"是一个很有"钱"景的话题&#xff0c;还是想尝试采用Stock时间序列预测任务DeepLearning。本文提供了LSTM预测股票的源代码。 二、算法原理 长短期记忆网络&#xff08;LSTM&#xff09;是一种特殊的循环神经…

如何衡量代码的复杂度

圈复杂度概要 最近的培训中了解到了一个概念&#xff0c;叫做圈复杂度。 圈复杂度&#xff08;Cyclomatic Complexity&#xff09;是一种衡量程序复杂度的度量方法。它由美国计算机科学家 Thomas J. McCabe 在 1976 年提出。圈复杂度通过统计程序的控制流图中的决策结构&…

linux有关安全的几个基本配置,禁止root登录,新建root权限账号

一、不安装多余的软件&#xff0c;能最小化安装就不要安装图形化界面&#xff0c;然后根据需求安装需要的软件。 二、防火墙要启用&#xff0c;如果您的这台服务器对外有服务只要放开服务就好了&#xff0c;就是说白了白名单&#xff0c;切忌一上来第一件事儿就是关闭防火墙&a…

Mobileye CES 2024 自动驾驶新技术新方向

Mobileye亮相2024年国际消费类电子产品展览会推出什么自动驾驶新技术? Mobileye再次亮相CES&#xff0c;展示了我们的最新技术&#xff0c;并推出了Mobileye DXP--我们全新的驾驶体验平台。 与往年一样&#xff0c;Mobileye是拉斯维加斯展会现场的一大亮点&#xff0c;让参观…

一文读懂Prodigal教程

2.prodigal教程 2.1 介绍 Prodigal 由橡树岭国家实验室和田纳西大学诺克斯维尔分校于2007年在能源部联合基因组研究所的主持下联合开发&#xff0c;是一种用于细菌和古细菌基因组的蛋白质编码基因预测软件工具&#xff0c;Prodigal 已成为世界上最受欢迎的微生物基因预测算法…

day28 节点操作——克隆节点、删除节点

目录 克隆节点删除节点 克隆节点 特殊情况下新增节点按以下操作&#xff1a; 复制一个原有的节点把复制的节点放入到指定的元素内部 克隆节点 元素.cloneNode(布尔值) cloneNode会克隆出一个跟原标签一样的元素&#xff0c;括号内传入布尔值 若为true&#xff0c;则代表克隆时…

Vue3批量异步更新是如何实现

文章目录 一、什么是调度执行二、如何实现可调度&#xff1f;三、批量更新 & 异步更新四、Vue原理五、最后 一、什么是调度执行 多次修改数据(例如自身num10次)&#xff0c;只进行一次页面渲染&#xff08;页面只会渲染最后一次num10&#xff09; 指的是响应式数据发生变化…