精华内容
下载资源
问答
  • 停车场收费管理系统

    2019-01-22 15:09:32
    停车场收费管理系统便于停车场对车辆进行管理,本系统主要包括会员注册,车辆出入库管理,会员查询等,采用序列化方式无需数据库。 注意事项: 1.开发环境为Visual Studio 2012,无数据库,使用.net 3.5开发
  • 这是我小学期做的停车场管理系统,还有很多不足之处。放上来供大家参考,顺便想赚一点积分。演示视频上传到了b站,大家可以去b站看演示视频,谢谢大家。https://www.bilibili.com/video/BV1ui4y137Ep
  • 此项目为本人本科毕业设计项目,非常简单的一个停车收费系统,我的重点放在了Qt开发上位机软件上,简单记录一下。 利用ARM Cortex-A9芯片作为车道控制设备中央处理器,基于Linux系统开发下位机程序,搭建服务器,...

            此项目为本人本科毕业设计项目,非常简单的一个停车收费系统,我的重点放在了Qt开发上位机软件上,简单记录一下。        

            利用ARM Cortex-A9芯片作为车道控制设备中央处理器,基于Linux系统开发下位机程序,搭建服务器,驱动摄像头,采集传输车牌视频信息。利用Qt开发平台自主开发一款配套下位机系统的上位机管理软件,实现视频接收、车牌识别、计费管理、记录查询等相关操作。

    一、系统需求模型

    二、系统总体设计

    三、硬件设计

    四、软件设计

    五、软件实现

    1、登录模块

            本系统的用户名和密码由系统进行分配注册,输入已注册的用户名和对于的密码,点击“登录”按钮,后台会在管理员数据库表中查找相应用户名,对比其密码,密码一致即可成功登录,进入操作界面,密码及用户名错误或不存在则提示登录失败,界面阻塞不可进入。

    2、数据管理及服务器连接界面

            在登录系统成功后,为完成接收下位机监控视频的功能,我们需要连接下位机TCP服务器,网络管理在数据管理界面的右下部分。下位机服务器正常运行后,输入下位机对应的服务器的IP和端口号,点击“网络连接”按钮,没有问题即可连接成功。若服务器未运行,点击按钮则不会有反应,若服务器运行异常,则登录失败。

            在“数据管理”模块可以对车辆用户进行增删改查的基本数据库管理操作。车辆用户用来记录车辆用户的个人信息及账户余额,每一个第一次入库的车辆必须先在此登记信息,进行账户充值,方可入库停车。所有的入库用户信息在此列表显示。

    3、监控计费主界面

            在服务器成功连接之后,回到“监控计费”界面,我们可以看到入口和出口的监控视频显示区域显示“监控未打开”字样,我们点击“打开监控”即可接收相应监控的视频画面。

    4、记录查询

            在“记录查询”页面可以查看车辆出入库的记录,通过数据库记录了所有出入库车辆的车牌号、出入库状态、出入库时间及停车时长,分页逐条显示。可以点击相应按钮跳转页面,也可删除选择项及清空数据库。

            为了方便记录备份及查看,我们可以点击“导出记录”按钮将当前页面数据以Excel文件的方式导出,点击保存即可。

    5、使用帮助

            随便写一些装逼。

    6、用户管理

            切换用户、查看个人信息及关闭系统等操作。

    7、车牌识别

            车牌识别功能主要调用百度智能云的API,登录百度智能云官网,我们可以看到如图4.2.8所示的相关百度智能云服务。在本设计中我们可以选择图像识别,创建应用,从而获取相应的API密匙。

            在上位机客户端软件编写中,我们就需要用到从百度智能云获取的车牌识别API密匙,Qt中调用百度API进行车牌识别的代码如下,封装了一个百度车牌识别的类进行实现,通过公有函数getCharNumber()返回识别的车牌号,在其他文件中需要的地方进行调用获取。

    baiduAPI::baiduAPI(QWidget *parent) :
        QWidget(parent)
    {
        AK="8IK1ddUmBy*************";//百度智能云获取的密匙
        SK="ubEfVro4XX*************";
        requestUrl="https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate";
        renewal_token(); //更新token值
        manager = new QNetworkAccessManager();
        connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
    }
    void baiduAPI::networkPost()
    {
        //设置url
        QUrl url(requestUrl+"?access_token="+accessToken);
        QNetworkRequest request(url);
        //设置http header
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/x-www-form-urlencoded"));
        //设置http body
        QString name = "./car1.jpg";
        QImage image(name);
        QByteArray ba;
        QBuffer buffer(&ba);
        buffer.open(QIODevice::WriteOnly);
        image.save(&buffer, "jpg");
        QByteArray header = "image=";
        QByteArray postData = header+ba.toBase64().toPercentEncoding();
        //post方式发送
        manager->post(request,postData);
    }
    QString baiduAPI::getCarNumber()
    {
        return  carnumber;
    }
    

    六、使用测试

    1、启动服务器

            在Linux系统中运行服务器代码,如如5.1.1所示,摄像头初始成功,服务器初始化成功,等待客户端连接。

    2、客户端连接

    3、入库测试

            在上位机软件中打开入口的摄像头,接收视频画面,视频显示正常点击车牌识别按钮车牌识别正常,入库时间及车位数量等都计算无误。

    4、出库测试

            在上位机软件中打开出口的摄像头,接收视频画面,视频显示正常点击车牌识别按钮车牌识别正常,出库时间、收费计算及车位数量等都计算无误,闸门打开正常。

    5、记录查询

            在经过入库及出库测试后,在上位机的记录查询界面可以看到刚才的出入库记录,车牌号及出入库时间等相关信息均无误。

    七、环境配置

            下位机选择了FS4412开发板,FS4412的主频可以达到1.4~1.6GHz,处理器采用Exynos4412, 该处理器是三星比较新的一款ARM Cortex-A9四核CPU,采用广受欢迎的ARM MPCore技术兼容[10]。ARM的成本低,效率高,最主要的是它能够运行Linux操作系统,方便对ARM的开发,能够编写TCP服务器程序完成网络通信。

            下位机程序开发环境为VMware Workstation Pro,虚拟机为Ubuntu12.04,采用vim 编辑器及gcc4.6.4调试器。另外ARM需移植Linux操作系统,Linux系统内核为Linux3.14。

            上位机软件开发采用Qt开发,它是跨平台的C++图形用户界面应用程序开发框架,其可以跨平台开发使用就是选择它的主要原因。版本:Qt 5.9.1,Qt Creator4.3.1,构建套件(Kit)为Qt5.9.1 MinGW_32,编译器支持C/C++编译,常用gdb调试器。如下图Qt中的编译器配置界面,采用MinGW 5.3.0 32位编译器。

    八、最后

            关于上位机,如果没有ARM开发板,当然直接运用电脑自带摄像头,在linux下运行服务器代码也可完全达到运行效果,用ARM是在实用上,作为毕业设计装逼就行了。

            服务器实现流程如下,非常简单

            对于AMR开发板,只需移植linux操作系统,运行服务器代码即可,摄像头驱动都已经写好了的。

    需要上位机软件运行及服务器客户端源代码参考的可点击链接下载:

    https://download.csdn.net/download/qq_41632571/19860567?spm=1001.2014.3001.5503

    https://download.csdn.net/download/qq_41632571/19860620?spm=1001.2014.3001.5503

    展开全文
  • 1、利用STM32模块连接超声波与舵机模拟真实停车杆环境 2、STM32与GEC6818开发板串口连接通信 3、车辆进入测距检测,自动触发车牌识别 4、车牌识别成功后与数据库比对是否可以入库 入库后自动更新出入库数据 6、可以...
  • QT智能停车场代码

    2018-11-08 14:12:50
    QT 智能停车场的代码,可以实现车位识别,车位计费,计时间
  • 利用Qt Creator开发系统和C++开发语言,设计的一个基于Qt的智能停车场系统。该系统可以实现车辆进出停车场时的扫描拍照,计时等功能。是个不错的资源。
  • 停车场管理系统

    万次阅读 多人点赞 2017-12-29 22:43:44
    停车场管理系统前段时间因为课程要求,所以做了一个停车场管理系统,主要为mfc+oracle+opencv,简单来说,也就是可视化界面+数据库连接+车牌识别。 在继续阅读下去的同时,我先声明,这里我的车牌识别由于时间的...

    #停车场管理系统

    前段时间因为课程要求,所以做了一个停车场管理系统,主要为mfc+oracle+opencv,简单来说,也就是可视化界面+数据库连接+车牌识别。
    在继续阅读下去的同时,我先声明,这里我的车牌识别由于时间的问题,是调用了别人的接口,所以想研究车牌识别的同学可以跳转下这边详细的车牌识别.好了废话不多说,进入教程。

    ##0.摘要
    本项目采用C++编程实现停车场管理系统,其主要功能包括:车辆入库、出库、车辆计费、信息查询、权限管理、摄像头调用与拍照等。课题可分为三个个模块:界面显示、车牌识别、数据库操作。界面使用MFC编程绘制,通过账号密码登录,可显示管理员-游客等不同权限的功能界面,其中管理员可对车辆信息处理,选择车辆入库时,程序调用摄像头拍照进行车牌识别,自动记录车牌信息与入库时间;当对车辆信息查询时,程序连接Oracle数据库并进行数据读取,返回信息至List控件中显示;摄像头的调用与拍照通过opencv视觉库实现,车牌识别系统基于EasyPR工程实现,通过形态学操作、梯度计算、阈值分割等实现车牌定位,使用NN训练实现字符识别等,数据库的访问与信息存储通过微软提供的ADO接口对oracle进行数据操作。

    效果图

    查询显示的车辆数据存于oracle中的,车辆入库与出库时的车牌号码是通过车牌识别得来的。

    MFC工程建立在VS2012中,下面来看看工程全貌和流程图。
    这里写图片描述

    • DBOperation是数据库操作文件
    • CarInDlg是车辆入库界面
    • CarOutDlg是车辆出库界面
    • CvvImage是调用摄像头时用到的文件
    • openCameraDlg是打开摄像头界面
    • park_ManageDlg是登录主界面
    • ManageDlg是管理员界面
    • vistiorDlg是游客界面。

    流程图

    看起来有点小复杂,其实跟着慢慢来也还可以。

    ##1.C++连接数据库
    毕竟我们是数据库课设,所以首先讲解下如何连接oracle。
    工具如下:

    • oracleXE(轻量级学习版oracle)安装教程
    • sql developer(百度搜搜直接下)
      oracle用来建表存储数据,sql developer以可视化的界面查看数据库内的数据。
      C++连接oracle有几种方式:有OCCI、ADO,我们这里采用最简单且已经封装好微软提供的的ADO方式。具体代码参考了this

    1.1导入ADO的库

    使用ADO的话必须要导入它的库,这语句放到头文件.h中

     //导入ADO库
     #import "c:\program files\common  files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
    

    ###1.2将DBOperation.h与DBOperation.c加入MFC工程中
    DBOperiation.h

    #pragma once
    #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
    class CDBOperation
    {
    public:
        //初始化数据库操作需要的对象
        CDBOperation(void);
        ~CDBOperation(void);
        //连接至数据库
        bool ConnToDB(char *ConnectionString, char *UserID, char *Password);
    
        //数据库操作函数
        //查询操作 删除以及添加
        _RecordsetPtr ExecuteWithResSQL(const char *);
        //bool ExecuteNoResSQL(const char *);//delete and add
    
    private:
        void PrintErrorInfo(_com_error &);
    
    private:
        //初始化数据库连接、命令、记录集
        _ConnectionPtr CreateConnPtr();
        _CommandPtr CreateCommPtr();
        _RecordsetPtr CreateRecsetPtr();
    
    private:
        //数据库连接需要的连接、命令操作对象
        _ConnectionPtr m_pConnection;
        _CommandPtr m_pCommand;
    };
    
    

    DBOperation.c

    #include "stdafx.h"
    #include "DBOperation.h"
    
    
    
    CDBOperation::CDBOperation(void)
    {
        CoInitialize(NULL);
        m_pConnection = CreateConnPtr();
        m_pCommand = CreateCommPtr();
    }
    
    CDBOperation::~CDBOperation(void)
    {
        //m_pCommand->Close();
        m_pConnection->Close();
    }
    
    bool CDBOperation::ConnToDB(char *ConnectionString, char *UserID, char *Password)
    {
        if (NULL == m_pConnection)
        {
            printf("Failed to create connection\n");
            return false;
        }
    
        try
        {
            HRESULT hr = m_pConnection->Open(ConnectionString, UserID, Password, NULL);
            if (TRUE == FAILED(hr))
            {
                return false;
            }
            m_pCommand->ActiveConnection = m_pConnection;
            return true;
        }
        catch(_com_error &e)
        {
            PrintErrorInfo(e);
            return false;
        }
    }
    
    _RecordsetPtr CDBOperation::ExecuteWithResSQL(const char *sql)
    {
        //已经在连接至数据库的时候进行判断了
        //if (NULL == m_pCommand || 0 == m_pConnection->State)
        //{
        //    printf("Failed to create command OR the state of connection is zero\n");
        //    return NULL;
        //}
    
        //char *query = new char;
        //strcpy(query, sql);
        try
        {
            m_pCommand->CommandText = _bstr_t(sql);
            _RecordsetPtr pRst = m_pCommand->Execute(NULL, NULL, adCmdText);
            return pRst;
            //_variant_t ra;
            //_RecordsetPtr pRst = m_pConnection->Execute((_bstr_t)query, &ra, adCmdText);
        }
        catch(_com_error &e)
        {
            PrintErrorInfo(e);
            return NULL;
        }
    }
    
    //bool CDBOperation::ExecuteNoResSQL(const char *sql)
    //{
    //    //if (NULL == m_pCommand || 0 == m_pConnection->State)
    //    //{
    //    //    printf();
    //    //}
    //    try
    //    {
    //        char *query = NULL;
    //        strcpy(query, sql);
    //        m_pCommand->CommandText = (_bstr_t)query;
    //
    //    }
    //}
    
    void CDBOperation::PrintErrorInfo(_com_error &e)
    {
        printf("Error infomation are as follows\n");
        printf("ErrorNo: %d\nError Message:%s\nError Source:%s\nError Description:%s\n", e.Error(), e.ErrorMessage(), (LPCTSTR)e.Source(), (LPCTSTR)e.Description());
    }
    
    _ConnectionPtr CDBOperation::CreateConnPtr()
    {
        HRESULT hr;
        _ConnectionPtr connPtr;
        hr = connPtr.CreateInstance(__uuidof(Connection));
        if (FAILED(hr) == TRUE)
        {
            return NULL;
        }
        return connPtr;
    }
    
    _CommandPtr CDBOperation::CreateCommPtr()
    {
        HRESULT hr;
        _CommandPtr commPtr;
        hr = commPtr.CreateInstance(__uuidof(Command));
        if (FAILED(hr) == TRUE)
        {
            return NULL;
        }
        return commPtr;
    }
    
    _RecordsetPtr CDBOperation::CreateRecsetPtr()
    {
        HRESULT hr;
        _RecordsetPtr recsetPtr;
        hr = recsetPtr.CreateInstance(__uuidof(    Command));
        if (FAILED(hr) ==TRUE)
        {
            return NULL;
        }
        return recsetPtr;
    }
    
    

    ###1.3连接oracle

        CDBOperation dbOper;
        bool bConn = dbOper.ConnToDB("Provider=MSDAORA;Persist Security Info=True;Data Source=xe", "system", "123456");
        if (false == bConn)
        {
            MessageBox("连接数据库出现错误");
            return;
        }
    

    如果你是oracle完整版的,记得将Provider=MSDAORA改成Provider=OraOLEDB。
    代码中的xe是数据库的SID,system是用户名,123456是密码,请记得修改。

    ###1.4进行增删改查

    //执行插入操作
    sprintf_s(sql, "insert into CARINFO(CARLICENCE, CARTYPE, TIMECARIN,TIMECAROUT,CARFEE) values('%s', %s, sysdate, null, 0)",carInlien,carIntype);
    //这里的dbOper是连接数据库时得的变量,不清楚可以看下连接数据库的代码
    
    pRst = dbOper.ExecuteWithResSQL(sql);
    //这里的CARINFO是oracle中的一张表,实际上增删改查都是通过将sql语句转换为字符串(这里使用sprintf_s转化,不懂可以查下这个函数),随后再通过ExecuteWithResSQL执行。
    
    
    //执行更新操作
    sprintf_s(sql, "update CARINFO set CARFEE = (trunc(abs((TIMECARIN - TIMECAROUT)*24))*(select FEE from FEESTAND where CARINFO.CARTYPE = FEESTAND.CARTYPE)) where CARLICENCE = '%s'",carOutLience);
    pRst = dbOper.ExecuteWithResSQL(sql);
    
    
    //执行查找操作
    sprintf_s(sql, "select * from FEESTAND");
    pRst = dbOper.ExecuteWithResSQL(sql);
    while (!pRst->adoEOF)
    {
     carInfoList.InsertItem(i, (LPSTR)(LPCSTR)_bstr_t(pRst->GetCollect(_variant_t("CARTYPE"))));
    carInfoList.SetItemText(i, 1,(LPSTR)(LPCSTR)_bstr_t(pRst->GetCollect(_variant_t("FEE")))); 
    i++;
    pRst->MoveNext();	
    }
    //查询返回的是一个指针,通过不断遍历它,(LPSTR)(LPCSTR)_bstr_t(pRst->GetCollect(_variant_t("CARTYPE")))可以获得每条数据属性值为"CARTYPE"的值
    
    //删除同理,写出sql语言,转化为字符串,进行执行
    

    ##2.可视化界面的编写

    2.1子窗口的显示

    MFC中的对话框分为了模态对话框与非模态对话框,具体区别可以百度搜搜看,下面讲解一个子界面的创建至显示过程。

    • 1.在资源中添加一个对话框 右击Dialog | Insert dialog
    • 2.在对话框上添加自己需要的按钮等控件
    • 3.双击控件会出现一个对话框,为添加的对话框命名一个类名,例如Dlg2 自动生成.cpp和.h文件
    • 4.在父窗口的.cpp文件中包含上面生成的那个.h文件
    • 5.在父窗口的的按钮的响应函数中添加如下代码
    	Dlg2 dlg2;
    	dlg2.DoModal();
    

    那么点击父窗口按钮时,就会弹出子对话框.
    如果需要创建非模态对话框,则需调用Create函数与ShowWindow函数

        TestDlg *test = new TestDlg;
        test -> Create(ID,母窗口or this)
        test -> ShowWindow(SW_SHOW)
    

    ###2.2编辑控件中数据的获取
    这里写图片描述
    对应编辑框控件添加变量后,使用如下代码即可:

    UpdataDate(True)
    //读出编辑框中的值改为该控件变量的值
    UpdataDate(False)
    //将该控件变量的值写入编辑框
    

    ###2.3List控件的数据显示
    这位博主写的特别清楚,可以看下这里,这边就不多提了。

    ##3.车牌识别
    原本想自己写一个车牌识别的,但由于时间的问题,最后只能去调用EasyPR的接口,MFC工程是使用VS2012写的,但EasyPR只支持VS2013且需要配置opencv一些的库,于是下了个2013绿色版,下载了EasyPR懒人版(无须配置opencv,可在EasyPR github中下载到,具体链接)。由于界面与识别代码因版本的原因只能作为两个程序,于是采用文件的方式进行数据传递。车牌识别代码每次识别完后将结果存入某个文件,姑且称为’cardInfo.txt’,每次车辆入库或出库子窗口初始化时就去读取’cardInfo.txt’,并将车牌号显示于编辑框中。
    其实是可以在MFC工程调用车牌识别的程序的,使用即可
    WinExec("D:\\EasyPR1\\demo.exe", SW_SHOW);
    只是我的工程还是有问题,程序跑不起来,所以我还是采用手动的方式让车牌识别程序运行。有点无奈啊~~。

    晚一些时候再传代码上来吧
    https://github.com/fengqian-wei/park-manage-system
    https://download.csdn.net/download/qq_34771697/10372014

    补上数据库设计:
    E-R图:概念设计
    在这里插入图片描述
    逻辑设计:由E-R图可得出以下关系模式
    1.停放车辆信息表(车牌号、车辆类型、入库时间、出库时间、停车费)
    主键为:车牌号、入库时间 外键为:车辆类型
    2.停车管理员表(姓名、职工号、性别、年龄) 主键为:职工号
    3.收费标准表(车辆类型、每小时收取费用) 主键为:车辆类型)

    以下为每个表的具体设计:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    请注意以下问题:
    1、该工程用的数据库为oracle32位,开发时VS用的是2012。
    2、跑前请确保已安装OPENCV库,并在VS内配置好依赖库,具体opencv配置可参考如下:
    https://blog.csdn.net/poem_qianmo/article/details/19809337
    3、满足以上条件基本上可以将工程跑起来,运行过程中可能会涉及连接数据库出错,请检查数据库服务是否开启,可尝试用sql developer连接测试。

    展开全文
  • 若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。 测试数据 设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),...
  • 假设停车场是个多个双向通道,设计一个简易的停车场收费系统管理车辆的进出及等候停车操作,并计算停车费用。 • 【基本要求】 1、停车及计时:按照停车通道序号进行停车(停车的车道和车位从小到大),停车成功后...
  • 基于51单片机,使用RFID实现刷卡控制以及计费收费,使用LCD1602显示IC卡内余额以及剩余车位数量,L298N驱动直流电机模拟闸门开关,使用Qt编写上位机程序,实现对系统运行的监控。
  • 智能停车场管理系统

    2014-04-30 19:56:41
    基于rfid射频技术车库管理系统的关键技术研究。电子标签和阅读器中间插件。
  • 某商场地下停车场需要一套停车计费系统,停车每小时5元钱, 如果不足1小时按1小时算,如果只是临时停车在半小时以内是免费的。 要求:用我们现在所学的知识点,来完成这套系统的开发. 需求分析 1.当车辆进停车场时...

    案例需求

    1. 某商场地下停车场需要一套停车计费系统,停车每小时5元钱,
    2. 如果不足1小时按1小时算,如果只是临时停车在半小时以内是免费的。

    要求:用我们现在所学的知识点,来完成这套系统的开发.


    需求分析

    1.当车辆进停车场时,需要采集车辆信息,并有系统自动生成车辆编号和入场时间
        采集信息用键盘录入代替:车牌号、颜色、品牌
    
    2.汽车进场时,把车辆信息存储到car.txt文件中,格式付下(毫秒值表示入场时间)
        颚A61QT2,哈佛,白色,1610450263186
        颚A86U22,比亚迪,红色,1610450963186
        ...
        
    3.当车辆出停车场时,由系统生成出停车场时间,并根据车牌号从car.txt文件中查找入场时间
    
    4.计算该车辆停留的时间
        停留时间 = 出场时间 - 入场时间
    
    5.根据停留时间计算停车费用
        1)如果30分钟以内,免费
        2)如果超过30分钟,5/小时
        3)如果当天超过8小时,40元封顶 
    

    功能菜单

    public static void main(String[] args) throws IOException {
        // 输出功能界面
        while (true) {
            System.out.println("-----停车管理系统-----");
            System.out.println("1.进去停车场 " + "2.驶出停车场 " + "3.退出系统" + "\n请输入您的选择:");
            Scanner sc = new Scanner(System.in);
            switch (sc.nextInt()) {
                case 1:
                    into();
                    break;
                case 2:
                    out();
                    break;
                case 3:
                    System.exit(0);
                default:
                    System.out.println("输入有误");
            }
        }
    }
    

    Car汽车类

    public class Car {
        private String id;
        private String brand;
        private String color;
        private long intoTime;
    
        public Car() {
        }
    
        public Car(String id, String brand, String color, long intoTime) {
            this.id = id;
            this.brand = brand;
            this.color = color;
            this.intoTime = intoTime;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getBrand() {
            return brand;
        }
    
        public void setBrand(String brand) {
            this.brand = brand;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    
        public long getIntoTime() {
            return intoTime;
        }
    
        public void setIntoTime(long intoTime) {
            this.intoTime = intoTime;
        }
    }
    

    读取文件到集合

    public static ArrayList<Car> readFileToList() throws IOException {
        // 创建一个空集合
        ArrayList<Car> list = new ArrayList<>();
        // 创建br对象
        BufferedReader br = new BufferedReader(new FileReader("ParkingManageSystem/src/com/CarManageSystem/car.txt"));
        //创建一个字符串对象,接收read返回的值
        String s;
        while ((s = br.readLine()) != null) {
            // 如果读出来的内容不为空,用spilt方法切割
            String[] array = s.split(",");
            // 切割的返回值为字符串数组,但是intoTime的类型为long。先转换
            long intoTime = Long.parseLong(array[3]);
            // 将切割出来的数据封装成car对象
            Car car = new Car(array[0], array[1], array[2], intoTime);
            // 把对象添加到集合当中
            list.add(car);
        }
        // 关流
        br.close();
        return list;
    }
    

    将集合写入文件

    public static void writeListToFile(ArrayList<Car> list) throws IOException {
        // 创建一个bw对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("ParkingManageSystem/src/com/CarManageSystem/car.txt"));
        // 遍历集合,将数据写入文件中
        for (Car car : list) {
            bw.write(car.getId() + "," + car.getBrand() + "," + car.getColor() + "," + car.getIntoTime());
            bw.newLine();
        }
        bw.close();
    }
    

    判断车牌是否存在

    public static int getIndex(ArrayList<Car> list, String id) {
        // 定义index默认为-1
        int index = -1;
        for (int i = 0; i < list.size(); i++) {
            // 遍历集合,判断id是否相同
            if (id.equals(list.get(i).getId())) {
                index = i;
            }
        }
        return index;
    }
    

    进入停车场

    public static void into() throws IOException {
        // 读取文件中数据然后返回一个list
        ArrayList<Car> list = readFileToList();
        while (true) {
            System.out.println("请输入车牌:");
            Scanner sc = new Scanner(System.in);
            String id = sc.nextLine();
            // 判断车牌号是否存在
            int index = getIndex(list, id);
            if (index == -1) {
                System.out.println("请输入厂商:");
                String brand = sc.nextLine();
                System.out.println("请输入颜色:");
                String color = sc.nextLine();
                long intoTime = System.currentTimeMillis();
                // 将录入的数据封装成Car类
                Car car = new Car(id, brand, color, intoTime);
                // 将对象添加到list中
                list.add(car);
                // 将集合写入文件
                writeListToFile(list);
                break;
            } else {
                System.out.println("车牌已存在");
            }
        }
    }
    

    驶出停车场

    ***重点在于出来的时候判断怎么收费

    public static void out() throws IOException {
        // 读取文件中的数据
        ArrayList<Car> list = readFileToList();
        long money;
        System.out.println("请输入车牌:");
        Scanner sc = new Scanner(System.in);
        String id = sc.nextLine();
        int index = getIndex(list, id);
        if (index == -1) {
            System.out.println("车辆不存在");
            // 直接退出方法
            return;
        } else {
            // 获取当前车辆的进去时间
            long intoTime = list.get(index).getIntoTime();
            // 获取驶出时间
            long outTime = System.currentTimeMillis();
            // 总共停车时常
            long stopTime = outTime - intoTime;
            // 获取天数,小时,分钟
            long day = stopTime / 1000 / 3600 / 24;
            long hour = stopTime / 1000 / 3600 % 24;
            long min = stopTime / 1000 / 60 % 60;
            System.out.println("停车时长为"+day+"天"+hour+"小时"+min+"分钟");
            // 停车不足半个小时
            if (day == 0 && hour == 0 && min < 30) {
                money = 0;
            } else {
                // 开始收费后,不足一小时按照一小时选,第一种情况,min>0,所以hour要+1
                if (min > 0) {
                    // 先判断是否达到了8小时
                    if ((hour + 1) >= 8) {
                        //达到当天封顶金额
                        money = day * 40 + 40;
                    } else {
                        // 没达到8小时就按照每小时5块钱算(因为这种情况是在min>0的时候,所以hour要+1)
                        money = day * 40 + (hour + 1) * 5;
                    }
                } else {
                    // 开始收费后,不足一小时按照一小时选,第二种情况,min=0,所以hour不用+1
                    // 先判断是否达到了8小时
                    if ((hour + 1) >= 8) {
                        //达到当天封顶金额
                        money = day * 40 + 40;
                    } else {
                        // 没达到8小时就按照每小时5块钱算(因为这种情况是在min=0的时候,所以hour不要+1)
                        money = day * 40 + hour * 5;
                    }
                }
            }
        }
        System.out.println("停车费为"+money+"元");
        // 删除驶出车辆
        list.remove(index);
        // 将集合写入文件中
        writeListToFile(list);
    }
    
    展开全文
  • 基于ARM53的停车场管理系统 项目实现: 1:使用RFID打卡作为入场和出场识别。 (刷第一次查询数据库是否该卡号,没有就是进场,有就是出场) 进场:记录进场的时间,卡号,进场的车辆照片 出场:计费,显示当时进场的...

    哔哩哔哩项目演示视频:https://www.bilibili.com/video/BV1vf4y1r7sD
    在这里插入图片描述

    资料链接:https://download.csdn.net/download/mbs520/15085916

    一、功能要求

    基于ARM53的停车场管理系统

    (制作好的作品与功能要求略有区别,增加了一些功能)

    项目实现:
    1:使用RFID打卡作为入场和出场识别。
    (刷第一次查询数据库是否该卡号,没有就是进场,有就是出场)
    进场:记录进场的时间,卡号,进场的车辆照片
    出场:计费,显示当时进场的车辆照片,从数据库中删除该车辆的信息

    2:使用数据库进行车位管理。
    (可以人为修改车辆在数据库中的信息)

    3:监控出入口视频。 (循环录制1分钟的视频,保存到本地)

    4:实现语音播报车辆信息与消费信息。(车场就播报车辆的卡信息,出场就播报消费金额)

    5:添加图像识别功能,根据拍照获取车牌号

    项目具体需求:
    1: 创建一个数据库, 内置你需要的所有信息, 如车牌信息、RFID卡信息、卡类、进场时间、车辆照片名等

    2: 在默认状态下,视频监控是处于打开状态的,并循环录制,1分钟视频,保存到本地。

    当检测到有RFID卡,关闭视频流,判断当前数据库中是否有该卡的入场信息:

    1)如果已有该卡的入场信息,表示现在是出场;则直接计算出当前时间和入场时间差值,在屏幕上显示该车辆照片,显示车辆信息和应收费金额

    2)如果没有该卡的入场信息,则在数据库中增加该车辆信息,并记录当前时间且拍照。

    3)在检测到RFID卡3秒后, 系统会恢复打开视频流

    4:当车辆刷卡进场是,语音提示卡号,并说明卡的类别(临时卡,或包月卡),出场提示:费用与月卡剩余天数

    5:管理功能,负责把卡的类别进行修改,与数据库中的数据进行修改。

    6: 自行扩展: 添加一些自主功能。

    二、项目笔记

    一开始遇到的问题

    (一)网络问题:Ubuntu同时与开发板、WiFi连接

    1、打开Ubuntu ,上面的菜单栏,点击 编辑->虚拟网络设置
    首先还原默认设置
    在这里插入图片描述
    2、WMnet0桥接模式
    在这里插入图片描述

    原理:让这个网络桥接到这个网口
    在这里插入图片描述

    3、点击 虚拟机->设置->添加->网络适配器
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    4、开启终端
    ifconfig 记住自己的网卡名字
    在这里插入图片描述
    5、编辑网卡

    sudo vi /etc/network/interfaces
    

    编辑一下信息:

    # interfaces(5) file used by ifup(8) and ifdown(8)
    auto lo
    iface lo inet loopback
    
    auto ens33
    iface ens33 inet dhcp
    
    auto ens38
    iface ens38 inet static
    address 192.168.22.128
    netmask 255.255.255.0
    gateway 192.168.22.1
    dns-nameservers 223.5.5.5
     
    

    在这里插入图片描述

    6、重启网卡

    sudo /etc/init.d/networking restart
    

    7、测试
    在这里插入图片描述

    问题:
    有网友反馈说配置后不能重启网络,可以试试下面解决方法:
    在这里插入图片描述

    1、 cd /etc/NetworkManager/system-connections 然后 ls

    在这里插入图片描述
    2、sudo vi ens33
    把网卡名字修改过来
    在这里插入图片描述
    把第二网口名字也改过来

    sudo mv 有线连接\ 2 ens38
    ls
    

    在这里插入图片描述

    sudo vi ens38
    

    在这里插入图片描述

    (二)图片文字识别

    百度图像识别API 接口的使用

    百度的文字识别API 接口 : https://cloud.baidu.com/p
    roduct/ocr/general
    下载文字识别的SDK ,注意下载的是C++ SDK
    在这里插入图片描述

    点击使用说明: https://ai.baidu.com/ai-doc/OCR/skib
    izxzo

    官方的使用说明:
    安装文字识别 C++ SDK
    文字识别 C++ SDK目录结构
    最低支持 C++ 11+
    直接使用开发包步骤如下:
    1.在官方网站下载C++ SDK压缩包。
    2.将下载的aip-cpp-sdk-version.zip解压, 其中文件为
    包含实现代码的头文件。
    3.安装依赖库libcurl(需要支持https) openssl

    jsoncpp(>1.6.2版本,0.x版本将不被支持)。
     ├── base │ 
     ├── base.h // 请求客户端基类
      │ ├── base64.h // base64加密相关类 
      │ ├── http.h // http请求封装类 
      │ └── utils.h // 工具类 
      └── ocr.h // 文 字识别 交互类
    

    4.编译工程时添加 C++11 支持 (gcc/clang 添加编译参数
    -std=c++11), 添加第三方库链接参数 lcurl, lcrypto,
    ljsoncpp。

    g++ main.cpp -o main -std=c++11 -lcurl -lcrypto -ljsoncpp
    

    5.在源码中include ocr.h ,引入压缩包中的头文件以使
    用aip命名空间下的类和方法。
    环境库的安装方式:
    使用步骤
    1.新建一个客户端

    //安装依赖库 
    sudo apt-get install libcurl4-openssl-dev  -> libcurl 
    sudo apt-get install libjsoncpp-dev -> jsoncpp 
    //(需要修改JSON 文件的路径)
    /usr/include/json/json.h 
    //(编译时提示找到不 JSON都是这个问题)
    sudo apt-get install libssl-dev -》 openssl
    #include "ocr.h" // 设置APPID/AK/SK 
    std::string app_id = "你的 App ID"; 
    std::string api_key = "你的 Api key";
    std::string secret_key = "你的 Secret Key";
    aip::Ocr client(app_id, api_key, secret_key);
    

    所有的 APPID/AK/SK 在自己个人中心控制台查看。
    在这里插入图片描述

    例子如下:

    #include "ocr.h" // 设置APPID/AK/SK
    std::string app_id = "23603269";
    std::string api_key = "oi9p6xAUZiKCctGTET0ZXU7n"; 
    std::string secret_key = "0tfYXzYGABWfruRrOG2dp66pNQ79s0SG";
    aip::Ocr client(app_id, api_key, secret_key);
    

    编译的时候提示如下错误:
    在这里插入图片描述

    编译的时候添加第三方库文件:

    lcurl, lcrypto, ljsoncpp。 -std=c++11
    g++ main.cpp -o main -std=c++11 -lcurl -lcrypto -ljsoncpp
    

    2.调用文字识别的API 接口 https://ai.baidu.com/ai-do
    c/OCR/rkibizy1d

    高精度版

    Json::Value result; std::string image;
    aip::get_file_content("/assets/sample.jpg", &image); // 调用通用文字识别(含位置高精度版)
    result = client.accurate(image, aip::null); // 如果有可选参数
    std::map<std::string, std::string> options; 
    options["recognize_granularity"] = "big"; 
    options["detect_direction"] = "true"; 
    options["vertexes_location"] = "true"; 
    options["probability"] = "true"; // 带参数调用通用文字识别(含位置高精度版)
    result = client.accurate(image, options); 
    
    
    

    在QT 中使用 百度文字识
    别API
    注意:在windos 的QT 是没有办法用的,因为windos
    没有 lcurl, lcrypto, ljsoncpp 这些库。
    1.把百度的SDK 放到 QT 工程文件中
    在这里插入图片描述

    2.把 #include “ocr.h” 头文件添加到 QT 工程中
    在这里插入图片描述

    3.添加第三方库文件
    在这里插入图片描述

    4.添加头文件
    在这里插入图片描述

    (三)文字转语音

    参考我的博客:https://blog.csdn.net/mbs520/article/details/113179224

    (四)摄像头拍摄

    FFMPEG 工具的使用
    在这里插入图片描述

    1.把 ffmpeg 工具下载到开发板的 /bin 目录

    2.修改 ffmpeg 的权限
    chmod 777 /bin/ffmpeg

    常用命令:

    ffmpeg -f v4l2 -s 640X480 -r 1 -t 1 -i /dev/video7 -f image2 pic-%03d.jpeg 
    

    参数说明:

    -f 指定视频的格式
    -s 指定视频的大小
    -r 指定帧率 -t 指定时间 -i 指定输入设备 -f 指定格式

    //录制10S 的视频
    ffmpeg -f v4l2 -s 640x480 -t 10 -i /dev/video7 out.avi 
    //覆盖录制
    ffmpeg -y -f v4l2 -s 640x480 -t 10 -i /dev/video7 out.avi
    

    化作尘其它开源项目:

    单片机项目:

    基于stm32c8t6的坡道行驶巡线小车(2020年TI杯大学生电子设计竞赛 C题)https://blog.csdn.net/mbs520/article/details/115438122

    基于STM32F4的音乐播放器
    https://blog.csdn.net/mbs520/article/details/111313042

    基于STM32F4的电子阅读器(首创)
    https://blog.csdn.net/mbs520/article/details/110817173

    基于51单片机WiFi视频小车(首创)
    https://blog.csdn.net/mbs520/article/details/109843972

    基于51单片机蓝牙小车
    https://blog.csdn.net/mbs520/article/details/109775964
    基于MSP430 坡道行驶电动小车(2020年TI杯大学生电子设计竞赛 C题)
    https://blog.csdn.net/mbs520/article/details/109090072

    基于stm32f4的智能门锁系统
    https://blog.csdn.net/mbs520/article/details/106987758

    基于51单片机超声波测距小车
    https://blog.csdn.net/mbs520/article/details/106599219

    基于51单片机定时宠物喂食系统
    https://blog.csdn.net/mbs520/article/details/108292187

    Linux项目:

    基于QT5 Linux平台 停车场管理系统
    https://blog.csdn.net/mbs520/article/details/113481824

    基于QT5 Linux平台 车载系统
    https://blog.csdn.net/mbs520/article/details/112873809

    基于Linux系统 媒体播放器
    https://blog.csdn.net/mbs520/article/details/107880118

    基于Linux系统 语音识别、人机对话
    https://blog.csdn.net/mbs520/article/details/113179224

    基于Linux系统小钢琴程序(暂无博客)
    https://download.csdn.net/download/mbs520/12798287

    基于Linux系统 QQ通讯录管理系统(暂无博客)

    展开全文
  • 如何实现停车场自动收费的秘密?

    千次阅读 2014-06-05 13:37:47
    众所周知的是,停车场人工收费是很普遍的一种收费方式,但是也存在一系列的問題,例如用工荒,人工...该停车场自动收费系统大大减少了管理成本,还解决了用工荒的问题。   今天就由春晨科技的小编为大家来揭晓这个
  • qt 汽车管理系统

    千次阅读 2018-08-16 15:51:15
    界面设计 运行后界面 数据库表: connection.h文件 ...Qtsql&gt; #include&lt;QDebug&gt; #include&lt;qdom.h&gt; #include&lt;QDebug&gt; #include &lt;QSqlQuery...
  • 简易的停车收费系统

    千次阅读 2020-06-18 20:25:41
    停车收费系统: 1.硬件摄像头:使用电脑自带的摄像头,由运行在此摄像头的电脑上的服务器端直接控制。 2.服务器端:由纯C写成,运行在一个性能良好的电脑上,初始化过后,开辟线程。线程一用于进行视频的采集,并将...
  • 停车管理系统-源码

    2021-03-03 16:57:48
    停车管理系统
  • 使用百度AI实现车牌识别,对车牌识别反馈至QT客户端并与Linux写的数据库进行远程访问。实现对车辆停车收费等功能,项目数据库有小BUG。
  • 以及通过手机APP对出入口门闸进行开关控制,从而实现对地下停车场进行实时监控以及远程控制,如此一来,不仅能给车主带来极大的便利,同时也为管理人员减少很多不必要的麻烦。 2.功能简介 本系统将以纸品箱为原材料...
  • 停车场栈和队列的调用

    千次阅读 2009-05-17 19:05:00
     cout停车场管理系统===================>";  cout操作说明: ******* ==>";  cout停车命令 ******* ==>";  cout出车命令 *** ==>";  cout退出程序 *** ==>";  cout 显示停车场内状况 ";  //cout非...
  • 客户管理系统3.多媒体积件管理库的开发与应用4.基于WEB的多媒体素材管理库的开发与应用5.网络教学软件中的教学设计与应用6.小型教育网站的开发与建设7.基于图像的风景旅游模拟漫游系统8.网上报名系统9.电脑配件网络...
  • 基于xxx的系统实现

    2021-02-03 22:33:28
    帮助解答任何系统问题 1.成品:看最下面 2.基于强化学习的Tic-Tac-To实现 3.基于文本的关键词打标 4.基于自然语言处理的情感分析...13.基于Flask的校园课程管理系统设计与实现 14.基于Flask的人脸识别企业系统 15.vb
  • ++B2.2、“云”+“边”工业机器人远程管理系统方案 ++B2.2、“云”+“边”工业机器人远程管理系统方案 ++B2.2、”云”+”边”工业机器人远程管理系统方案 ++++立钻哥哥:在全球工业互联网浪潮日益高涨的背景下,...
  • 132计算机毕业设计

    千次阅读 2014-02-26 23:18:57
    ASP.NET音乐类网站(ACCESS数据库)(程序,毕业论文,...ASP.NET中学图书管理系统(全套计算机毕业设计).rar http://dl.vmall.com/c00ixzgnom JAVA医药管理系统(全套计算机毕业设计).rar http://dl.vmall.com/c0qqasc45
  • 402计算机毕业设计

    千次阅读 2014-02-26 23:25:42
    DELPHI图书馆全开架借阅管理系统(任务书,开题报告,毕业论文,程序,源码).rar http://dl.vmall.com/c0jph7n2a1 毕业设计网上选题系统(开题报告,任务书,毕业论文,程序,中期报告).rar http://dl.vmall.com/c01f4foy61...
  • 计算机类专业毕业设计(课程设计)题目大全

    万次阅读 多人点赞 2019-05-15 22:15:26
    客户管理系统 多媒体积件管理库的开发与应用 基于 WEB的多媒体素材管理库的开发与应用 网络教学软件中的教学设计与应用 小型教育网站的开发与建设 基于图像的风景旅游模拟漫游系统 网上报名系统 电脑配件网络购物 ...
  • 计算机毕设题目大全

    2021-07-17 10:23:03
    2.客户管理系统 3.多媒体积件管理库的开发与应用 4.基于WEB的多媒体素材管理库的开发与应用 5.网络教学软件中的教学设计与应用 6.小型教育网站的开发与建设 7.基于图像的风景旅游模拟漫游系统 8.网上报名系统 9.电脑...
  • JAVA类计算机专业毕业设计题目

    千次阅读 2020-04-16 12:08:33
    1.学籍管理系统 2.Java远程通信及应用的研究 3.JAVA游戏 4.俄罗斯方块游戏 5.JAVA多线程教学演示系统 6.IPv4网络协议问题分析 7.校园网规划与设计 8.校园网络规划设计 9.办公局域网设计 10.智能小区规划 11.搜索引擎...

空空如也

空空如也

1 2 3
收藏数 53
精华内容 21
关键字:

qt停车场收费系统管理