停车场车牌识别项目

简介

该项目的应用场景为停车场,记录车辆的进出时间,对车辆进行收费

开发环境

Windows 下的 QT

技术栈

QT 、 C++ 、 Sqlite库 、 OpenCV 、 TTS

1.Sqlite

考虑到该项目只是由个人使用,数据存储量不是特别大,数据存储方式采用的是轻量、稳定Sqlite

核心代码

#include <QSqlDatabase>	//用于数据库创建
#include <QDateTime>	//用于获取时间
/************************* 初始化数据库 *********************************************/
QSqlDatabase database;      //数据库驱动
//添加数据库驱动
database = database.addDatabase("QSQLITE");
database.setDatabaseName("./car.db");   //设置数据库文件的路径
if(!database.open())
    qDebug() << "打开失败";
    
//在数据库中 建表
//数据的存储格式 “车牌号  进库时间  出库时间  需交费用  是否缴过费的标志位
QString sql = QString("create table if not exists car_table(carid text unique, 
															intime text, 
															outtime text, 
															fare int, symbol_fare bit)");	
			 
QSqlQuery query;
if(!query.exec(sql))    //执行创建表的命令
    qDebug() << "建表失败";

/*************************** 对数据库的增、删、改、查******************************************/
//增
QString str_time = QDateTime::currentDateTime().toString("hh:mm:ss.z");	//获取现在的时间
sql = QString("insert into car_table values('%1','%2','None',0,0)")
											.arg(QString::fromLocal8Bit(license.c_str()))
											.arg(str_time);	//license 是摄像头捕获后处理得到的车牌号字符串	
if(!query.exec(sql))	//执行命令
    qDebug() << "插入失败";

//删
sql = QString("delete from car_table where carid = '%1'").arg(QString::fromLocal8Bit(license.c_str()));
if(!query.exec(sql))
     qDebug() << "数据清除失败";

//改
//通过车牌号去数据库中找到要修改的数据组
sql = QString("update car_table set fare=%1 where carid = '%2'")
										.arg(fare_for_park)
										.arg(QString::fromLocal8Bit(license.c_str()));
if(!query.exec(sql))	
    qDebug() << "无法修改停车费";

//查
QString sql = QString("select * from car_table");
QSqlQuery query;
if(!query.exec(sql))
    qDebug() << "查询失败";
//每执行一次 query.next(), query.value() 便往后移动一个位置,直到后面的位置没有数据组
//坑: query.next()生效 的前提是 已执行过 query.exec(sql) 且 sql内容是 ”select .. from ...“的相关内容
while(query.next()){	
    qDebug() << query.value(0).toString() << " | " << query.value(1).toString() << " | " << query.value(2).toString() << " | " << query.value(3).toInt() << " | " << query.value(4).toBool();
    count++;    //记录总共有几行
}

2.TTS

TTS 全称为 ”Text To Speech“(文本转语音) ,由于 QT 中提供了相关的库,可直接调用
编译运行环境都是在 Windows,所以语音来源是电脑自带的语音模块
在这里插入图片描述
想要查看本电脑上面有哪些语音可用 可以使用以下代码

#include <QVoice>
#include <QVector>
#include <QTextToSpeech>
#include <QDebug>

QTextToSpeech *machine;      //文本转语音
QVector<QVoice> voice = machine->availableVoices();		//将可用的语音存放在 容器 QVector 中
//打印出语音的 名字、性别、年龄
for(QVector<QVoice>::iterator p = voice.begin(); p != voice.end(); p++)
	qDebug() << "名字:" << p->name() << " 性别:" << p->gender() << " 年龄:" << p->age();

性别和年龄可根据下面这个表格进行对应查询
在这里插入图片描述
找到想要用的语音 便可调用以下函数进行设置声音类型

void setVoice(const QVoice &voice);

以上只是设置声音类型,还有 音调、音速、音量语言可以设置

void setPitch(double pitch);
void setRate(double rate);
void setVolume(double volume);
void SetLocale(const QLocale &locale);

除了设置语音类型,还要选择 语音引擎 才能实现 自主设置 TTS

QTextToSpeech::QTextToSpeech(const QString &engine, QObject *parent = nullptr);      

如果你比较懒(像我一样)不去设置 语音类型, 则QT会默认选择。只需在设置好语音引擎后,调用以下函数,把你想说的文本作为参数就可轻松实现 TTS(API真香!

[slot] void QTextToSpeech::say(const QString &text); 

3、摄像头

摄像头采用的是 QT 封装好的类 QCamera

使用教程
  1. 在工程中加入多媒体模块
QT += multimedia multimediawidgets    
  1. 摄像头信息类
//返回系统中可用的摄像头信息 
[static] QList<QCameraInfo> QCameraInfo::availableCameras(QCamera::Position position = QCamera::UnspecifiedPosition); 
//返回摄像头的描述信息 
QString QCameraInfo::description() const; 
//返回摄像头的设备名 
QString QCameraInfo::deviceName() const;                             
  1. 摄像头类
//构造函数 
QCamera::QCamera(const QCameraInfo &cameraInfo, QObject *parent = nullptr); 
QCamera::QCamera(const QByteArray &deviceName, QObject *parent = nullptr); 
//成员函数 
//设置显示窗口 
void QCamera::setViewfinder(QVideoWidget *viewfinder); 
void QCamera::setViewfinder(QGraphicsVideoItem *viewfinder); 
void QCamera::setViewfinder(QAbstractVideoSurface *surface); 
//槽函数 
//开始采集 
[slot] void QCamera::start(); 
//停止采集 
[slot] void QCamera::stop();     
  1. 摄像头截屏类
构造函数: 
    QCameraImageCapture::QCameraImageCapture(QMediaObject *mediaObject, QObject *parent = nullptr); 
//构造时传入多媒体对象(QCamera) 截屏槽函数: 
[slot] int QCameraImageCapture::capture(const QString &file = QString()); 
//传入的是存储截屏图片的路径 截屏完成信号: 
[signal] void QCameraImageCapture::imageCaptured(int id, const QImage &preview); 
//id表示截屏的编号,preview就是截屏的图像   
//图片保存成功后发送信号
[signal] void QCameraImageCapture::imageSaved(int id, const QString &fileName)

项目摄像头相关的核心代码

//获取系统可用摄像头信息
QList<QCameraInfo> infos = QCameraInfo::availableCameras(); //显示到下拉列表
foreach(QCameraInfo info,infos){
    qDebug() << info.deviceName() << info.description();
    ui->comboBox->addItem(info.deviceName());   //把摄像头设备名加入列表
}
//初始化定时器	定时器用于控制两次截屏的间隔时间
timer = new QTimer(this);
QObject::connect(timer, &QTimer::timeout, this, &MyCamera::timer_shot_slogs);

ca = new QCamera(ui->comboBox->currentText().toUtf8(),this);    //构造摄像头对象
qDebug() << ca;
w = new QCameraViewfinder(ui->widget);    //构造显示窗口对象
w->resize(ui->widget->size());  //调整大小
cap = new QCameraImageCapture(ca,this); //构造截屏对象
QObject::connect(cap,&QCameraImageCapture::imageCaptured,this,&MyCamera::show_capture);     //连接信号和槽
ca->setViewfinder(w);       //设置摄像头的显示窗口
w->show();
ca->start();        //启动摄像头
timer->start(3000);     //周期为 3 秒


//摄像头截图
void MyCamera::timer_shot_slogs()
{
   cap->capture();
}

实现效果图

在这里插入图片描述

源码

https://github.com/Cynan-C/ParkingLot_BasedOn_Opencv/tree/master

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值