From b46d2730ccfd100d86eab01c4bae098f15030237 Mon Sep 17 00:00:00 2001 From: zhangwei Date: Sat, 12 Jul 2025 17:16:46 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=B5=E5=B7=9E=E8=A5=BF=E6=B4=8B=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 3 +++ common/AppCommon.h | 2 ++ config/matrix.yaml | 4 ++-- .../ContainerCharacterConversionEngine.cpp | 2 +- engine/ControlEngine/ControlEngine.cpp | 14 ++++++++++++-- .../DetectDivideEngine/ContainerDivideEngine.cpp | 2 +- engine/SaveResultCSVEngine/SaveResultCSVEngine.cpp | 2 +- engine/SelectBestEngine/SelectBestEngine.cpp | 11 ++++++++--- engine/WSServerEngine/WSServerEngine.cpp | 4 ++++ main.cpp | 1 + 10 files changed, 35 insertions(+), 10 deletions(-) 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) {