|
@@ -936,6 +936,10 @@ void SPAServer::threadActPersonWork(FuncActionInfo* RFAInfo)
|
|
2、无权限人员识别:报警判断条件:当判断出区域非法入侵行为时,依据人脸识别结果,判断是否为人脸库人
|
|
2、无权限人员识别:报警判断条件:当判断出区域非法入侵行为时,依据人脸识别结果,判断是否为人脸库人
|
|
员,非人脸库的人员时判断为非法入侵行为(背影需要报警需要结合区域人员检测算法判断)
|
|
员,非人脸库的人员时判断为非法入侵行为(背影需要报警需要结合区域人员检测算法判断)
|
|
3、人员计数和人脸识别数不相等时,判断为非法入侵行为
|
|
3、人员计数和人脸识别数不相等时,判断为非法入侵行为
|
|
|
|
+
|
|
|
|
+ 检测逻辑:
|
|
|
|
+ 1、先检测非法的人脸信息
|
|
|
|
+ 2、再检测人员计数和人脸识别数不相等
|
|
*
|
|
*
|
|
* @param info
|
|
* @param info
|
|
*/
|
|
*/
|
|
@@ -1129,8 +1133,8 @@ void SPAServer::threadActIllegalInvasion(FuncActionInfo* RFAInfo)
|
|
if(insertRet)
|
|
if(insertRet)
|
|
{
|
|
{
|
|
std::string actionName = g_actionList.getActionName(ai.ActionID);
|
|
std::string actionName = g_actionList.getActionName(ai.ActionID);
|
|
- SPDLOG_LOGGER_INFO(m_logger, "☆ 新增报警信息,频道[{}],房间[{}],摄像头[{}],{},{},有{}个区域,有{}个人脸,{}",
|
|
|
|
- pIll->ChannelID, pIll->RoomID, pIll->CameraID, actionName, ai.ActionDes, ai.listBbox, ai.FaceIDList.size(), ai.ImageInfo);
|
|
|
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "☆ 新增报警信息,频道[{}],房间[{}],摄像头[{}],{},{},有{}个区域,有{}个人脸,{}",
|
|
|
|
+ pIll->ChannelID, pIll->RoomID, pIll->CameraID, actionName, ai.ActionDes, ai.listBbox.size(), ai.FaceIDList.size(), ai.ImageInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/* 删除这个非法入侵信息 */
|
|
/* 删除这个非法入侵信息 */
|
|
@@ -1164,22 +1168,28 @@ void SPAServer::threadActRegionalPersonnelDetection(FuncActionInfo* RFAInfo)
|
|
std::shared_ptr<FromRedis> fromRedis = std::make_shared<FromRedis>();
|
|
std::shared_ptr<FromRedis> fromRedis = std::make_shared<FromRedis>();
|
|
/* 创建写入数据库实例 */
|
|
/* 创建写入数据库实例 */
|
|
std::shared_ptr<ToEQMDataBase> toEQMDataBase = std::make_shared<ToEQMDataBase>();
|
|
std::shared_ptr<ToEQMDataBase> toEQMDataBase = std::make_shared<ToEQMDataBase>();
|
|
- /* 局部变量 */
|
|
|
|
|
|
+ /* 局部变量,线程功能需要的信息 */
|
|
std::shared_ptr<FuncActionInfo> pRFAInfo = std::make_shared<FuncActionInfo>();
|
|
std::shared_ptr<FuncActionInfo> pRFAInfo = std::make_shared<FuncActionInfo>();
|
|
*pRFAInfo = *RFAInfo;
|
|
*pRFAInfo = *RFAInfo;
|
|
/* 保存每个摄像机的报警信息 */
|
|
/* 保存每个摄像机的报警信息 */
|
|
std::shared_ptr<std::list<AlarmInfo>> pListAlarmInfo = std::make_shared<std::list<AlarmInfo>>();
|
|
std::shared_ptr<std::list<AlarmInfo>> pListAlarmInfo = std::make_shared<std::list<AlarmInfo>>();
|
|
|
|
+ /* 报警时间段 */
|
|
|
|
+ std::shared_ptr<std::vector<PersonCountRuleInfo>> pPersonCountRuleInfo = std::make_shared<std::vector<PersonCountRuleInfo>>();
|
|
|
|
+
|
|
|
|
+ /* 获取报警规则信息 */
|
|
|
|
+ toEQMDataBase->getPersonCountRuleInfo(*pPersonCountRuleInfo);
|
|
|
|
|
|
while (m_threadRunning)
|
|
while (m_threadRunning)
|
|
{
|
|
{
|
|
- /* 更新线程信息 */
|
|
|
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(g_config.ThreadSleepMS));
|
|
|
|
+ /************ 更新线程信息 ************/
|
|
updateFuncInfo(pRFAInfo);
|
|
updateFuncInfo(pRFAInfo);
|
|
if(pRFAInfo->appFunction == AppFunction::APP_NONE)
|
|
if(pRFAInfo->appFunction == AppFunction::APP_NONE)
|
|
{
|
|
{
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- /* 读取Redis数据 */
|
|
|
|
|
|
+ /************ 读取Redis数据 ************/
|
|
pListAlarmInfo->clear();
|
|
pListAlarmInfo->clear();
|
|
for(const auto& RoomInfo : pRFAInfo->listRoomCamActInfo)
|
|
for(const auto& RoomInfo : pRFAInfo->listRoomCamActInfo)
|
|
{
|
|
{
|
|
@@ -1190,7 +1200,6 @@ void SPAServer::threadActRegionalPersonnelDetection(FuncActionInfo* RFAInfo)
|
|
if(!fromRedis->getRedisString(strKey, strRetValue))
|
|
if(!fromRedis->getRedisString(strKey, strRetValue))
|
|
{
|
|
{
|
|
SPDLOG_LOGGER_ERROR(m_logger, "读取Redis数据失败, Key:{}", strKey);
|
|
SPDLOG_LOGGER_ERROR(m_logger, "读取Redis数据失败, Key:{}", strKey);
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
/* 解析数据 */
|
|
/* 解析数据 */
|
|
@@ -1201,16 +1210,81 @@ void SPAServer::threadActRegionalPersonnelDetection(FuncActionInfo* RFAInfo)
|
|
if(isEventTimeVaild(alarmInfo.EventTime))
|
|
if(isEventTimeVaild(alarmInfo.EventTime))
|
|
{
|
|
{
|
|
SPDLOG_LOGGER_WARN(m_logger, "Redis Key:{} 数据长时间没有更新,EventTime:{}",strKey, alarmInfo.EventTime);
|
|
SPDLOG_LOGGER_WARN(m_logger, "Redis Key:{} 数据长时间没有更新,EventTime:{}",strKey, alarmInfo.EventTime);
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
pListAlarmInfo->push_back(alarmInfo);
|
|
pListAlarmInfo->push_back(alarmInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ /************ 获取报警规则(从数据库更新?) ************/
|
|
|
|
+ if(!toEQMDataBase->getPersonCountRuleInfo(*pPersonCountRuleInfo))
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "《人员计数》获取报警规则失败");
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ if(pPersonCountRuleInfo->size() == 0)
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "《人员计数》无报警规则");
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ /* 获取这个频率的报警信息 */
|
|
|
|
+ PersonCountRuleInfo personCountRuleInfo;
|
|
|
|
+ for(auto& it : *pPersonCountRuleInfo)
|
|
|
|
+ {
|
|
|
|
+ if(it.ChannelID == pRFAInfo->ChannelID)
|
|
|
|
+ {
|
|
|
|
+ personCountRuleInfo = it;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if(personCountRuleInfo.ChannelID < 0)
|
|
|
|
+ {
|
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "《人员计数》获取报警规则失败, ChannelID:{}", pRFAInfo->ChannelID);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ /************ 判断是否在检测时间内 ************/
|
|
|
|
+ QDateTime now = QDateTime::currentDateTime();
|
|
|
|
+ /* 判断检测时间类型 */
|
|
|
|
+ if(personCountRuleInfo.RuleType == 0)
|
|
|
|
+ {
|
|
|
|
+ /* 所有时段 */
|
|
|
|
+ }
|
|
|
|
+ else if(personCountRuleInfo.RuleType == 1)
|
|
|
|
+ {
|
|
|
|
+ /* 按天检测 */
|
|
|
|
+ if(personCountRuleInfo.StartTime <= now && personCountRuleInfo.EndTime >= now)
|
|
|
|
+ {
|
|
|
|
+ /* 在检测时间内 */
|
|
|
|
+ } else
|
|
|
|
+ {
|
|
|
|
+ /* 不在检测时间内 */
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if (personCountRuleInfo.RuleType == 2)
|
|
|
|
+ {
|
|
|
|
+ /* 按周检测 */
|
|
|
|
+ if(personCountRuleInfo.week != now.date().dayOfWeek())
|
|
|
|
+ {
|
|
|
|
+ /* 不在检测时间内 */
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ /* 在检测时间内 */
|
|
|
|
+ if(personCountRuleInfo.StartTime.time() <= now.time() && personCountRuleInfo.EndTime.time() >= now.time())
|
|
|
|
+ {
|
|
|
|
+ /* 在检测时间内 */
|
|
|
|
+ } else
|
|
|
|
+ {
|
|
|
|
+ /* 不在检测时间内 */
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /************ 挨个房间检测人数 ************/
|
|
|
|
|
|
|
|
|
|
- std::this_thread::sleep_for(std::chrono::milliseconds(g_config.ThreadSleepMS));
|
|
|
|
|
|
+ /************ 检测频率直播间 + 导播间房间的人数 ************/
|
|
|
|
+
|
|
}
|
|
}
|
|
setThreadState(pRFAInfo, RunTimeState::RUN_STATE_STOP);
|
|
setThreadState(pRFAInfo, RunTimeState::RUN_STATE_STOP);
|
|
SPDLOG_LOGGER_INFO(m_logger, "关闭 {} 线程,ChannelID:{}", pRFAInfo->strFunctionName, pRFAInfo->ChannelID);
|
|
SPDLOG_LOGGER_INFO(m_logger, "关闭 {} 线程,ChannelID:{}", pRFAInfo->strFunctionName, pRFAInfo->ChannelID);
|