605 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			605 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | #include "SelectBestContainerEngine_NEW.h"
 | |||
|  | #include "myutils.h"
 | |||
|  | 
 | |||
|  | #define CONTAINER_LEN  11
 | |||
|  | 
 | |||
|  | using namespace ai_matrix; | |||
|  | 
 | |||
|  | 
 | |||
|  | SelectBestContainerEngine_NEW::SelectBestContainerEngine_NEW() {} | |||
|  | 
 | |||
|  | SelectBestContainerEngine_NEW::~SelectBestContainerEngine_NEW() {} | |||
|  | 
 | |||
|  | APP_ERROR SelectBestContainerEngine_NEW::Init() | |||
|  | { | |||
|  |     strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0"; | |||
|  |     strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1"; | |||
|  | 
 | |||
|  |     //获取几个摄像头识别集装箱
 | |||
|  |     std::map<int, ai_matrix::DataSourceConfig> mapUseDataSouceCfg = MyYaml::GetIns()->GetUseDataSourceConfig(); | |||
|  |     for (auto iter = mapUseDataSouceCfg.begin(); iter != mapUseDataSouceCfg.end(); iter++) | |||
|  |     { | |||
|  |         if (iter->second.strTarget.find("CONTAINER") != std::string::npos) | |||
|  |         { | |||
|  |             LogDebug << "DataSource:" << iter->first << " deal CONTAINER"; | |||
|  |             mapDataSourceIsEnd_[iter->first] = false; | |||
|  | 
 | |||
|  |             if (iter->second.strTarget.find("CONTAINER_T") != std::string::npos) | |||
|  |             { | |||
|  |                 setTopContainerSid_.insert(iter->first); | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     InitParam(); | |||
|  |     LogInfo << "SelectBestContainerEngine_NEW Init ok"; | |||
|  |     return APP_ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | APP_ERROR SelectBestContainerEngine_NEW::DeInit() | |||
|  | { | |||
|  |     LogInfo << "SelectBestContainerEngine_NEW DeInit ok"; | |||
|  |     return APP_ERR_OK; | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | * 初始化参数信息 | |||
|  | * inParam : N/A | |||
|  | * outParam: N/A | |||
|  | * return  : N/A | |||
|  | */ | |||
|  | void SelectBestContainerEngine_NEW::InitParam() | |||
|  | { | |||
|  |     for (auto iter = mapDataSourceIsEnd_.begin(); iter != mapDataSourceIsEnd_.end(); iter++) | |||
|  |     { | |||
|  |         iter->second = false; | |||
|  |     } | |||
|  |     mapSidContainers0_.clear(); | |||
|  |     mapSidConBest0_.clear(); | |||
|  |     mapStep1Pre0_.clear(); | |||
|  |     mapSecondFlag0_.clear(); | |||
|  | 
 | |||
|  |     mapSidContainers1_.clear(); | |||
|  |     mapSidConBest1_.clear(); | |||
|  |     mapStep1Pre1_.clear(); | |||
|  |     mapSecondFlag1_.clear(); | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | * 验证集装箱号是否满足规则(前10位依次与2^0 ~2^9相乘)/11 所得余数,即是校验位) | |||
|  | * inParam : std::string &strContainerNo   集装箱号信息  | |||
|  | * outParam: N/A | |||
|  | * return  : true(校验通过)/false(校验失败) | |||
|  | */ | |||
|  | bool SelectBestContainerEngine_NEW::VerifyContainerNo(std::string &strContainerNo) | |||
|  | { | |||
|  |     bool bChkFlag = false; | |||
|  | 
 | |||
|  |     if(strContainerNo.length() != CONTAINER_LEN) | |||
|  |     { | |||
|  |         return bChkFlag; | |||
|  |     } | |||
|  | 
 | |||
|  |     int iSum = 0; | |||
|  |     for (int i = 0; i < strContainerNo.length()-1; ++i) | |||
|  |     { | |||
|  |         iSum += 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; | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | * 构造最优集装箱信息 | |||
|  | * inParam : N/A | |||
|  | * outParam: N/A | |||
|  | * return  : N/A | |||
|  | */ | |||
|  | void SelectBestContainerEngine_NEW::MakeBestContainer(Container &containerBest, | |||
|  |                                                   TransSubData *pTransSubData, | |||
|  |                                                   std::shared_ptr<ProcessData> pProcessData) | |||
|  | { | |||
|  |     containerBest.iDataSource = pProcessData->iDataSource; | |||
|  |     containerBest.i64TimeStamp = pProcessData->i64TimeStamp; | |||
|  |     containerBest.bIsEnd = pProcessData->bIsEnd; | |||
|  |     containerBest.strTrainDate = pProcessData->strTrainDate; | |||
|  |     containerBest.strTrainName = pProcessData->strTrainName; | |||
|  |     containerBest.step1Location = pTransSubData->step1Location; | |||
|  |     containerBest.strBestImg = std::to_string(pProcessData->iFrameId) + ".jpg"; | |||
|  |     containerBest.fScoreSum = pTransSubData->fScoreSum; | |||
|  |     containerBest.strContainerNo = pTransSubData->strAllValue; | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | /**
 | |||
|  | * 识别成功和失败中选取最优结果 | |||
|  | * inParam : std::shared_ptr<TrainContainer> pTrainContainer     选优结果 | |||
|  | * outParam: N/A | |||
|  | * return  : N/A | |||
|  | */ | |||
|  | void SelectBestContainerEngine_NEW::DealContainer(std::shared_ptr<ProcessData> pProcessData, TransSubData &transSubData,  | |||
|  |                                               std::map<int, std::map<int, std::vector<Container>>> &mapSidContainers,  | |||
|  |                                               std::map<int, Step1Location> &mapStep1Pre, std::map<int, bool> &mapSecondFlag) | |||
|  | { | |||
|  |     /*
 | |||
|  |     mapStep1Pre先保存第1个箱号上一帧识别结果的大框信息。当识别大框信息和保存上一个识别信息间隔大于画面一半时, | |||
|  |     则说明识别到了第2个箱号,此时mapStep1Pre保存第2个箱号的上一帧的大框信息。 | |||
|  | 
 | |||
|  |     mapStep1Pre保存的第1个箱号时 | |||
|  |         和前帧识别大框间隔小于画面一半时,则属于第1个箱号,否则属于第2个箱号 | |||
|  |     mapStep1Pre保存的第2个箱号时 | |||
|  |         和前帧识别大框间隔小于画面一半时,则属于第2个箱号,否则属于第1个箱号 | |||
|  |     */ | |||
|  |     if (mapStep1Pre.find(pProcessData->iDataSource) == mapStep1Pre.end()) | |||
|  |     { | |||
|  |         mapStep1Pre[pProcessData->iDataSource] = transSubData.step1Location; | |||
|  |     } | |||
|  |     if (mapSecondFlag.find(pProcessData->iDataSource) == mapSecondFlag.end()) | |||
|  |     { | |||
|  |         mapSecondFlag[pProcessData->iDataSource] = false; | |||
|  |     } | |||
|  | 
 | |||
|  |     int iCompareValue = 0; | |||
|  |     int iPreCenter = 0; | |||
|  |     int iCurCenter = 0; | |||
|  |     if (setTopContainerSid_.count(pProcessData->iDataSource) != 0) | |||
|  |     { | |||
|  |         //顶部集装箱,使用Y坐标比较
 | |||
|  |         iCompareValue = pProcessData->iHeight / 3; | |||
|  |         iPreCenter = mapStep1Pre[pProcessData->iDataSource].fLTY; | |||
|  |         iCurCenter = transSubData.step1Location.fLTY; | |||
|  |     } | |||
|  |     else | |||
|  |     { | |||
|  |         //侧部集装箱,使用X坐标比较
 | |||
|  |         iCompareValue = pProcessData->iWidth / 3; | |||
|  |         iPreCenter = mapStep1Pre[pProcessData->iDataSource].fLTX; | |||
|  |         iCurCenter = transSubData.step1Location.fLTX; | |||
|  |     } | |||
|  | 
 | |||
|  |     int iIndex = 0; | |||
|  |     if (!mapSecondFlag[pProcessData->iDataSource]) | |||
|  |     { | |||
|  |         iIndex = 1; | |||
|  |         if (abs(iPreCenter - iCurCenter) > iCompareValue) | |||
|  |         { | |||
|  |             iIndex = 2; | |||
|  |             mapSecondFlag[pProcessData->iDataSource] = true; | |||
|  |         } | |||
|  |         mapStep1Pre[pProcessData->iDataSource] = transSubData.step1Location; | |||
|  |     } | |||
|  |     else | |||
|  |     { | |||
|  |         if (abs(iPreCenter - iCurCenter) > iCompareValue) | |||
|  |         { | |||
|  |             iIndex = 1; | |||
|  |         } | |||
|  |         else | |||
|  |         { | |||
|  |             iIndex = 2; | |||
|  |             mapStep1Pre[pProcessData->iDataSource] = transSubData.step1Location; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     //集装箱校验
 | |||
|  |     bool bChkFlag = true; | |||
|  |     for (auto iter = transSubData.vecTransInfo.begin(); iter != transSubData.vecTransInfo.end(); ++iter) | |||
|  |     { | |||
|  |         bChkFlag &= iter->IsChkFlag; | |||
|  |     } | |||
|  |     if (bChkFlag) | |||
|  |     { | |||
|  |         bChkFlag = VerifyContainerNo(transSubData.strAllValue); | |||
|  |     } | |||
|  |     LogDebug << "datasource:" << pProcessData->iDataSource << " frameid:" << pProcessData->iFrameId | |||
|  |              << " iIndex:" << iIndex << " containerNo:" << transSubData.strAllValue << " chkflag:" << bChkFlag; | |||
|  | 
 | |||
|  |     Container containerBest; | |||
|  |     MakeBestContainer(containerBest, &transSubData, pProcessData); | |||
|  |     containerBest.bChkFlag = bChkFlag; | |||
|  | 
 | |||
|  |     mapSidContainers[pProcessData->iDataSource][iIndex].push_back(containerBest); | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | * 识别成功和失败中选取最优结果 | |||
|  | * inParam : std::shared_ptr<TrainContainer> pTrainContainer     选优结果 | |||
|  | * outParam: N/A | |||
|  | * return  : N/A | |||
|  | */ | |||
|  | void SelectBestContainerEngine_NEW::GetBestContainerBySid(std::map<int, std::map<int, std::vector<Container>>> &mapSidContainers, | |||
|  |                                                           std::map<int, std::vector<Container>> &mapSidConBest) | |||
|  | { | |||
|  |     for (auto iter = mapSidContainers.begin(); iter != mapSidContainers.end(); iter++) | |||
|  |     { | |||
|  |         for (auto iterSub = iter->second.begin(); iterSub != iter->second.end(); iterSub++) | |||
|  |         { | |||
|  |             std::map<std::string, int> mapConCnt; | |||
|  |             Container containerSucc; | |||
|  |             Container containerFail; | |||
|  |             bool bNoSameFlag = false; | |||
|  |             for (int i = 0; i < iterSub->second.size(); i++) | |||
|  |             { | |||
|  |                 if (!iterSub->second[i].bChkFlag) | |||
|  |                 { | |||
|  |                     // 校验失败的数据,找一个最长的识别即可
 | |||
|  |                     if (containerFail.strContainerNo.length() < iterSub->second[i].strContainerNo.length()) | |||
|  |                     { | |||
|  |                         containerFail = iterSub->second[i]; | |||
|  |                     } | |||
|  |                     continue; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 //统计识别校验通过箱号的频次
 | |||
|  |                 if (mapConCnt.find(iterSub->second[i].strContainerNo) != mapConCnt.end()) | |||
|  |                 { | |||
|  |                     mapConCnt[iterSub->second[i].strContainerNo]++; | |||
|  |                 } | |||
|  |                 else | |||
|  |                 { | |||
|  |                     mapConCnt[iterSub->second[i].strContainerNo] = 1; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 if (containerSucc.strContainerNo.empty()) | |||
|  |                 { | |||
|  |                     containerSucc = iterSub->second[i]; | |||
|  |                     continue; | |||
|  |                 } | |||
|  |                 if (containerSucc.strContainerNo == iterSub->second[i].strContainerNo) | |||
|  |                 { | |||
|  |                     // 校验通过且相同的,选取得分最高的。
 | |||
|  |                     if (containerSucc.fScoreSum < iterSub->second[i].fScoreSum) | |||
|  |                     { | |||
|  |                         containerSucc = iterSub->second[i]; | |||
|  |                         continue; | |||
|  |                     } | |||
|  |                 } | |||
|  |                 else | |||
|  |                 { | |||
|  |                     LogDebug << "sourceid:" << iter->first << " frameid:" << iterSub->second[i].strBestImg | |||
|  |                              << " containerNo:" << iterSub->second[i].strContainerNo << " no equal frameid:" | |||
|  |                              << containerSucc.strBestImg << " containerNo:" << containerSucc.strContainerNo; | |||
|  |                     bNoSameFlag = true; | |||
|  |                 } | |||
|  |             } | |||
|  |             //有识别不相同时,选取识别次数最多的。
 | |||
|  |             if (bNoSameFlag) | |||
|  |             { | |||
|  |                 int iCnt = 0; | |||
|  |                 std::string strMaxContainerNO; | |||
|  |                 for (auto it = mapConCnt.begin(); it != mapConCnt.end(); it++) | |||
|  |                 { | |||
|  |                     LogDebug << "sourceid:" << iter->first << " containerNo:" << it->first << " cnt:" << it->second; | |||
|  |                     if (iCnt < it->second) | |||
|  |                     { | |||
|  |                         iCnt = it->second; | |||
|  |                         strMaxContainerNO = it->first; | |||
|  |                     } | |||
|  |                 } | |||
|  |                 //根据识别次数最多的箱号,获取最优箱号图
 | |||
|  |                 float fMaxScoreSum = 0.0; | |||
|  |                 for (int i = 0; i < iterSub->second.size(); i++) | |||
|  |                 { | |||
|  |                     if (iterSub->second[i].strContainerNo == strMaxContainerNO && iterSub->second[i].fScoreSum > fMaxScoreSum) | |||
|  |                     { | |||
|  |                         fMaxScoreSum = iterSub->second[i].fScoreSum; | |||
|  |                         containerSucc = iterSub->second[i]; | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |             if (mapSidConBest.find(iter->first) == mapSidConBest.end()) | |||
|  |             { | |||
|  |                 mapSidConBest[iter->first] = std::vector<Container>(); | |||
|  |             } | |||
|  | 
 | |||
|  |             if (!containerSucc.strContainerNo.empty()) | |||
|  |             { | |||
|  |                 mapSidConBest[iter->first].push_back(containerSucc); | |||
|  |                 LogDebug << "sourceid:" << iter->first << " index:" << iterSub->first << " push frameid:" << containerSucc.strBestImg | |||
|  |                          << " containerNo:" << containerSucc.strContainerNo << " chkFlag:" << containerSucc.bChkFlag; | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 mapSidConBest[iter->first].push_back(containerFail); | |||
|  |                 LogDebug << "sourceid:" << iter->first << " index:" << iterSub->first << " push frameid:" << containerFail.strBestImg | |||
|  |                          << " containerNo:" << containerFail.strContainerNo << " chkFlag:" << containerFail.bChkFlag; | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | /**
 | |||
|  | * 识别成功和失败中选取最优结果 | |||
|  | * inParam : std::shared_ptr<TrainContainer> pTrainContainer     选优结果 | |||
|  | * outParam: N/A | |||
|  | * return  : N/A | |||
|  | */ | |||
|  | void SelectBestContainerEngine_NEW::GetBestContainer(TrainContainer &trainContainerSucc, | |||
|  |                                                      TrainContainer &trainContainerFail, | |||
|  |                                                      std::map<int, std::vector<Container>> &mapSidConBest) | |||
|  | { | |||
|  |     int iBestContainerSid = 0; //默认主摄像头
 | |||
|  |     bool bMainCamFlag = false; | |||
|  |     for (auto iter = mapSidConBest.begin(); iter != mapSidConBest.end(); iter++) | |||
|  |     { | |||
|  |         //获取2个箱号都识别的摄像头id
 | |||
|  |         if (iter->second.size() > 1) | |||
|  |         { | |||
|  |             if (iter->second.at(0).bChkFlag && iter->second.at(1).bChkFlag) | |||
|  |             { | |||
|  |                 iBestContainerSid = iter->first; | |||
|  |                 break; | |||
|  |             } | |||
|  |             if (!bMainCamFlag && (iter->second.at(0).bChkFlag || iter->second.at(1).bChkFlag)) | |||
|  |             { | |||
|  |                 iBestContainerSid = iter->first; | |||
|  |                 bMainCamFlag = (iter->first == 0 ? true : false); | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  |     LogDebug << "best sourceid:" << iBestContainerSid << " size:" << mapSidConBest[iBestContainerSid].size(); | |||
|  |     // 按一个摄像头,获取2次识别结果
 | |||
|  |     if (mapSidConBest[iBestContainerSid].size() > 0) | |||
|  |     { | |||
|  |         if (mapSidConBest[iBestContainerSid].at(0).bChkFlag) | |||
|  |         { | |||
|  |             trainContainerSucc.container1 = mapSidConBest[iBestContainerSid].at(0); | |||
|  |         } | |||
|  |         else | |||
|  |         { | |||
|  |             trainContainerFail.container1 = mapSidConBest[iBestContainerSid].at(0); | |||
|  |         } | |||
|  |     } | |||
|  |     if (mapSidConBest[iBestContainerSid].size() > 1) | |||
|  |     { | |||
|  |         if (mapSidConBest[iBestContainerSid].at(1).bChkFlag) | |||
|  |         { | |||
|  |             trainContainerSucc.container2 = mapSidConBest[iBestContainerSid].at(1); | |||
|  |         } | |||
|  |         else | |||
|  |         { | |||
|  |             trainContainerFail.container2 = mapSidConBest[iBestContainerSid].at(1); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /*
 | |||
|  |     循环处理所有摄像头识别结果 | |||
|  |         1.识别正确,按得分比较取最优结果。 | |||
|  |     */ | |||
|  |     for (auto iter = mapSidConBest.begin(); iter != mapSidConBest.end(); iter++) | |||
|  |     { | |||
|  |         if (iter->first == iBestContainerSid) | |||
|  |         { | |||
|  |             continue; | |||
|  |         } | |||
|  |         if (iter->second.size() > 0) | |||
|  |         { | |||
|  |             if (iter->second.at(0).bChkFlag) | |||
|  |             { | |||
|  |                 //都校验通过,且相等则按得分比较
 | |||
|  |                 if (trainContainerSucc.container1.bChkFlag) | |||
|  |                 { | |||
|  |                     if (trainContainerSucc.container1.strContainerNo == iter->second.at(0).strContainerNo && | |||
|  |                         trainContainerSucc.container1.fScoreSum < iter->second.at(0).fScoreSum) | |||
|  |                     { | |||
|  |                         trainContainerSucc.container1 = iter->second.at(0); | |||
|  |                     } | |||
|  |                 } | |||
|  |                 else | |||
|  |                 { | |||
|  |                     //一个校验通过,则需和箱号2判断是否相等,不一致则用校验通过替换,如果一致,则不替换。(防止一侧摄像头只能识别位置是2的箱号)
 | |||
|  |                     if (trainContainerSucc.container2.strContainerNo != iter->second.at(0).strContainerNo) | |||
|  |                     { | |||
|  |                         trainContainerSucc.container1 = iter->second.at(0); | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 if (trainContainerFail.container1.strContainerNo.length() < iter->second.at(0).strContainerNo.length()) | |||
|  |                 { | |||
|  |                     trainContainerFail.container1 = iter->second.at(0); | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         if (iter->second.size() > 1) | |||
|  |         { | |||
|  |             if (iter->second.at(1).bChkFlag) | |||
|  |             { | |||
|  |                 //都校验通过,且相等则按得分比较
 | |||
|  |                 if (trainContainerSucc.container2.bChkFlag) | |||
|  |                 { | |||
|  |                     if (trainContainerSucc.container2.strContainerNo == iter->second.at(1).strContainerNo && | |||
|  |                         trainContainerSucc.container2.fScoreSum < iter->second.at(1).fScoreSum) | |||
|  |                     { | |||
|  |                         trainContainerSucc.container2 = iter->second.at(1); | |||
|  |                     } | |||
|  |                 } | |||
|  |                 else | |||
|  |                 { | |||
|  |                     //一个校验通过,则需和箱号1判断是否相等,防止箱号1和2一致
 | |||
|  |                     if (trainContainerSucc.container1.strContainerNo != iter->second.at(1).strContainerNo) | |||
|  |                     { | |||
|  |                         trainContainerSucc.container2 = iter->second.at(1); | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 if (trainContainerFail.container2.strContainerNo.length() < iter->second.at(1).strContainerNo.length()) | |||
|  |                 { | |||
|  |                     trainContainerFail.container2 = iter->second.at(1); | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  | } | |||
|  | 
 | |||
|  | /**
 | |||
|  | * 识别成功和失败中选取最优结果 | |||
|  | * inParam : std::shared_ptr<TrainContainer> pTrainContainer     选优结果 | |||
|  | * outParam: N/A | |||
|  | * return  : N/A | |||
|  | */ | |||
|  | void SelectBestContainerEngine_NEW::SelectBestTrainContainer(std::shared_ptr<TrainContainer> pTrainContainer) | |||
|  | { | |||
|  |     //1.获取正向校验通过数据
 | |||
|  |     GetBestContainerBySid(mapSidContainers0_, mapSidConBest0_); | |||
|  |     TrainContainer trainContainerSucc0; | |||
|  |     TrainContainer trainContainerFail0; | |||
|  |     GetBestContainer(trainContainerSucc0, trainContainerFail0, mapSidConBest0_); | |||
|  |     *pTrainContainer = trainContainerSucc0; | |||
|  |     if (!trainContainerSucc0.container1.strContainerNo.empty() && !trainContainerSucc0.container2.strContainerNo.empty()) | |||
|  |     { | |||
|  |         //正向全部识别成功直接返回。
 | |||
|  |         return; | |||
|  |     } | |||
|  | 
 | |||
|  |     //2. 正向没全部识别成功,获取反向校验通过数据
 | |||
|  |     LogDebug << "select best reverse info"; | |||
|  |     GetBestContainerBySid(mapSidContainers1_, mapSidConBest1_); | |||
|  |     TrainContainer trainContainerSucc1; | |||
|  |     TrainContainer trainContainerFail1; | |||
|  |     GetBestContainer(trainContainerSucc1, trainContainerFail1, mapSidConBest1_); | |||
|  |     // 反向识别且和正向不相等则,按时间顺序设置。
 | |||
|  |     if (!trainContainerSucc1.container1.strContainerNo.empty() && trainContainerSucc1.container1.strContainerNo != pTrainContainer->container1.strContainerNo) | |||
|  |     { | |||
|  |         // 正向没识别第一个时,反向识别,则反向作为第一个。
 | |||
|  |         if (pTrainContainer->container1.strContainerNo.empty()) | |||
|  |         { | |||
|  |             pTrainContainer->container1 = trainContainerSucc1.container1; | |||
|  |         } | |||
|  |         else | |||
|  |         { | |||
|  |             // 正向识别第一个,则肯定没识别到第二个,因此按时间处理下。如果反向也只识别到第一个,则作为第二个集装箱号。
 | |||
|  |             Container container1Temp = pTrainContainer->container1; | |||
|  |             if (container1Temp.i64TimeStamp >= trainContainerSucc1.container1.i64TimeStamp) | |||
|  |             { | |||
|  |                 pTrainContainer->container2 = container1Temp; | |||
|  |                 pTrainContainer->container1 = trainContainerSucc1.container1; | |||
|  |             } | |||
|  |             else if (trainContainerSucc1.container2.strContainerNo.empty()) //如果反向没识别第二个,则反向第一个做为第2个。
 | |||
|  |             { | |||
|  |                 pTrainContainer->container2 = trainContainerSucc1.container1; | |||
|  |             } | |||
|  |         } | |||
|  |     } | |||
|  |     if (!trainContainerSucc1.container2.strContainerNo.empty() && trainContainerSucc1.container2.strContainerNo != pTrainContainer->container2.strContainerNo) | |||
|  |     { | |||
|  |         if (pTrainContainer->container2.strContainerNo.empty() ) | |||
|  |         { | |||
|  |             pTrainContainer->container2 = trainContainerSucc1.container2; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     if (!pTrainContainer->container1.strContainerNo.empty() && !pTrainContainer->container2.strContainerNo.empty()) | |||
|  |     { | |||
|  |         return; | |||
|  |     } | |||
|  | 
 | |||
|  |     //3. 获取正向未校验通过数据
 | |||
|  |     if (pTrainContainer->container1.strContainerNo.empty()) | |||
|  |     { | |||
|  |         pTrainContainer->container1 = trainContainerFail0.container1; | |||
|  |     } | |||
|  |     if (pTrainContainer->container2.strContainerNo.empty()) | |||
|  |     { | |||
|  |         pTrainContainer->container2 = trainContainerFail0.container2; | |||
|  |     } | |||
|  | 
 | |||
|  |     //4.获取反向未通过校验数据 (正向有内容不再取反向内容)
 | |||
|  |     if (pTrainContainer->container1.strContainerNo.empty() || pTrainContainer->container2.strContainerNo.empty()) | |||
|  |     { | |||
|  |         if (pTrainContainer->container1.strContainerNo.empty()) | |||
|  |         { | |||
|  |             pTrainContainer->container1 = trainContainerFail1.container1; | |||
|  |         } | |||
|  |         if (pTrainContainer->container2.strContainerNo.empty()) | |||
|  |         { | |||
|  |             pTrainContainer->container2 = trainContainerFail1.container2; | |||
|  |         } | |||
|  |     } | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | APP_ERROR SelectBestContainerEngine_NEW::Process() | |||
|  | { | |||
|  |     int iRet = APP_ERR_OK; | |||
|  |     while (!isStop_) | |||
|  |     { | |||
|  |         //pop端口0
 | |||
|  |         std::shared_ptr<void> pVoidData0 = nullptr; | |||
|  |         iRet = inputQueMap_[strPort0_]->pop(pVoidData0); | |||
|  |         if (nullptr == pVoidData0) | |||
|  |         { | |||
|  |             usleep(1000); | |||
|  |             continue; | |||
|  |         } | |||
|  |         std::shared_ptr<ProcessData> pProcessData = std::static_pointer_cast<ProcessData>(pVoidData0); | |||
|  |         std::shared_ptr<TransData> pTransData = std::static_pointer_cast<TransData>(pProcessData->pVoidData); | |||
|  |         if (pProcessData->bIsEnd) | |||
|  |         { | |||
|  |             mapDataSourceIsEnd_[pProcessData->iDataSource] = pProcessData->bIsEnd; | |||
|  |         } | |||
|  | 
 | |||
|  |         for (size_t i = 0; i < pTransData->vecTransSubData.size(); i++) | |||
|  |         { | |||
|  |             TransSubData transSubData = pTransData->vecTransSubData[i]; | |||
|  |             //正方向信息
 | |||
|  |             if (transSubData.iBigClassId == 0) | |||
|  |             { | |||
|  |                 DealContainer(pProcessData, transSubData, mapSidContainers0_, mapStep1Pre0_, mapSecondFlag0_); | |||
|  |             } | |||
|  |             //反方向信息
 | |||
|  |             else if (transSubData.iBigClassId == 1) | |||
|  |             { | |||
|  |                 LogDebug << "sourceid:" << pProcessData->iDataSource << " frameid:" << pProcessData->iFrameId << " reverse info"; | |||
|  |                 DealContainer(pProcessData, transSubData, mapSidContainers1_, mapStep1Pre1_, mapSecondFlag1_); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         bool bAllEnd = true; | |||
|  |         for (auto iter = mapDataSourceIsEnd_.begin(); iter != mapDataSourceIsEnd_.end(); iter++) | |||
|  |         { | |||
|  |             bAllEnd = bAllEnd && iter->second; | |||
|  |         } | |||
|  | 
 | |||
|  |         //4. 结束帧时,全部处理掉
 | |||
|  |         if (bAllEnd) | |||
|  |         { | |||
|  |             std::shared_ptr<TrainContainer> pTrainContainer = std::make_shared<TrainContainer>(); | |||
|  |             SelectBestTrainContainer(pTrainContainer); | |||
|  |             if (pTrainContainer->container1.iDataSource == pTrainContainer->container2.iDataSource && | |||
|  |                 pTrainContainer->container1.bChkFlag && pTrainContainer->container2.bChkFlag) | |||
|  |             { | |||
|  |                 if (pTrainContainer->container1.i64TimeStamp > pTrainContainer->container2.i64TimeStamp) | |||
|  |                 { | |||
|  |                     LogWarn << "bestcontainer swap container1:" << pTrainContainer->container1.strBestImg << " " << pTrainContainer->container1.strContainerNo | |||
|  |                             << " contianer2:" << pTrainContainer->container2.strBestImg << " " << pTrainContainer->container2.strContainerNo; | |||
|  |                     Container containerTemp = pTrainContainer->container1; | |||
|  |                     pTrainContainer->container1 = pTrainContainer->container2; | |||
|  |                     pTrainContainer->container2 = containerTemp; | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |             outputQueMap_[strPort0_]->push(std::static_pointer_cast<void>(pTrainContainer)); | |||
|  |             //push端口1,记录csv
 | |||
|  |             outputQueMap_[strPort1_]->push(std::static_pointer_cast<void>(pTrainContainer)); | |||
|  | 
 | |||
|  |             //初始化参数变量
 | |||
|  |             InitParam(); | |||
|  |         } | |||
|  |     } | |||
|  |     return APP_ERR_OK; | |||
|  | } |