IVA/app/HxDataBase.cpp
hehaoyang ff66a2e0d6 V1.02
1. 删除图片存储到本地的方式;
2. 取流方式由Opencv修改为FFmpeg方式;
3. 解码后的数据直接转为RK_FORMAT_YCbCr_422_SP格式发送给算法;
4. 视频裸流数据存储在内存中,保存30s;
5. 报警图片从报警录像视频中获取;
2023-12-08 14:17:14 +08:00

375 lines
14 KiB
C++

#include "HxDataBase.h"
#include "HxUtils.h"
QMutex HxDataBase::mutex;
QSqlDatabase HxDataBase::database;
QString HxDataBase::device_id;
int HxDataBase::recording_prepend_time;
QString HxDataBase::ftp_address, HxDataBase::ftp_username, HxDataBase::ftp_password;
QString HxDataBase::qamqp_address, HxDataBase::qamqp_username, HxDataBase::qamqp_password;
int HxDataBase::algorithm_type;
QString HxDataBase::dsm_video_input_source;
QString HxDataBase::adas_video_input_source;
QStringList HxDataBase::bsd_video_input_source;
QStringList HxDataBase::bsd_warn_regions;
EventWarnParamConfig HxDataBase::warm_param_config;
CameraCalibration HxDataBase::adas_camera_calibration;
QStringList HxDataBase::alarm_protect_timestamp;
QSqlDatabase HxDataBase::open(QString filepath, QString connectionName)
{
QSqlDatabase db;
if (QSqlDatabase::contains(connectionName))
db = QSqlDatabase::database(connectionName);
else
db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
db.setDatabaseName(filepath);
if (!db.open())
{
QString bk_filepath = filepath + QString(".[%1].bk").arg(QDateTime::currentDateTime().toString("yyyyMMddHHmmss"));
QFile::copy(filepath, bk_filepath);
QFile::remove(filepath);
db.open();
}
return db;
}
/**
* @brief 关闭数据库
* @param connectionName 连接名
*/
void HxDataBase::close(QString connectionName) { QSqlDatabase::removeDatabase(connectionName); }
/**
* @brief 读取 Setting 表数据
* @param name name字段值
* @return 返回对应参数
*/
QVariant HxDataBase::read_setting(QString name)
{
QVariant value;
QMutexLocker lock(&mutex);
QSqlQuery query(database);
query.prepare("SELECT [value] FROM [Setting] WHERE [name]=:name");
query.bindValue(":name", name);
if (query.exec())
{
if (query.next())
value = query.value("value");
}
query.clear();
return value;
}
/**
* @brief 读取 Setting 表数据(int)
* @param name name字段值
* @param defaultValue 默认值(int)
* @return 返回对应参数(int)
*/
int HxDataBase::read_setting(QString name, int defaultValue)
{
auto value = read_setting(name);
return value.isNull() ? defaultValue : value.toInt();
}
/**
* @brief 读取 Setting 表数据(bool)
* @param name name字段值
* @param defaultValue 默认值(bool)
* @return 返回对应参数(bool)
*/
bool HxDataBase::read_setting(QString name, bool defaultValue)
{
auto value = read_setting(name);
return value.isNull() ? defaultValue : value.toBool();
}
/**
* @brief 读取 Setting 表数据(string)
* @param name name字段值
* @param defaultValue 默认值(string)
* @return 返回对应参数(string)
*/
QString HxDataBase::read_setting(QString name, QString defaultValue)
{
auto value = read_setting(name);
return value.isNull() ? defaultValue : value.toString();
}
/**
* @brief 写入 Setting 表数据
* @param name name字段值
* @param value 对应参数
*/
void HxDataBase::write_setting(QString name, QString value)
{
QMutexLocker lock(&mutex);
QSqlQuery query(database);
query.prepare("REPLACE INTO [Setting] ([name], [value]) VALUES (:name, :value);");
query.bindValue(":name", name);
query.bindValue(":value", value);
if (!query.exec())
{
qDebug("write_setting failed, name=%s, value=%s", name.toUtf8().data(), value.toUtf8().data());
}
query.clear();
}
void HxDataBase::read_warm_param_config(void)
{
auto start_event_warn_kind = read_setting("start_event_warn_kind", QString("1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1")).split(";");
auto abnormal_warn_frame_count = read_setting("abnormal_warn_frame_count", QString("0;0;0;0;0;0;0;50;75;25;50;75;50;50;50;25;75;50;50;50;50;50;75;50;50;100")).split(";");
auto normal_frame_count = read_setting("normal_frame_count", QString("0;0;0;0;0;0;0;25;25;25;25;25;25;25;25;25;25;25;25;25;25;25;0;0;0;0")).split(";");
auto abnormal_warn_interval_frame_count = read_setting("abnormal_warn_interval_frame_count", QString("0;0;125;0;125;0;0;0;0;0;0;0;0;125;0;0;0;0;0;0;0;0;0;0;0;0")).split(";");
auto abnormal_warn_score_threshold = read_setting("abnormal_warn_score_threshold", QString("0;0;0;0;0;0;0;0.7;0.8;0.4;0.65;0.95;0.75;0.3;0.65;0.5;0.87;25;25;20;15;0.75;0.3;0.5;0.5;0.5")).split(";");
auto normal_warn_score_threshold = read_setting("normal_warn_score_threshold", QString("0;0;0;0;0;0;0;0.35;0.35;0.7;0.7;0.7;0.55;0.8;0.4;0.55;0.13;20;20;15;10;0.55;0.3;0.3;0.5;0.5")).split(";");
for (int i = 0; i < EVENT_WARN_NUM; i++)
{
warm_param_config.bStartEventWarnKind[i] = QVariant(start_event_warn_kind.at(i)).toBool();
warm_param_config.nAbnormalWarnFrameCount[i] = abnormal_warn_frame_count.at(i).toInt();
warm_param_config.nNormalFrameCount[i] = normal_frame_count.at(i).toInt();
warm_param_config.nAbnormalWarnIntervalFrameCount[i] = abnormal_warn_interval_frame_count.at(i).toInt();
warm_param_config.fAbnormalWarnScoreThreshold[i] = abnormal_warn_score_threshold.at(i).toFloat();
warm_param_config.fNormalWarnScoreThreshold[i] = normal_warn_score_threshold.at(i).toFloat();
}
warm_param_config.nHmwTime = read_setting("hmw_time", 1200);
warm_param_config.nPcwTime = read_setting("pcw_time", 2000);
warm_param_config.nFcwTime = read_setting("fcw_time", 2400);
warm_param_config.fHmwVel = read_setting("hmw_vel", 30);
warm_param_config.fFcwVel = read_setting("fcw_vel", 30);
warm_param_config.fLdwVel = read_setting("ldw_vel", 55);
warm_param_config.fPcwVel = read_setting("pcw_vel", 50);
warm_param_config.fBsdFirstVel = read_setting("bsd_first_vel", 30);
warm_param_config.fBsdSecondVel = read_setting("bsd_second_vel", 30);
warm_param_config.fBsdThirdVel = read_setting("bsd_third_vel", 30);
warm_param_config.nLdwDistance = read_setting("ldw_distance", -5);
warm_param_config.fDsmVel = read_setting("dsm_vel", 5);
}
void HxDataBase::write_warm_param_config(void)
{
QStringList start_event_warn_kind, abnormal_warn_frame_count, normal_frame_count, abnormal_warn_interval_frame_count, abnormal_warn_score_threshold, normal_warn_score_threshold;
for (int i = 0; i < EVENT_WARN_NUM; i++)
{
start_event_warn_kind.append(QString::number(warm_param_config.bStartEventWarnKind[i]));
abnormal_warn_frame_count.append(QString::number(warm_param_config.nAbnormalWarnFrameCount[i]));
normal_frame_count.append(QString::number(warm_param_config.nNormalFrameCount[i]));
abnormal_warn_interval_frame_count.append(QString::number(warm_param_config.nAbnormalWarnIntervalFrameCount[i]));
abnormal_warn_score_threshold.append(QString::number(warm_param_config.fAbnormalWarnScoreThreshold[i]));
normal_warn_score_threshold.append(QString::number(warm_param_config.fNormalWarnScoreThreshold[i]));
}
write_setting("start_event_warn_kind", start_event_warn_kind.join(";"));
write_setting("abnormal_warn_frame_count", abnormal_warn_frame_count.join(";"));
write_setting("normal_frame_count", normal_frame_count.join(";"));
write_setting("abnormal_warn_interval_frame_count", abnormal_warn_interval_frame_count.join(";"));
write_setting("abnormal_warn_score_threshold", abnormal_warn_score_threshold.join(";"));
write_setting("normal_warn_score_threshold", normal_warn_score_threshold.join(";"));
write_setting("hmw_time", QString::number(warm_param_config.nHmwTime));
write_setting("pcw_time", QString::number(warm_param_config.nPcwTime));
write_setting("fcw_time", QString::number(warm_param_config.nFcwTime));
write_setting("hmw_vel", QString::number(warm_param_config.fHmwVel));
write_setting("fcw_vel", QString::number(warm_param_config.fFcwVel));
write_setting("ldw_vel", QString::number(warm_param_config.fLdwVel));
write_setting("pcw_vel", QString::number(warm_param_config.fPcwVel));
write_setting("bsd_first_vel", QString::number(warm_param_config.fBsdFirstVel));
write_setting("bsd_second_vel", QString::number(warm_param_config.fBsdSecondVel));
write_setting("bsd_third_vel", QString::number(warm_param_config.fBsdThirdVel));
write_setting("ldw_distance", QString::number(warm_param_config.nLdwDistance));
write_setting("dsm_vel", QString::number(warm_param_config.fDsmVel));
}
void HxDataBase::read_adas_camera_calibration(void)
{
auto value = read_setting("adas_camera_calibration", QString("4527;1830;0;1695;0;1500;6.00;0.00;-0.32;0.00")).split(";");
adas_camera_calibration.fCarLen = value[0].toInt();
adas_camera_calibration.fCarWidth = value[1].toInt();
adas_camera_calibration.fRefCenter = value[2].toInt();
adas_camera_calibration.fRefTop = value[3].toInt();
adas_camera_calibration.fDisLen2Tyre = value[4].toInt();
adas_camera_calibration.fCameraHeight = value[5].toInt();
adas_camera_calibration.fCameraFocus = value[6].toFloat();
adas_camera_calibration.fCameraDx = value[7].toFloat();
adas_camera_calibration.fPitch = value[8].toFloat();
adas_camera_calibration.fYaw = value[9].toFloat();
}
void HxDataBase::write_adas_camera_calibration(void)
{
QStringList value;
value.append(QString::number(adas_camera_calibration.fCarLen));
value.append(QString::number(adas_camera_calibration.fCarWidth));
value.append(QString::number(adas_camera_calibration.fRefCenter));
value.append(QString::number(adas_camera_calibration.fRefTop));
value.append(QString::number(adas_camera_calibration.fDisLen2Tyre));
value.append(QString::number(adas_camera_calibration.fCameraHeight));
value.append(QString::number(adas_camera_calibration.fCameraFocus, 'f', 2));
value.append(QString::number(adas_camera_calibration.fCameraDx, 'f', 2));
value.append(QString::number(adas_camera_calibration.fPitch, 'f', 2));
value.append(QString::number(adas_camera_calibration.fYaw, 'f', 2));
write_setting("adas_camera_calibration", value.join(";"));
}
void HxDataBase::initialization()
{
database = open("DataBase.db", "DataBase");
if (!database.isOpen())
{
qDebug("配置信息创建失败, 程序无法继续启动!");
return;
}
QSqlQuery query(database);
/* 创建 程序配置信息 表 */
if (!query.exec("CREATE TABLE IF NOT EXISTS [Setting] ("
" [name] TEXT NOT NULL PRIMARY KEY,"
" [value] TEXT"
");"))
{
HxLog::append("database", "setting read failed");
return;
}
/* 设备编号 */
device_id = read_setting("device_id", QString("TVIS"));
/* 预录时长 Seconds */
recording_prepend_time = read_setting("recording_prepend_time", 5);
/* FTP信息 */
ftp_address = read_setting("ftp_address", QString("192.168.10.10:7616"));
ftp_username = read_setting("ftp_username", QString("nvruser"));
ftp_password = read_setting("ftp_password", QString("Sztvis_789."));
/* */
qamqp_address = read_setting("qamqp_address", QString("192.168.1.227:5672"));
qamqp_username = read_setting("qamqp_username", QString("root"));
qamqp_password = read_setting("qamqp_password", QString("Sztvis@789."));
/* 算法类型, 默认 BSD */
algorithm_type = read_setting("algorithm_type", 0x01);
/* DSM 视频输入源 (string) */
dsm_video_input_source = read_setting("dsm_video_input_source", QString(""));
/* Adas 视频输入源 (string) */
adas_video_input_source = read_setting("adas_video_input_source", QString(""));
/* BSD 视频输入源 (string) */
bsd_video_input_source = read_setting("bsd_video_input_source", QString(";;;;;;")).split(";");
/* BSD 报警区域 */
bsd_warn_regions = read_setting(
"bsd_warn_regions",
QString("0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*"
"0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*"
"0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*"
"0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*"
"0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*"
"0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0"))
.split("*");
/* 读取报警参数配置 */
read_warm_param_config();
/* 读取 ADAS 相机内外参 */
read_adas_camera_calibration();
/* 报警保护时长 */
alarm_protect_timestamp = read_setting("alarm_protect_timestamp", QString("3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3")).split(";");
}
bool HxDataBase::save_setting()
{
database.transaction();
write_setting("device_id", device_id);
write_setting("recording_prepend_time", QString::number(recording_prepend_time));
write_setting("ftp_address", ftp_address);
write_setting("ftp_username", ftp_username);
write_setting("ftp_password", ftp_password);
write_setting("qamqp_address", qamqp_address);
write_setting("qamqp_username", qamqp_username);
write_setting("qamqp_password", qamqp_password);
write_setting("algorithm_type", QString::number(algorithm_type));
write_setting("dsm_video_input_source", dsm_video_input_source);
write_setting("adas_video_input_source", adas_video_input_source);
write_setting("bsd_video_input_source", bsd_video_input_source.join(";"));
write_setting("bsd_warn_regions", bsd_warn_regions.join("*"));
write_warm_param_config();
write_adas_camera_calibration();
write_setting("alarm_protect_timestamp", alarm_protect_timestamp.join(";"));
return database.commit();
}
/**
* @brief 获取BSD报警区域
* @param channel 通道号
* @return 返回 BsdWarnRegion 结构体
*/
BsdWarnRegion HxDataBase::get_bsd_warn_region(int channel)
{
BsdWarnRegion ret;
auto data = bsd_warn_regions[channel];
if (data == "")
data = "0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0";
auto array = data.split("$");
auto points = array[0].split(" ");
for (int a = 0; a < 4; a++)
{
auto p = points.at(a).split(",");
ret.tFirstRegionPoint[a].x = p[0].toInt();
ret.tFirstRegionPoint[a].y = p[1].toInt();
}
points = array[1].split(" ");
for (int a = 0; a < 4; a++)
{
auto p = points.at(a).split(",");
ret.tSecondRegionPoint[a].x = p[0].toInt();
ret.tSecondRegionPoint[a].y = p[1].toInt();
}
points = array[2].split(" ");
for (int a = 0; a < 4; a++)
{
auto p = points.at(a).split(",");
ret.tThirdRegionPoint[a].x = p[0].toInt();
ret.tThirdRegionPoint[a].y = p[1].toInt();
}
return ret;
}