#include "SaveStepOneResultEngine.h" using namespace ai_matrix; SaveStepOneResultEngine::SaveStepOneResultEngine() {} SaveStepOneResultEngine::~SaveStepOneResultEngine() {} APP_ERROR SaveStepOneResultEngine::Init() { strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0"; strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1"; strResultPath_ = MyYaml::GetIns()->GetPathValue("gc_result_path"); iSplitSpan_ = MyYaml::GetIns()->GetIntValue("partition_frame_span"); iSplitSpanPX_ = MyYaml::GetIns()->GetIntValue("gc_split_frame_span_px"); dataSourceConfig_ = MyYaml::GetIns()->GetDataSourceConfigById(engineId_); std::map mapUseDataSouceCfg = MyYaml::GetIns()->GetUseDataSourceConfig(); std::string delimiter(","); for (auto iter = mapUseDataSouceCfg.begin(); iter != mapUseDataSouceCfg.end(); iter++) { int iCnt = 0; std::vector vecSplit = MyUtils::getins()->split(iter->second.strTarget, delimiter); for (auto iter = vecSplit.begin(); iter != vecSplit.end(); iter++) { if (*iter == "NUM") { iCnt++; } else if (*iter == "CHKDATE") { iCnt++; } else if (*iter == "CONTAINER" || *iter == "CONTAINER_T") { iCnt++; } } mapInvokeModelCnt_[iter->first] = iCnt; } InitParam(); LogInfo << "SaveStepOneResultEngine Init ok"; return APP_ERR_OK; } APP_ERROR SaveStepOneResultEngine::DeInit() { LogInfo << "SaveStepOneResultEngine DeInit ok"; return APP_ERR_OK; } /** * 初始化参数信息 * inParam : N/A * outParam: N/A * return : N/A */ void SaveStepOneResultEngine::InitParam() { iPushSpaceFrameId_ = 0; i64TimeStampFirst_ = 0; iDirection_ = DIRECTION_UNKNOWN; bPushIsEnd_ = false; vecParationInfo_.clear(); std::vector().swap(vecParationInfo_); bDealCenterFlag_ = false; parationInfoLast_.i64EndTimeStamp = 0; parationInfoLast_.modelSpaceFrame = 0; parationInfoLast_.iRate = 0; parationInfoLast_.bmodelconfirmed = false; parationInfoLast_.fLTX = 0.0; parationInfoLast_.fRBX = 0.0; parationInfoLast_.strTrainDate = ""; parationInfoLast_.strTrainName = ""; parationInfoLast_.bIsEnd = false; parationInfoLast_.nStatus = 0; mapNumCenterInfo_.clear(); mapProCenterInfo_.clear(); bHaveHeadFlag_ = false; headInfo_.iFrameId = 0; headInfo_.fCenterX = 0; } /** * 构造车厢间隔信息 * inParam : N/A * outParam: N/A * return : N/A */ void SaveStepOneResultEngine::MakeParationInfo(PartionInfo ¶tionInfo, std::shared_ptr pProcessData, Json::Value &jvStep1Space) { parationInfo.i64EndTimeStamp = pProcessData->i64TimeStamp; parationInfo.modelSpaceFrame = pProcessData->iFrameId; parationInfo.iRate = pProcessData->iRate; parationInfo.bmodelconfirmed = true; parationInfo.fLTX = jvStep1Space[0]["ltx"].asFloat(); parationInfo.fRBX = jvStep1Space[0]["rbx"].asFloat(); parationInfo.strTrainDate = pProcessData->strTrainDate; parationInfo.strTrainName = pProcessData->strTrainName; parationInfo.bIsEnd = pProcessData->bIsEnd; parationInfo.nStatus = ((pProcessData->iStatus == TRAINSTATUS_STOP) ? TRAIN_PAUSE : iDirection_); parationInfoLast_ = parationInfo; } /** * 处理中心间隔信息 * inParam : N/A * outParam: N/A * return : N/A */ void SaveStepOneResultEngine::DealCenterSpace(std::vector &vecParationInfo, std::shared_ptr pProcessData) { int iVecSize = vecParationInfo.size(); if (iVecSize < 0) { return; } LogDebug << "积累的车厢切分信息数:" << iVecSize << " 帧:" << pProcessData->iFrameId << " 第一个车厢切分信息帧:" << vecParationInfo.at(0).modelSpaceFrame << " 最后一个车厢切分信息帧:" << vecParationInfo.at(iVecSize - 1).modelSpaceFrame << " 最后一个车厢切分信息是否为结束:" << vecParationInfo.at(iVecSize - 1).bIsEnd; /* 因停车后再行驶未能及时判断出为行驶状态,导致更新间隔信息,出现漏切分车厢(具体原因分析见正通2023-02-28的问题分析记录) 漏切分时vecParationInfo中保存的是两辆车的间隔信息,因此针对vecParationInfo做特殊处理,从此处切分出遗漏的车厢。 */ std::vector vecSpacePos; for (int i = 1; i < iVecSize; i++) { int iCenterXPre = vecParationInfo[i - 1].fLTX + (vecParationInfo[i - 1].fRBX - vecParationInfo[i - 1].fLTX) / 2; int iCenterX = vecParationInfo[i].fLTX + (vecParationInfo[i].fRBX - vecParationInfo[i].fLTX) / 2; bool bIntervalFlag = ((int)(vecParationInfo[i].modelSpaceFrame - vecParationInfo[i - 1].modelSpaceFrame)) > iSplitSpan_; LogDebug << "上一帧ID:" << vecParationInfo[i - 1].modelSpaceFrame << " 上一帧间隔X轴中线:" << iCenterXPre << " 本帧ID:" << vecParationInfo[i].modelSpaceFrame << " 本帧间隔X轴中线:" << iCenterX << " 满足帧间隔:" << bIntervalFlag << " i:" << i; if (iDirection_ == DIRECTION_LEFT && (iCenterXPre < iCenterX - iSplitSpanPX_) && bIntervalFlag) { vecSpacePos.push_back(i - 1); } if (iDirection_ == DIRECTION_RIGHT && (iCenterXPre - iSplitSpanPX_ > iCenterX) && bIntervalFlag) { vecSpacePos.push_back(i - 1); } } LogDebug << "vecSpacePos size:" << vecSpacePos.size(); vecSpacePos.push_back(iVecSize - 1); /* 如果集合中最后为列车结束帧,则表示停车在车厢间隔。这时用最后一个作为车厢划分帧。 其他场景使用靠近中心的间隔帧作为车厢划分帧 */ for (int iSpacePos = 0; iSpacePos < vecSpacePos.size(); iSpacePos++) { LogDebug << "index:" << vecSpacePos.at(iSpacePos) << " frameid:" << vecParationInfo[vecSpacePos.at(iSpacePos)].modelSpaceFrame; std::shared_ptr pPartionInfo = std::make_shared(); if (iSpacePos == vecSpacePos.size() - 1 && vecParationInfo[vecSpacePos.at(iSpacePos)].bIsEnd) { *pPartionInfo = vecParationInfo[vecSpacePos.at(iSpacePos)]; } else { int iPos = 0; int iImageCenter = pProcessData->iWidth / 2; int iToCenterXMin = iImageCenter; int iBegin = (iSpacePos == 0 ? 0 : vecSpacePos.at(iSpacePos - 1) + 1); for (int i = iBegin; i <= vecSpacePos.at(iSpacePos); i++) { int iCenterX = vecParationInfo[i].fLTX + (vecParationInfo[i].fRBX - vecParationInfo[i].fLTX) / 2; if (iToCenterXMin > abs(iCenterX - iImageCenter)) { iToCenterXMin = abs(iCenterX - iImageCenter); iPos = i; } } *pPartionInfo = vecParationInfo[iPos]; } //此处切分时,依据车号,属性判断是否有漏的车厢,如果有则依靠车号属性切分。 SplitTrainByNumPro(pPartionInfo, pProcessData); pPartionInfo->fLTX = pPartionInfo->fLTX / (pProcessData->iWidth / METHOD_BASE_WIDTH); pPartionInfo->fRBX = pPartionInfo->fRBX / (pProcessData->iWidth / METHOD_BASE_WIDTH); if (iPushSpaceFrameId_ == 0) { pPartionInfo->i64StartTimeStamp = i64TimeStampFirst_; pPartionInfo->startframe = dataSourceConfig_.iSkipInterval; } pPartionInfo->nStatus = ((pProcessData->iStatus == TRAINSTATUS_STOP) ? TRAIN_PAUSE : iDirection_); LogWarn << "--------- 向Paration 发送数据 --------"; outputQueMap_[strPort0_]->push(std::static_pointer_cast(pPartionInfo), true); iPushSpaceFrameId_ = pPartionInfo->modelSpaceFrame; bPushIsEnd_ = pPartionInfo->bIsEnd; LogDebug << "pushSpaceFrameId:" << iPushSpaceFrameId_ << " timeStamp:" << pPartionInfo->i64EndTimeStamp << " ltx:" << pPartionInfo->fLTX << " rbx:" << pPartionInfo->fRBX << " bPushIsEnd:" << bPushIsEnd_; } vecParationInfo.clear(); } /** * 处理车厢间隔 * inParam : N/A * outParam: N/A * return : N/A */ void SaveStepOneResultEngine::DealTrainSpaceInfo(std::shared_ptr pProcessData, Json::Value &jvStep1Space) { /* 无方向时,识别的内容都放入集合中。 有向时,按方向判断是否push车厢间隔框 向左行驶:帧间隔中心点小于画面1/3时,则处理车厢间隔集合。新车厢间隔必须大于上次车厢中心点再放入集合等待处理。 向右行驶:帧间隔中心点大于画面2/3时,则处理车厢间隔集合。新车厢间隔必须小于上次车厢中心点再放入集合等待处理。 注:最后一节不会再有帧间隔了,因此直接发送的结束帧,且坐标设置中心点。 */ if (jvStep1Space.size() <= 0 || pProcessData->iOrigFrameId < 50) { return; } /* 停车状态后不再放入信息到集合中,防止长时间停在间隔上导致集合持续增大。 停车状态且有间隔时需更新最后间隔框帧号。(防止在XXX帧停车且有间隔框,然后开始倒车再正向行驶,当再回到开始倒车的位置时,此时帧号为YYYY, 会符合下面的partition_frame_span判断,导致bIntervalFlag为true而切分车厢) */ if (pProcessData->iStatus == TRAINSTATUS_STOP && !pProcessData->bIsEnd) { LogDebug << "status_stop parationInfoLast_:" << parationInfoLast_.modelSpaceFrame << " update by frameId:" << pProcessData->iFrameId; parationInfoLast_.i64EndTimeStamp = pProcessData->i64TimeStamp; parationInfoLast_.modelSpaceFrame = pProcessData->iFrameId; return; } if (iDirection_ == DIRECTION_UNKNOWN) { std::string strFilePath = strResultPath_ + pProcessData->strTrainDate + "/" + pProcessData->strTrainName + "/" + "direction.txt"; Json::Value jvDirectionInfo; if (MyUtils::getins()->ReadJsonInfo(jvDirectionInfo, strFilePath)) { iDirection_ = jvDirectionInfo["direction"].asInt(); } else { LogWarn << "暂未检测出行车方向"; } } bool bIntervalFlag = ((int)(pProcessData->iFrameId - parationInfoLast_.modelSpaceFrame)) > iSplitSpan_; int iCenterCur = jvStep1Space[0]["ltx"].asFloat() + (jvStep1Space[0]["rbx"].asFloat() - jvStep1Space[0]["ltx"].asFloat()) / 2; int iCenterLast = parationInfoLast_.fLTX + (parationInfoLast_.fRBX - parationInfoLast_.fLTX) / 2; LogDebug << "当前帧:" << pProcessData->iFrameId << " 间隔框中心线:" << iCenterCur << " 上一帧:" << parationInfoLast_.modelSpaceFrame << " 间隔框中心线:" << iCenterLast << " 行车方向:" << iDirection_ << " 是否满足切分帧数:" << bIntervalFlag << " bDealCenterFlag_:" << bDealCenterFlag_; if (iDirection_ == DIRECTION_UNKNOWN || iCenterLast == 0) { PartionInfo parationInfo; MakeParationInfo(parationInfo, pProcessData, jvStep1Space); vecParationInfo_.push_back(parationInfo); } else if (iDirection_ == DIRECTION_LEFT) { if (iCenterCur < (pProcessData->iWidth / 3)) { if (!bDealCenterFlag_) { PartionInfo parationInfo; MakeParationInfo(parationInfo, pProcessData, jvStep1Space); vecParationInfo_.push_back(parationInfo); DealCenterSpace(vecParationInfo_, pProcessData); bDealCenterFlag_ = true; } //这需要替换parationInfoLast_, 确保parationInfoLast_是最靠左的一个间隔,但不需要加入集合 PartionInfo parationInfo; MakeParationInfo(parationInfo, pProcessData, jvStep1Space); } else if ((iCenterLast < iCenterCur - iSplitSpanPX_) && bIntervalFlag) //该条件只会在新车间隔出来进入一次 { //防止上节车厢间隔框所有识别都大于画面的1/3,因此当前车厢间隔出来后也需处理下上节车厢间隔 if (!bDealCenterFlag_ && vecParationInfo_.size() > 0) { LogDebug << "lastFrameid:" << vecParationInfo_[0].modelSpaceFrame << " frameid:" << pProcessData->iFrameId; DealCenterSpace(vecParationInfo_, pProcessData); } PartionInfo parationInfo; MakeParationInfo(parationInfo, pProcessData, jvStep1Space); vecParationInfo_.push_back(parationInfo); bDealCenterFlag_ = false; } else { PartionInfo parationInfo; MakeParationInfo(parationInfo, pProcessData, jvStep1Space); //该条件是防止第一个XXX帧满足小于画面1/3后切割,后一帧XXX+1的中心点大于画面1/3导致的加入vec中出现的多切分现象。(向右增加30px的浮动) if (!(bDealCenterFlag_ && !bIntervalFlag && (iCenterCur < (pProcessData->iWidth / 3 + 80)))) { vecParationInfo_.push_back(parationInfo); } } } else if (iDirection_ == DIRECTION_RIGHT) { if (iCenterCur > (pProcessData->iWidth / 3 * 2)) { if (!bDealCenterFlag_) { PartionInfo parationInfo; MakeParationInfo(parationInfo, pProcessData, jvStep1Space); vecParationInfo_.push_back(parationInfo); DealCenterSpace(vecParationInfo_, pProcessData); bDealCenterFlag_ = true; } //这需要替换parationInfoLast_, 确保parationInfoLast_是最靠右的一个间隔,但不需要加入集合 PartionInfo parationInfo; MakeParationInfo(parationInfo, pProcessData, jvStep1Space); } else if ((iCenterLast - iSplitSpanPX_ > iCenterCur) && bIntervalFlag) //该条件只会在新车间隔出来进入一次 { //防止上节车厢间隔所有识别框都小于画面的2/3,因此当前车厢间隔出来后也需处理下上节车厢间隔 if (!bDealCenterFlag_ && vecParationInfo_.size() > 0) { LogDebug << "lastFrameid:" << vecParationInfo_[0].modelSpaceFrame << " frameid:" << pProcessData->iFrameId; DealCenterSpace(vecParationInfo_, pProcessData); } PartionInfo parationInfo; MakeParationInfo(parationInfo, pProcessData, jvStep1Space); vecParationInfo_.push_back(parationInfo); bDealCenterFlag_ = false; } else { PartionInfo parationInfo; MakeParationInfo(parationInfo, pProcessData, jvStep1Space); //该条件是防止第一个XXX帧满足大于画面2/3后切割,后一帧XXX+1的中心点小于画面2/3导致的加入vec中出现的多切分现象。(向左增加30px的浮动) if (!(bDealCenterFlag_ && !bIntervalFlag && (iCenterCur > (pProcessData->iWidth / 3 * 2 - 80)))) { vecParationInfo_.push_back(parationInfo); } } } } void SaveStepOneResultEngine::SplitTrainByNumPro(std::shared_ptr &pPartionInfo, std::shared_ptr &pProcessData) { //向左行驶用车号位置,向右行驶用属性位置。 std::map *pMapCenterInfoTemp_ = nullptr; if (iDirection_ == DIRECTION_LEFT) { pMapCenterInfoTemp_ = &mapNumCenterInfo_; mapProCenterInfo_.clear(); } else if (iDirection_ == DIRECTION_RIGHT) { pMapCenterInfoTemp_ = &mapProCenterInfo_; mapNumCenterInfo_.clear(); } if (pMapCenterInfoTemp_ == nullptr || pMapCenterInfoTemp_->size() <= 0) { return; } LogDebug << "pPartionInfo->modelSpaceFrame:" << pPartionInfo->modelSpaceFrame << " mapsize:" << pMapCenterInfoTemp_->size(); auto iter = pMapCenterInfoTemp_->begin(); int iCenterXPre = iter->second; uint32_t iFrameIdPre = iter->first; bool bFlag = false; uint32_t iSplitFrameId = 0; while (++iter != pMapCenterInfoTemp_->end()) { bool bIntervalFlag = (int)(iter->first - iFrameIdPre) > iSplitSpan_; LogDebug << "iFrameIdPre:" << iFrameIdPre << " iCenterXPre:" << iCenterXPre << " iFrameid:" << iter->first << " iCenter:" << iter->second << " bIntervalFlag:" << bIntervalFlag; if (iDirection_ == DIRECTION_LEFT && (iCenterXPre < iter->second - iSplitSpanPX_) && bIntervalFlag) { iSplitFrameId = iter->first; bFlag = true; } if (iDirection_ == DIRECTION_RIGHT && (iCenterXPre - iSplitSpanPX_ > iter->second) && bIntervalFlag) { iSplitFrameId = iter->first; //iSplitFrameId = iFrameIdPre; //向右行驶,从车号行驶到最右侧开始切分。 bFlag = true; } //比较完后,可更新前一帧数据 iCenterXPre = iter->second; iFrameIdPre = iter->first; if(bFlag) { if (iDirection_ == DIRECTION_LEFT && iter->second < (pProcessData->iWidth / 3)) { bFlag = false; } else if (iDirection_ == DIRECTION_RIGHT && iter->second > (pProcessData->iWidth / 3 * 2)) { bFlag = false; } if (!bFlag) { PartionInfo parationInfo; std::shared_ptr pPartionInfoNew = std::make_shared(); // pPartionInfoNew->i64EndTimeStamp = pProcessData->i64TimeStamp; pPartionInfoNew->modelSpaceFrame = iSplitFrameId; // parationInfo.iRate = pProcessData->iRate; pPartionInfoNew->bmodelconfirmed = false; // pPartionInfoNew->fLTX = jvStep1Space[0]["ltx"].asFloat(); // pPartionInfoNew->fRBX = jvStep1Space[0]["rbx"].asFloat(); pPartionInfoNew->strTrainDate = pProcessData->strTrainDate; pPartionInfoNew->strTrainName = pProcessData->strTrainName; pPartionInfoNew->bIsEnd = false; //**通过该函数切分的肯定不是最后一节 pPartionInfoNew->nStatus = ((pProcessData->iStatus == TRAINSTATUS_STOP) ? TRAIN_PAUSE : iDirection_); if (iPushSpaceFrameId_ == 0) { pPartionInfoNew->i64StartTimeStamp = i64TimeStampFirst_; pPartionInfoNew->startframe = dataSourceConfig_.iSkipInterval; } // pPartionInfoNew->nStatus = ((pProcessData->iStatus == TRAINSTATUS_STOP) ? TRAIN_PAUSE : iDirection_); //构造一个间隔信息写入到切分帧中 char szCameraNo[5] = {0}; sprintf(szCameraNo, "%03d/", pProcessData->iDataSource + 1); std::string strFilePath; strFilePath = strResultPath_ + pProcessData->strOrigTrainDate + "/" + pProcessData->strOrigTrainName + "/" + szCameraNo + std::to_string(iSplitFrameId) + ".txt"; Json::Value jvFrameInfo; MyUtils::getins()->ReadJsonInfo(jvFrameInfo, strFilePath); Json::Value jvOneSpace; jvOneSpace["classid"] = 18; jvOneSpace["ltx"] = pMapCenterInfoTemp_->at(iSplitFrameId) + (iDirection_ == DIRECTION_LEFT ? -50 : 50); jvOneSpace["lty"] = 0; jvOneSpace["rbx"] = pMapCenterInfoTemp_->at(iSplitFrameId) + (iDirection_ == DIRECTION_LEFT ? -50 : 50); jvOneSpace["rby"] = 0; jvFrameInfo["step1Space"].append(jvOneSpace); MyUtils::getins()->WriteJsonInfo(jvFrameInfo, strFilePath); LogWarn << "--------- 向Paration 发送数据 --------"; outputQueMap_[strPort0_]->push(std::static_pointer_cast(pPartionInfoNew), true); iPushSpaceFrameId_ = pPartionInfoNew->modelSpaceFrame; bPushIsEnd_ = pPartionInfoNew->bIsEnd; LogDebug << "SplitTrainByNumPro pushSpaceFrameId:" << iPushSpaceFrameId_ << " timeStamp:" << pPartionInfoNew->i64EndTimeStamp << " ltx:" << pPartionInfoNew->fLTX << " rbx:" << pPartionInfoNew->fRBX << " bPushIsEnd:" << bPushIsEnd_; while (pMapCenterInfoTemp_->size() > 0) { auto iterDel = pMapCenterInfoTemp_->begin(); if(iterDel->first > iPushSpaceFrameId_) { break; } LogDebug << "erase iFrameId:" << iterDel->first; pMapCenterInfoTemp_->erase(iterDel); } } } if (iter->first >= pPartionInfo->modelSpaceFrame) { LogDebug << "frameid:"<< iter->first << " >= pPartionInfo->modelSpaceFrame:" << pPartionInfo->modelSpaceFrame << " break"; break; } } while (pMapCenterInfoTemp_->size() > 0) { auto iterDel = pMapCenterInfoTemp_->begin(); if (iterDel->first > pPartionInfo->modelSpaceFrame) { break; } LogDebug << "erase iFrameId:" << iterDel->first; pMapCenterInfoTemp_->erase(iterDel); } } APP_ERROR SaveStepOneResultEngine::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 pProcessData = std::static_pointer_cast(pVoidData0); std::shared_ptr pPostData = std::static_pointer_cast(pProcessData->pVoidData); if (pProcessData->iFrameId == dataSourceConfig_.iSkipInterval) { i64TimeStampFirst_ = pProcessData->i64TimeStamp; } char szCameraNo[5] = {0}; sprintf(szCameraNo, "%03d/", pProcessData->iDataSource + 1); std::string strFilePath; strFilePath = strResultPath_ + pProcessData->strOrigTrainDate + "/" + pProcessData->strOrigTrainName + "/" + szCameraNo + std::to_string(pProcessData->iOrigFrameId) + ".txt"; Json::Value jvStep1Num; Json::Value jvStep1Pro; Json::Value jvStep1ChkDate; Json::Value jvStep1Container; Json::Value jvStep1Space; Json::Value jvStep1TrainSpace; Json::Value jvStep1TopSpace; for (int i = 0; i < pPostData->vecPostSubData.size(); i++) { PostSubData postSubData = pPostData->vecPostSubData[i]; if (postSubData.vecSingleData.size() < 0) { continue; } SingleData sdInfo = postSubData.vecSingleData.at(0); Json::Value jvInfo; jvInfo["classid"] = sdInfo.iClassId; jvInfo["score"] = sdInfo.fScore; jvInfo["clear"] = sdInfo.fClear; jvInfo["ltx"] = sdInfo.fLTX; jvInfo["lty"] = sdInfo.fLTY; jvInfo["rbx"] = sdInfo.fRBX; jvInfo["rby"] = sdInfo.fRBY; float fCenter = sdInfo.fLTX + (sdInfo.fRBX - sdInfo.fLTX) / 2; if (postSubData.iTargetType == NUM || postSubData.iTargetType == HEAD) { jvStep1Num.append(jvInfo); if (pProcessData->iDataSource == 0 && pProcessData->iStatus != TRAINSTATUS_STOP) { if (postSubData.iTargetType != HEAD) { mapNumCenterInfo_.insert(std::make_pair(pProcessData->iFrameId, fCenter)); } else { //车头没有属性,因此车头号也加入到属性中。保证向右行驶属性在前时最后2节的切分。 //车头只加入一次,防止一个车头2个车头号的场景。但有两个车头且没识别车头间隔则无法处理。 if (!bHaveHeadFlag_) { bool bIntervalFlag = ((int)(pProcessData->iFrameId - headInfo_.iFrameId) > iSplitSpan_ && headInfo_.iFrameId != 0); LogDebug << "frameid:" << pProcessData->iFrameId << " center:" << fCenter << " preframeid:" << headInfo_.iFrameId << " precenter:" << headInfo_.fCenterX << " bIntervalFlag:" << bIntervalFlag; if ((bIntervalFlag && abs((int)(headInfo_.fCenterX - fCenter)) > iSplitSpanPX_)) { bHaveHeadFlag_ = true; } else { headInfo_.fCenterX = fCenter; headInfo_.iFrameId = pProcessData->iFrameId; mapNumCenterInfo_.insert(std::make_pair(pProcessData->iFrameId, fCenter)); mapProCenterInfo_.insert(std::make_pair(pProcessData->iFrameId, fCenter)); } } } } } else if (postSubData.iTargetType == PRO) { jvStep1Pro.append(jvInfo); if (pProcessData->iDataSource == 0 && pProcessData->iStatus != TRAINSTATUS_STOP) { mapProCenterInfo_.insert(std::make_pair(pProcessData->iFrameId, fCenter)); } } else if (postSubData.iTargetType == CHKDATE) { jvStep1ChkDate.append(jvInfo); } else if (postSubData.iTargetType == CONTAINER) { jvStep1Container.append(jvInfo); } else if (postSubData.iTargetType == SPACE) { jvStep1Space.append(jvInfo); } else if (postSubData.iTargetType == TRAINSPACE) { jvStep1TrainSpace.append(jvInfo); } else if (postSubData.iTargetType == TOPSPACE) { jvStep1TopSpace.append(jvInfo); } } //先读取文本内容,追加新的信息后再写入 Json::Value jvFrameInfo; if (!MyUtils::getins()->ReadJsonInfo(jvFrameInfo, strFilePath)) { LogError << "read fail:" << strFilePath; } if (jvStep1Num.size() > 0) { jvFrameInfo["step1Num"] = jvStep1Num; } if (jvStep1Pro.size() > 0) { jvFrameInfo["step1Pro"] = jvStep1Pro; } if (jvStep1ChkDate.size() > 0) { jvFrameInfo["step1ChkDate"] = jvStep1ChkDate; } if (jvStep1Container.size() > 0) { jvFrameInfo["step1Container"] = jvStep1Container; } if (jvStep1Space.size() > 0) { jvFrameInfo["step1Space"] = jvStep1Space; } if (jvStep1TrainSpace.size() > 0) { jvFrameInfo["step1TrainSpace"] = jvStep1TrainSpace; if (jvStep1Space.size() <= 0) { jvFrameInfo["step1Space"] = jvStep1TrainSpace; jvStep1Space = jvStep1TrainSpace; } } if (jvStep1TopSpace.size() > 0) { jvFrameInfo["step1TopSpace"] = jvStep1TopSpace; } int iInvokeModelCnt = jvFrameInfo["invokeModelCnt"].asInt(); iInvokeModelCnt++; jvFrameInfo["invokeModelCnt"] = iInvokeModelCnt; if (mapInvokeModelCnt_[pProcessData->iDataSource] == iInvokeModelCnt) { jvFrameInfo["step1Finish"] = true; } jvFrameInfo["isEnd"] = (pProcessData->bIsEnd || jvFrameInfo["isEnd"].asBool()); if (pProcessData->iStatus == TRAINSTATUS_STOP && pProcessData->iStatus != jvFrameInfo["status"].asInt()) { jvFrameInfo["status"] = pProcessData->iStatus; } MyUtils::getins()->WriteJsonInfo(jvFrameInfo, strFilePath); //第一步处理结束后, push端口1,做复制图片文本数据和图片上传处理。 if (jvFrameInfo["step1Finish"].asBool()) { iRet = outputQueMap_[strPort1_]->push(std::static_pointer_cast(pProcessData), true); } if (pProcessData->iDataSource == 0 && pPostData->iModelType == MODELTYPE_NUM) { DealTrainSpaceInfo(pProcessData, jvStep1Space); if (pProcessData->bIsEnd) { //最后一节处理下前一节信息 if (!bDealCenterFlag_ && vecParationInfo_.size() > 0) { LogDebug << "lastFrameid:" << vecParationInfo_[0].modelSpaceFrame << " frameid:" << pProcessData->iFrameId; DealCenterSpace(vecParationInfo_, pProcessData); } if (!bPushIsEnd_) { std::shared_ptr pPartionInfo = std::make_shared(); pPartionInfo->iRate = pProcessData->iRate; pPartionInfo->i64EndTimeStamp = pProcessData->i64TimeStamp; pPartionInfo->modelSpaceFrame = pProcessData->iFrameId; pPartionInfo->bmodelconfirmed = true; pPartionInfo->strTrainDate = pProcessData->strTrainDate; pPartionInfo->strTrainName = pProcessData->strTrainName; pPartionInfo->bIsEnd = pProcessData->bIsEnd; pPartionInfo->nStatus = ((pProcessData->iStatus == TRAINSTATUS_STOP) ? TRAIN_PAUSE : iDirection_); //最后一节和倒数第二节之间的间隔未能识别时,此时也需要通过车号属性切分下。 SplitTrainByNumPro(pPartionInfo, pProcessData); LogWarn << "--------- 向Paration 发送数据 --------"; outputQueMap_[strPort0_]->push(std::static_pointer_cast(pPartionInfo), true); iPushSpaceFrameId_ = pPartionInfo->modelSpaceFrame; bPushIsEnd_ = pPartionInfo->bIsEnd; LogDebug << "pushSpaceFrameId:" << iPushSpaceFrameId_ << " timeStamp:" << pPartionInfo->i64EndTimeStamp << " ltx:" << pPartionInfo->fLTX << " rbx:" << pPartionInfo->fRBX << " bPushIsEnd:" << bPushIsEnd_; } InitParam(); } } } return APP_ERR_OK; }