简介
该项目的应用场景为停车场,记录车辆的进出时间,对车辆进行收费
开发环境
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);
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() << "查询失败";
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();
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);
[slot] int QCameraImageCapture::capture(const QString &file = QString());
[signal] void QCameraImageCapture::imageCaptured(int id, const QImage &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);
void MyCamera::timer_shot_slogs()
{
cap->capture();
}
实现效果图
|