diff --git a/.idea/misc.xml b/.idea/misc.xml
index 79b3c94..0b76fe5 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,7 @@
+
+
+
\ No newline at end of file
diff --git a/common/AppCommon.h b/common/AppCommon.h
index ec27711..821068f 100644
--- a/common/AppCommon.h
+++ b/common/AppCommon.h
@@ -195,5 +195,7 @@ inline int64_t volume(const nvinfer1::Dims& d);
extern std::atomic g_identify_type;
// -1 = 未知方向; 1 = 向左行驶; 2 = 向右行驶
extern std::atomic g_come_direction;
+// 0 = 无车; 1 = 有车;
+extern std::atomic g_car_type;
#endif
diff --git a/config/matrix.yaml b/config/matrix.yaml
index 65d8c2f..4218bd5 100644
--- a/config/matrix.yaml
+++ b/config/matrix.yaml
@@ -10,7 +10,7 @@ engines:
VideoDecodeEngine: 1
VideoDecodeEngine: 2
ControlEngine: 0
-# SaveMoveImageEngine: 0
+ SaveMoveImageEngine: 0
SaveMoveInfoEngine: 0
ContainerStep1InferenceEngine: 0
CornerInferenceEngine: 0
@@ -38,7 +38,7 @@ connects:
ControlEngine_0_1: "ContainerStep1InferenceEngine_0_0 1024"
ControlEngine_0_2: "CornerInferenceEngine_0_0 1024"
ControlEngine_0_3: "SaveMoveInfoEngine_0_0 1024"
- ControlEngine_0_4: "SaveMoveImageEngine_0_0 1024"
+ ControlEngine_0_4: "SaveMoveImageEngine_0_0 1024"
ContainerStep1InferenceEngine_0_0: "Step1MergeEngine_0_0 1024"
CornerInferenceEngine_0_0: "Step1MergeEngine_0_1 1024"
Step1MergeEngine_0_0: "ContainerStep2InferenceEngine_0_0 1024"
diff --git a/engine/CharacterConversionEngine/ContainerCharacterConversionEngine.cpp b/engine/CharacterConversionEngine/ContainerCharacterConversionEngine.cpp
index 436362f..15a359d 100644
--- a/engine/CharacterConversionEngine/ContainerCharacterConversionEngine.cpp
+++ b/engine/CharacterConversionEngine/ContainerCharacterConversionEngine.cpp
@@ -1 +1 @@
-#include "ContainerCharacterConversionEngine.h"
using namespace ai_matrix;
namespace
{
//按照x坐标排列
bool CompareX(const SingleData &v1, const SingleData &v2)
{
return (v1.fLTX < v2.fLTX);
}
//按照y坐标排列
bool CompareY(const SingleData &v1, const SingleData &v2)
{
return (v1.fLTY < v2.fLTY);
}
}
ContainerCharacterConversionEngine::ContainerCharacterConversionEngine() {}
ContainerCharacterConversionEngine::~ContainerCharacterConversionEngine() {}
APP_ERROR ContainerCharacterConversionEngine::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
strPort3_ = engineName_ + "_" + std::to_string(engineId_) + "_3";
this->modelConfig_ = Config::getins()->getModelByContainerStep2Config();
this->baseConfig_ = Config::getins()->getBaseConfig();
LogInfo << "ContainerCharacterConversionEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR ContainerCharacterConversionEngine::DeInit()
{
LogInfo << "ContainerCharacterConversionEngine DeInit ok";
return APP_ERR_OK;
}
/**
* 验证集装箱号是否满足规则(前10位依次与2^0 ~2^9相乘)/11 所得余数,即是校验位)
* inParam : std::string &strContainerNo 集装箱号信息
* outParam: N/A
* return : true(校验通过)/false(校验失败)
*/
bool ContainerCharacterConversionEngine::verifyContainerNo(std::string &strContainerNo)
{
bool bChkFlag = false;
if(strContainerNo.length() != 11)
{
return bChkFlag;
}
int iSum = 0;
for (int i = 0; i < strContainerNo.length()-1; ++i)
{
iSum += this->mapExchange_[strContainerNo.substr(i, 1)] * int(pow(2.0, i));
}
//当校验位等于10时要继续模运算,iSum % 11 % 10,保证最终结果为0~9之间的数
int iChkValue = iSum % 11 % 10;
if (iChkValue == atoi(strContainerNo.substr(strContainerNo.length()-1, 1).c_str()))
{
bChkFlag = true;
}
return bChkFlag;
}
void ContainerCharacterConversionEngine::transContainerType(Step2ResultData &step2ResultData, std::map> &mapLine)
{
TransInfo info;
info.iLine = 1;
//集装箱型号(4位 字母或数字)
if (mapLine.find(3) != mapLine.end())
{
std::string strTemp;
for (auto j = 0; j < mapLine.at(3).size(); j++)
{
strTemp += vecClassNames_.at(mapLine.at(3).at(j).iClassId);
}
int nTypesize = strTemp.length();
nTypesize = nTypesize > 4 ? 4 : nTypesize;
info.strTmpResult = strTemp.substr(0, nTypesize);
}
if (info.strTmpResult.length() != 4)
{
info.bIsChkFlag = false;
}
// step2ResultData.transInfo = info;
}
/**
* 集装箱框内容转换
* inParam : std::map> &mapLine
* outParam: TransSubData &transSubData
* return : N/A
*/
void ContainerCharacterConversionEngine::transContainerNum(Step2ResultData &step2ResultData, std::map> &mapLine)
{
TransInfo info;
info.iLine = 0;
// 箱主代码+设备识别码(4位英文字母)
if (mapLine.find(0) != mapLine.end())
{
std::string strTemp;
for (auto j = 0; j < mapLine.at(0).size(); j++)
{
std::string strOne = this->modelConfig_.vecClass.at(mapLine.at(0).at(j).iClassId);
// 过滤非字母
if (strOne[0] < 'A' || strOne[0] > 'Z')
{
// LogDebug << strOne << " not A-Z in container";
continue;
}
strTemp += strOne;
info.vecValue.emplace_back(strOne);
info.vecScore.emplace_back(mapLine.at(0).at(j).fScore);
step2ResultData.fSubScoreSum += mapLine.at(0).at(j).fScore;
}
info.strTmpResult += strTemp;
}
// 箱号(6位数字)
if (mapLine.find(1) != mapLine.end())
{
std::string strTemp;
for (auto j = 0; j < mapLine.at(1).size(); j++)
{
std::string strOne = this->modelConfig_.vecClass.at(mapLine.at(1).at(j).iClassId);
// 过滤非数字
if (strOne[0] < '0' || strOne[0] > '9')
{
// LogDebug << "engineId:" << engineId_ << " " << strOne << " not digit in num";
continue;
}
strTemp += strOne;
info.vecValue.emplace_back(strOne);
info.vecScore.emplace_back(mapLine.at(1).at(j).fScore);
step2ResultData.fSubScoreSum += mapLine.at(1).at(j).fScore;
}
info.strTmpResult += strTemp;
}
//校验码(1位数字)
if (mapLine.find(2) != mapLine.end())
{
std::string strTemp;
for (auto j = 0; j < mapLine.at(2).size(); j++)
{
//过滤非数字
std::string strOne = this->modelConfig_.vecClass.at(mapLine.at(2).at(j).iClassId);
if (strOne[0] < '0' || strOne[0] > '9')
{
// LogDebug << "engineId:" << engineId_ << " " << strOne << " not digit in container_2";
continue;
}
strTemp += strOne;
info.vecValue.emplace_back(strOne);
info.vecScore.emplace_back(mapLine.at(2).at(j).fScore);
step2ResultData.fSubScoreSum += mapLine.at(2).at(j).fScore;
}
info.strTmpResult += strTemp;
}
if (this->verifyContainerNo(info.strTmpResult))
{
info.bIsChkFlag = true;
}
else
{
info.strTmpResult = "invalid-" + info.strTmpResult;
}
step2ResultData.transInfo = info;
}
APP_ERROR ContainerCharacterConversionEngine::Process()
{
int iRet = APP_ERR_OK;
while (!isStop_)
{
std::shared_ptr pVoidData0 = nullptr;
inputQueMap_[strPort0_]->pop(pVoidData0);
if (nullptr == pVoidData0)
{
usleep(1000); //1ms
continue;
}
std::shared_ptr pVStep2OutputData = std::static_pointer_cast(pVoidData0);
std::shared_ptr pSaveDebugImgData = std::make_shared();
pSaveDebugImgData->iFrameId = pVStep2OutputData->iFrameId;
pSaveDebugImgData->iDataSource = pVStep2OutputData->iDataSource;
pSaveDebugImgData->strDetectDate = pVStep2OutputData->strDetectDate;
pSaveDebugImgData->strDetectTime = pVStep2OutputData->strDetectTime;
pSaveDebugImgData->cvImage = pVStep2OutputData->cvImage.clone();
pSaveDebugImgData->step2ResultData = pVStep2OutputData->step2ResultData;
pSaveDebugImgData->vecCornerResultData = pVStep2OutputData->vecCornerResultData;
if (pVStep2OutputData->bIsEnd)
{
outputQueMap_[engineName_ + "_" + std::to_string(engineId_) + "_" + std::to_string(pVStep2OutputData->iDataSource)]->push(std::static_pointer_cast(pVStep2OutputData), true);
// outputQueMap_[strPort3_]->push(std::static_pointer_cast(pSaveDebugImgData), true);
continue;
}
std::vector vecSingleData = pVStep2OutputData->step2ResultData.vecSingleData;
if (pVStep2OutputData->step2ResultData.fScore == 0.0f)
{
outputQueMap_[engineName_ + "_" + std::to_string(engineId_) + "_" + std::to_string(pVStep2OutputData->iDataSource)]->push(std::static_pointer_cast(pVStep2OutputData), true);
// outputQueMap_[strPort3_]->push(std::static_pointer_cast(pSaveDebugImgData), true);
continue;
}
std::map> mapLine;
for (auto & it_singleData : vecSingleData)
{
mapLine[it_singleData.iLine].push_back(it_singleData);
}
bool bSortByX =
(pVStep2OutputData->step2ResultData.fRBY - pVStep2OutputData->step2ResultData.fLTY) <
((pVStep2OutputData->step2ResultData.fRBX - pVStep2OutputData->step2ResultData.fLTX) *
1.5);
//每一行按x坐标排序
for (auto & it : mapLine)
{
if (it.second.size() > 2)
{
std::set setX;
std::set setY;
for (auto & it_singleData : it.second)
{
setX.insert(it_singleData.fLTX);
setY.insert(it_singleData.fLTY);
}
float X = *setX.rbegin() - *setX.begin();
float Y = *setY.rbegin() - *setY.begin();
bSortByX = (X > Y);
}
if (bSortByX)
{
std::sort(it.second.begin(), it.second.end(), CompareX);
}
else
{
std::sort(it.second.begin(), it.second.end(), CompareY);
}
// std::string strTemp;
// for (auto & it_singleData : it.second)
// {
// strTemp += this->modelConfig_.vecClass.at(it_singleData.iClassId);
// }
}
switch (pVStep2OutputData->step2ResultData.iClassId)
{
case 0:
this->transContainerNum(pVStep2OutputData->step2ResultData, mapLine);
break;
default:
break;
}
// 模型识别不稳定时才用。
// if (bSortByX && pVStep2OutputData->step2ResultData.transInfo.bIsChkFlag)
// {
// if (mapLine.find(0) != mapLine.end() && mapLine.find(1) != mapLine.end())
// {
// if (mapLine.at(1).at(0).fLTX < mapLine.at(0).at(0).fLTX)
// {
// pVStep2OutputData->step2ResultData.transInfo.strTmpResult = "invalid-" + pVStep2OutputData->step2ResultData.transInfo.strTmpResult;
// pVStep2OutputData->step2ResultData.transInfo.bIsChkFlag = false;
// }
// }
// }
pSaveDebugImgData->step2ResultData = pVStep2OutputData->step2ResultData;
outputQueMap_[engineName_ + "_" + std::to_string(engineId_) + "_" + std::to_string(pVStep2OutputData->iDataSource)]->push(std::static_pointer_cast(pVStep2OutputData), true);
// outputQueMap_[strPort3_]->push(std::static_pointer_cast(pSaveDebugImgData), true);
}
return APP_ERR_OK;
}
\ No newline at end of file
+#include "ContainerCharacterConversionEngine.h"
using namespace ai_matrix;
namespace
{
//按照x坐标排列
bool CompareX(const SingleData &v1, const SingleData &v2)
{
return (v1.fLTX < v2.fLTX);
}
//按照y坐标排列
bool CompareY(const SingleData &v1, const SingleData &v2)
{
return (v1.fLTY < v2.fLTY);
}
}
ContainerCharacterConversionEngine::ContainerCharacterConversionEngine() {}
ContainerCharacterConversionEngine::~ContainerCharacterConversionEngine() {}
APP_ERROR ContainerCharacterConversionEngine::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
strPort3_ = engineName_ + "_" + std::to_string(engineId_) + "_3";
this->modelConfig_ = Config::getins()->getModelByContainerStep2Config();
this->baseConfig_ = Config::getins()->getBaseConfig();
LogInfo << "ContainerCharacterConversionEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR ContainerCharacterConversionEngine::DeInit()
{
LogInfo << "ContainerCharacterConversionEngine DeInit ok";
return APP_ERR_OK;
}
/**
* 验证集装箱号是否满足规则(前10位依次与2^0 ~2^9相乘)/11 所得余数,即是校验位)
* inParam : std::string &strContainerNo 集装箱号信息
* outParam: N/A
* return : true(校验通过)/false(校验失败)
*/
bool ContainerCharacterConversionEngine::verifyContainerNo(std::string &strContainerNo)
{
bool bChkFlag = false;
if(strContainerNo.length() != 11)
{
return bChkFlag;
}
int iSum = 0;
for (int i = 0; i < strContainerNo.length()-1; ++i)
{
iSum += this->mapExchange_[strContainerNo.substr(i, 1)] * int(pow(2.0, i));
}
//当校验位等于10时要继续模运算,iSum % 11 % 10,保证最终结果为0~9之间的数
int iChkValue = iSum % 11 % 10;
if (iChkValue == atoi(strContainerNo.substr(strContainerNo.length()-1, 1).c_str()))
{
bChkFlag = true;
}
return bChkFlag;
}
void ContainerCharacterConversionEngine::transContainerType(Step2ResultData &step2ResultData, std::map> &mapLine)
{
TransInfo info;
info.iLine = 1;
//集装箱型号(4位 字母或数字)
if (mapLine.find(3) != mapLine.end())
{
std::string strTemp;
for (auto j = 0; j < mapLine.at(3).size(); j++)
{
strTemp += vecClassNames_.at(mapLine.at(3).at(j).iClassId);
}
int nTypesize = strTemp.length();
nTypesize = nTypesize > 4 ? 4 : nTypesize;
info.strTmpResult = strTemp.substr(0, nTypesize);
}
if (info.strTmpResult.length() != 4)
{
info.bIsChkFlag = false;
}
// step2ResultData.transInfo = info;
}
/**
* 集装箱框内容转换
* inParam : std::map> &mapLine
* outParam: TransSubData &transSubData
* return : N/A
*/
void ContainerCharacterConversionEngine::transContainerNum(Step2ResultData &step2ResultData, std::map> &mapLine)
{
TransInfo info;
info.iLine = 0;
// 箱主代码+设备识别码(4位英文字母)
if (mapLine.find(0) != mapLine.end())
{
std::string strTemp;
for (auto j = 0; j < mapLine.at(0).size(); j++)
{
std::string strOne = this->modelConfig_.vecClass.at(mapLine.at(0).at(j).iClassId);
// 过滤非字母
if (strOne[0] < 'A' || strOne[0] > 'Z')
{
// LogDebug << strOne << " not A-Z in container";
continue;
}
strTemp += strOne;
info.vecValue.emplace_back(strOne);
info.vecScore.emplace_back(mapLine.at(0).at(j).fScore);
step2ResultData.fSubScoreSum += mapLine.at(0).at(j).fScore;
}
info.strTmpResult += strTemp;
}
// 箱号(6位数字)
if (mapLine.find(1) != mapLine.end())
{
std::string strTemp;
for (auto j = 0; j < mapLine.at(1).size(); j++)
{
std::string strOne = this->modelConfig_.vecClass.at(mapLine.at(1).at(j).iClassId);
// 过滤非数字
if (strOne[0] < '0' || strOne[0] > '9')
{
// LogDebug << "engineId:" << engineId_ << " " << strOne << " not digit in num";
continue;
}
strTemp += strOne;
info.vecValue.emplace_back(strOne);
info.vecScore.emplace_back(mapLine.at(1).at(j).fScore);
step2ResultData.fSubScoreSum += mapLine.at(1).at(j).fScore;
}
info.strTmpResult += strTemp;
}
//校验码(1位数字)
if (mapLine.find(2) != mapLine.end())
{
std::string strTemp;
for (auto j = 0; j < mapLine.at(2).size(); j++)
{
//过滤非数字
std::string strOne = this->modelConfig_.vecClass.at(mapLine.at(2).at(j).iClassId);
if (strOne[0] < '0' || strOne[0] > '9')
{
// LogDebug << "engineId:" << engineId_ << " " << strOne << " not digit in container_2";
continue;
}
strTemp += strOne;
info.vecValue.emplace_back(strOne);
info.vecScore.emplace_back(mapLine.at(2).at(j).fScore);
step2ResultData.fSubScoreSum += mapLine.at(2).at(j).fScore;
}
info.strTmpResult += strTemp;
}
if (this->verifyContainerNo(info.strTmpResult))
{
info.bIsChkFlag = true;
}
else
{
info.strTmpResult = "invalid-" + info.strTmpResult;
}
step2ResultData.transInfo = info;
}
APP_ERROR ContainerCharacterConversionEngine::Process()
{
int iRet = APP_ERR_OK;
while (!isStop_)
{
std::shared_ptr pVoidData0 = nullptr;
inputQueMap_[strPort0_]->pop(pVoidData0);
if (nullptr == pVoidData0)
{
usleep(1000); //1ms
continue;
}
std::shared_ptr pVStep2OutputData = std::static_pointer_cast(pVoidData0);
std::shared_ptr pSaveDebugImgData = std::make_shared();
pSaveDebugImgData->iFrameId = pVStep2OutputData->iFrameId;
pSaveDebugImgData->iDataSource = pVStep2OutputData->iDataSource;
pSaveDebugImgData->strDetectDate = pVStep2OutputData->strDetectDate;
pSaveDebugImgData->strDetectTime = pVStep2OutputData->strDetectTime;
pSaveDebugImgData->cvImage = pVStep2OutputData->cvImage.clone();
pSaveDebugImgData->step2ResultData = pVStep2OutputData->step2ResultData;
pSaveDebugImgData->vecCornerResultData = pVStep2OutputData->vecCornerResultData;
if (pVStep2OutputData->bIsEnd)
{
// LogInfo << " --->>> 结束信号 : " << pVStep2OutputData->iDataSource;
outputQueMap_[engineName_ + "_" + std::to_string(engineId_) + "_" + std::to_string(pVStep2OutputData->iDataSource)]->push(std::static_pointer_cast(pVStep2OutputData), true);
// outputQueMap_[strPort3_]->push(std::static_pointer_cast(pSaveDebugImgData), true);
continue;
}
std::vector vecSingleData = pVStep2OutputData->step2ResultData.vecSingleData;
if (pVStep2OutputData->step2ResultData.fScore == 0.0f)
{
outputQueMap_[engineName_ + "_" + std::to_string(engineId_) + "_" + std::to_string(pVStep2OutputData->iDataSource)]->push(std::static_pointer_cast(pVStep2OutputData), true);
// outputQueMap_[strPort3_]->push(std::static_pointer_cast(pSaveDebugImgData), true);
continue;
}
std::map> mapLine;
for (auto & it_singleData : vecSingleData)
{
mapLine[it_singleData.iLine].push_back(it_singleData);
}
bool bSortByX =
(pVStep2OutputData->step2ResultData.fRBY - pVStep2OutputData->step2ResultData.fLTY) <
((pVStep2OutputData->step2ResultData.fRBX - pVStep2OutputData->step2ResultData.fLTX) *
1.5);
//每一行按x坐标排序
for (auto & it : mapLine)
{
if (it.second.size() > 2)
{
std::set setX;
std::set setY;
for (auto & it_singleData : it.second)
{
setX.insert(it_singleData.fLTX);
setY.insert(it_singleData.fLTY);
}
float X = *setX.rbegin() - *setX.begin();
float Y = *setY.rbegin() - *setY.begin();
bSortByX = (X > Y);
}
if (bSortByX)
{
std::sort(it.second.begin(), it.second.end(), CompareX);
}
else
{
std::sort(it.second.begin(), it.second.end(), CompareY);
}
// std::string strTemp;
// for (auto & it_singleData : it.second)
// {
// strTemp += this->modelConfig_.vecClass.at(it_singleData.iClassId);
// }
}
switch (pVStep2OutputData->step2ResultData.iClassId)
{
case 0:
this->transContainerNum(pVStep2OutputData->step2ResultData, mapLine);
break;
default:
break;
}
// 模型识别不稳定时才用。
// if (bSortByX && pVStep2OutputData->step2ResultData.transInfo.bIsChkFlag)
// {
// if (mapLine.find(0) != mapLine.end() && mapLine.find(1) != mapLine.end())
// {
// if (mapLine.at(1).at(0).fLTX < mapLine.at(0).at(0).fLTX)
// {
// pVStep2OutputData->step2ResultData.transInfo.strTmpResult = "invalid-" + pVStep2OutputData->step2ResultData.transInfo.strTmpResult;
// pVStep2OutputData->step2ResultData.transInfo.bIsChkFlag = false;
// }
// }
// }
pSaveDebugImgData->step2ResultData = pVStep2OutputData->step2ResultData;
outputQueMap_[engineName_ + "_" + std::to_string(engineId_) + "_" + std::to_string(pVStep2OutputData->iDataSource)]->push(std::static_pointer_cast(pVStep2OutputData), true);
// outputQueMap_[strPort3_]->push(std::static_pointer_cast(pSaveDebugImgData), true);
}
return APP_ERR_OK;
}
\ No newline at end of file
diff --git a/engine/ControlEngine/ControlEngine.cpp b/engine/ControlEngine/ControlEngine.cpp
index 14dc312..3793f62 100644
--- a/engine/ControlEngine/ControlEngine.cpp
+++ b/engine/ControlEngine/ControlEngine.cpp
@@ -72,7 +72,7 @@ void ControlEngine::endIdentify(int iDataSource)
void ControlEngine::sendWSEngine(std::string msg)
{
- msg = "{\"status\":\"normal\",\"msg\":" + msg +"}";
+ msg = "{\"containerNo\":\"\",\"detectDate\":\"\",\"detectTime\":\"\",\"id\":\"\",\"images\":\"\",\"imagesDir\":\"\",\"status\":\"normal\",\"msg\":\"" + msg +"\"}";
// 传给websocket引擎
outputQueMap_[strPort0_]->push(std::static_pointer_cast(std::make_shared(msg)));
}
@@ -132,6 +132,7 @@ void ControlEngine::detectControl(std::shared_ptr pWSServerOrder)
break;
}
this->mapIdentifyType_ = {{0, IDENTIFY_START}, {1, IDENTIFY_START}, {2, IDENTIFY_START}};
+ g_car_type = 1;
break;
case IDENTIFY_STOP:
if (!this->isDetecting())
@@ -142,6 +143,7 @@ void ControlEngine::detectControl(std::shared_ptr pWSServerOrder)
break;
}
this->mapIdentifyType_ = {{0, IDENTIFY_INIT}, {1, IDENTIFY_INIT}, {2, IDENTIFY_INIT}};
+ g_car_type = 0;
break;
case IDENTIFY_RECORD:
if (!jvOrder.isMember("containerNo"))
@@ -190,6 +192,14 @@ APP_ERROR ControlEngine::Process()
if (pProcessData->bIsEnd)
{
if (!this->isDetecting()) continue;
+// if (this->strDetectDate_.empty())
+// {
+// std::string msg = "数据源:" + std::to_string(pProcessData->iDataSource) + " 摄像头读取画面失败,停止识别!";
+// this->sendWSEngine(msg);
+// this->mapIdentifyType_[pProcessData->iDataSource] = IDENTIFY_INIT;
+// continue;
+// }
+
this->endIdentify(pProcessData->iDataSource);
LogInfo << "数据源:" << pProcessData->iDataSource << " 画面读取结束:停止识别!";
continue;
@@ -267,7 +277,7 @@ APP_ERROR ControlEngine::Process()
pSaveImgData->bIsEnd = pProcessData->bIsEnd;
outputQueMap_[strPort4_]->push(std::static_pointer_cast(pSaveImgData), true);
-
+
}
}
diff --git a/engine/DetectDivideEngine/ContainerDivideEngine.cpp b/engine/DetectDivideEngine/ContainerDivideEngine.cpp
index bc4dc8a..b3693cd 100644
--- a/engine/DetectDivideEngine/ContainerDivideEngine.cpp
+++ b/engine/DetectDivideEngine/ContainerDivideEngine.cpp
@@ -384,7 +384,7 @@ APP_ERROR ContainerDivideEngine::Process()
if (pVStep2OutputData->bIsEnd)
{
- if (this->bLastIsEnd == pVStep2OutputData->bIsEnd) continue;
+// if (this->bLastIsEnd == pVStep2OutputData->bIsEnd) continue;
std::shared_ptr pVSelectBestData = std::make_shared();
pVSelectBestData->bIsEnd = true;
diff --git a/engine/SaveResultCSVEngine/SaveResultCSVEngine.cpp b/engine/SaveResultCSVEngine/SaveResultCSVEngine.cpp
index 0b3af76..566f5a6 100644
--- a/engine/SaveResultCSVEngine/SaveResultCSVEngine.cpp
+++ b/engine/SaveResultCSVEngine/SaveResultCSVEngine.cpp
@@ -1 +1 @@
-#include "SaveResultCSVEngine.h"
using namespace ai_matrix;
SaveResultCSVEngine::SaveResultCSVEngine() {}
SaveResultCSVEngine::~SaveResultCSVEngine() {}
APP_ERROR SaveResultCSVEngine::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1";
this->baseConfig_ = Config::getins()->getBaseConfig();
LogInfo << "SaveResultCSVEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR SaveResultCSVEngine::DeInit()
{
LogInfo << "SaveResultCSVEngine DeInit ok";
return APP_ERR_OK;
}
/**
* 保存车厢的最优结果到CSV中
* inParam : std::shared_ptr pTrain :列车信息
* outParam:
* return : true/false
*/
bool SaveResultCSVEngine::saveTrainCsv(std::shared_ptr pDetectResultData)
{
//1. 创建保存路径 (固定路径/YYYY-MM-DD/hh-mm-ss/)
if (!FileUtil::getins()->createDirPath(this->baseConfig_.strResultPath))
{
LogError << "日期:" << pDetectResultData->strDetectDate << " csv save err";
return false;
}
//2. 保存csv
std::string strCsvName = pDetectResultData->strDetectDate + ".csv";
std::string strCsvPath = this->baseConfig_.strResultPath + "/"
+ pDetectResultData->strDetectDate + "/"
+ strCsvName;
LogInfo << strCsvPath;
bool bIsExsit = false;
if (access(strCsvPath.c_str(), F_OK) != -1)
{
bIsExsit = true;
}
try
{
// 写文件
std::ofstream outFile;
outFile.open(strCsvPath, std::ios::app);
if (!bIsExsit)
{
outFile << "Time" << ','
<< "Container" << ','
<< "Image"
<< std::endl;
}
std::string strContainerNo;
for (const auto & containerNo_it : pDetectResultData->vecContainerNO)
{
strContainerNo += "[";
strContainerNo += containerNo_it;
strContainerNo += "]";
}
std::string strImage;
for (const auto & image_it : pDetectResultData->vecImage)
{
strImage += "[";
strImage += image_it;
strImage += "]";
std::string strDebugImage = this->baseConfig_.strDebugResultPath + "/"
+ pDetectResultData->strDetectDate + "/"
+ StringUtil::getins()->replace_all_distinct(pDetectResultData->strDetectTime, ":", "-")
+ "/" + image_it;
std::string strResultImage = this->baseConfig_.strResultPath + "/"
+ pDetectResultData->strDetectDate + "/"
+ StringUtil::getins()->replace_all_distinct(pDetectResultData->strDetectTime, ":", "-")
+ "/" + image_it;
FileUtil::getins()->copyFile(strDebugImage, strResultImage);
}
outFile << pDetectResultData->strDetectTime << ','
<< strContainerNo << ','
<< strImage << ','
<< std::endl;
outFile.close();
}
catch (const std::exception &)
{
LogError << "strCsvPath:" << strCsvPath << " train savecsv fail!";
return false;
}
return true;
}
APP_ERROR SaveResultCSVEngine::Process()
{
int iRet = APP_ERR_OK;
while (!isStop_)
{
//pop端口0 车厢信息
std::shared_ptr pVoidData0 = nullptr;
iRet = inputQueMap_[strPort0_]->pop(pVoidData0);
if (nullptr == pVoidData0)
{
usleep(1000);
continue;
}
std::shared_ptr pDetectResultData = std::static_pointer_cast(pVoidData0);
this->saveTrainCsv(pDetectResultData);
}
return APP_ERR_OK;
}
\ No newline at end of file
+#include "SaveResultCSVEngine.h"
using namespace ai_matrix;
SaveResultCSVEngine::SaveResultCSVEngine() {}
SaveResultCSVEngine::~SaveResultCSVEngine() {}
APP_ERROR SaveResultCSVEngine::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1";
this->baseConfig_ = Config::getins()->getBaseConfig();
LogInfo << "SaveResultCSVEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR SaveResultCSVEngine::DeInit()
{
LogInfo << "SaveResultCSVEngine DeInit ok";
return APP_ERR_OK;
}
/**
* 保存车厢的最优结果到CSV中
* inParam : std::shared_ptr pTrain :列车信息
* outParam:
* return : true/false
*/
bool SaveResultCSVEngine::saveTrainCsv(std::shared_ptr pDetectResultData)
{
//1. 创建保存路径 (固定路径/YYYY-MM-DD/hh-mm-ss/)
if (!FileUtil::getins()->createDirPath(this->baseConfig_.strResultPath))
{
LogError << "日期:" << pDetectResultData->strDetectDate << " csv save err";
return false;
}
if (pDetectResultData->strDetectDate.empty())
{
return true;
}
//2. 保存csv
std::string strCsvName = pDetectResultData->strDetectDate + ".csv";
std::string strCsvPath = this->baseConfig_.strResultPath + "/"
+ pDetectResultData->strDetectDate + "/"
+ strCsvName;
// LogInfo << strCsvPath;
bool bIsExsit = false;
if (access(strCsvPath.c_str(), F_OK) != -1)
{
bIsExsit = true;
}
try
{
// 写文件
std::ofstream outFile;
outFile.open(strCsvPath, std::ios::app);
if (!bIsExsit)
{
outFile << "Time" << ','
<< "Container" << ','
<< "Image"
<< std::endl;
}
std::string strContainerNo;
for (const auto & containerNo_it : pDetectResultData->vecContainerNO)
{
strContainerNo += "[";
strContainerNo += containerNo_it;
strContainerNo += "]";
}
std::string strImage;
for (const auto & image_it : pDetectResultData->vecImage)
{
strImage += "[";
strImage += image_it;
strImage += "]";
std::string strDebugImage = this->baseConfig_.strDebugResultPath + "/"
+ pDetectResultData->strDetectDate + "/"
+ StringUtil::getins()->replace_all_distinct(pDetectResultData->strDetectTime, ":", "-")
+ "/" + image_it;
std::string strResultImage = this->baseConfig_.strResultPath + "/"
+ pDetectResultData->strDetectDate + "/"
+ StringUtil::getins()->replace_all_distinct(pDetectResultData->strDetectTime, ":", "-")
+ "/" + image_it;
FileUtil::getins()->copyFile(strDebugImage, strResultImage);
}
outFile << pDetectResultData->strDetectTime << ','
<< strContainerNo << ','
<< strImage << ','
<< std::endl;
outFile.close();
}
catch (const std::exception &)
{
LogError << "strCsvPath:" << strCsvPath << " train savecsv fail!";
return false;
}
return true;
}
APP_ERROR SaveResultCSVEngine::Process()
{
int iRet = APP_ERR_OK;
while (!isStop_)
{
//pop端口0 车厢信息
std::shared_ptr pVoidData0 = nullptr;
iRet = inputQueMap_[strPort0_]->pop(pVoidData0);
if (nullptr == pVoidData0)
{
usleep(1000);
continue;
}
std::shared_ptr pDetectResultData = std::static_pointer_cast(pVoidData0);
this->saveTrainCsv(pDetectResultData);
}
return APP_ERR_OK;
}
\ No newline at end of file
diff --git a/engine/SelectBestEngine/SelectBestEngine.cpp b/engine/SelectBestEngine/SelectBestEngine.cpp
index e30c442..f3e7680 100644
--- a/engine/SelectBestEngine/SelectBestEngine.cpp
+++ b/engine/SelectBestEngine/SelectBestEngine.cpp
@@ -49,7 +49,6 @@ void SelectBestEngine::sendWSServer(DetectResultData &detectResultData)
std::string data;
Json::Value jsonData;
- strImageDir = detectResultData.strDetectDate + "/" + ai_matrix::StringUtil::getins()->replace_all_distinct(detectResultData.strDetectTime, ":", "-") + "/";
for (int i = 0; i < detectResultData.vecImage.size(); ++i)
{
strImage += detectResultData.vecImage[i];
@@ -58,7 +57,11 @@ void SelectBestEngine::sendWSServer(DetectResultData &detectResultData)
strImage += ",";
}
}
-
+ if (!detectResultData.vecImage.empty())
+ {
+ LogInfo << " 图片数: " << detectResultData.vecImage.size();
+ strImageDir = detectResultData.strDetectDate + "/" + ai_matrix::StringUtil::getins()->replace_all_distinct(detectResultData.strDetectTime, ":", "-") + "/";
+ }
std::string strContainerNo;
for (int i = 0; i < detectResultData.vecContainerNO.size(); ++i)
@@ -217,6 +220,7 @@ APP_ERROR SelectBestEngine::Process()
this->strDetectTime_ = pVSelectBestData->strDetectTime;
}
+ LogInfo << " --- >>> " << this->iEndCount_ << " 数据源: " << pVSelectBestData->iDataSource;
this->iEndCount_++;
if (!(this->iEndCount_ % this->vecDataSourceConfig_.size()))
{
@@ -225,7 +229,8 @@ APP_ERROR SelectBestEngine::Process()
}
continue;
}
- this->iEndCount_ = 0;
+ LogInfo << " --- >>> 有数据 数据源: " << pVSelectBestData->iDataSource;
+ if (g_car_type) this->iEndCount_ = 0;
if (this->strImagePath_.empty())
{
diff --git a/engine/WSServerEngine/WSServerEngine.cpp b/engine/WSServerEngine/WSServerEngine.cpp
index e88228e..6f09777 100644
--- a/engine/WSServerEngine/WSServerEngine.cpp
+++ b/engine/WSServerEngine/WSServerEngine.cpp
@@ -143,10 +143,14 @@ void WSServerEngine::stop()
std::string WSServerEngine::onCMD(CMDConnData &conn, int argc, const char **argv)
{
std::string msg = argv[0];
+
+ if (msg == "heartbeat") return "";
+
std::string strShow = "VCarContainer 收到 " + conn.ip + " 的信息:" + msg;
LogInfo << strShow;
outputQueMap_[strPort0_]->push(std::static_pointer_cast(std::make_shared(msg)), true);
this->sendAllClient(strShow);
+ return "";
}
void WSServerEngine::sendAllClient(const std::string &msg)
diff --git a/main.cpp b/main.cpp
index b25dd45..9bee8c0 100644
--- a/main.cpp
+++ b/main.cpp
@@ -28,6 +28,7 @@ std::atomic_bool app_flag(true);
std::atomic g_identify_type(0);
std::atomic g_come_direction(0);
+std::atomic g_car_type(0);
void SigHandler(int iSigno)
{