简介
该项目的应用场景为停车场,记录车辆的进出时间,对车辆进行收费
开发环境
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
使用教程
- 在工程中加入多媒体模块
QT += multimedia multimediawidgets
- 摄像头信息类
//返回系统中可用的摄像头信息
[static] QList<QCameraInfo> QCameraInfo::availableCameras(QCamera::Position position = QCamera::UnspecifiedPosition);
//返回摄像头的描述信息
QString QCameraInfo::description() const;
//返回摄像头的设备名
QString QCameraInfo::deviceName() const;
- 摄像头类
//构造函数
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();
- 摄像头截屏类
构造函数:
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