Train_Identify_arm/nvidia_ascend_engine/common_engine/TrainAnaEngine/PostTrainAnaEngine.cpp

119 lines
4.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "PostTrainAnaEngine.h"
using namespace ai_matrix;
PostTrainAnaEngine::PostTrainAnaEngine() {}
PostTrainAnaEngine::~PostTrainAnaEngine() {}
APP_ERROR PostTrainAnaEngine::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
strResultPath_ = MyYaml::GetIns()->GetPathValue("gc_result_path");
std::map<int, ai_matrix::DataSourceConfig> mapUseDataSouceCfg = MyYaml::GetIns()->GetUseDataSourceConfig();
for (auto iter = mapUseDataSouceCfg.begin(); iter != mapUseDataSouceCfg.end(); iter++)
{
//端口0是主摄像头push存图需给其他使用的数据源push(来车/结束)通知
if (iter->first != 0)
{
setPushPort_.insert(iter->first);
}
else
{
dataSourceCfg_ = iter->second;
}
}
InitParam();
LogInfo << "PostTrainAnaEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR PostTrainAnaEngine::DeInit()
{
LogInfo << "PostTrainAnaEngine DeInit ok";
return APP_ERR_OK;
}
/**
* 参数初始化(列车结束时需调用)
* inParam : N/A
* outParam: N/A
* return : N/A
*/
void PostTrainAnaEngine::InitParam()
{
iMoveDataNO_ = dataSourceCfg_.iSkipInterval;
}
APP_ERROR PostTrainAnaEngine::Process()
{
int iRet = APP_ERR_OK;
while (!isStop_)
{
std::shared_ptr<void> pVoidData0 = nullptr;
inputQueMap_[strPort0_]->pop(pVoidData0);
if (nullptr == pVoidData0)
{
usleep(1000); //1ms
continue;
}
std::shared_ptr<DecodedData> pDecodedData = std::static_pointer_cast<DecodedData>(pVoidData0);
if (pDecodedData->iStatus == TRAINSTATUS_NO && !pDecodedData->bIsEnd)
{
continue;
}
//组织数据, push其他端口 (只通知2次车来一次车结束一次)
if (iMoveDataNO_ == dataSourceCfg_.iSkipInterval || pDecodedData->bIsEnd)
{
LogDebug << "traindate:" << pDecodedData->strTrainDate << " trainname:" << pDecodedData->strTrainName
<< " frameid:" << iMoveDataNO_ << " isEnd:" << pDecodedData->bIsEnd;
uint32_t iFrameId = iMoveDataNO_ / dataSourceCfg_.iSkipInterval * dataSourceCfg_.iSkipInterval;
std::shared_ptr<MoveData> pMoveData = std::make_shared<MoveData>();
pMoveData->iFrameId = iFrameId; //当前帧号
pMoveData->i64TimeStamp = pDecodedData->i64TimeStamp;
pMoveData->bHasTrain = true;
pMoveData->bIsEnd = pDecodedData->bIsEnd;
pMoveData->strTrainDate = pDecodedData->strTrainDate;
pMoveData->strTrainName = pDecodedData->strTrainName;
pMoveData->iDirection = pDecodedData->iDirection;
for (auto iter = setPushPort_.begin(); iter != setPushPort_.end(); iter++)
{
outputQueMap_[engineName_ + "_" + std::to_string(engineId_) + "_" + std::to_string(*iter)]->push(std::static_pointer_cast<void>(pMoveData));
}
outputQueMap_[engineName_ + "_" + std::to_string(engineId_) + "_5"]->push(std::static_pointer_cast<void>(pMoveData));
}
//跳帧 存图
if (iMoveDataNO_ % dataSourceCfg_.iSkipInterval == 0 || pDecodedData->bIsEnd)
{
// push端口,存图
std::shared_ptr<SaveImgData> pSaveImgData = std::make_shared<SaveImgData>();
pSaveImgData->pDecodeData = pDecodedData;
pSaveImgData->iFrameId = iMoveDataNO_; //帧号
char szCameraNo[4] = {0};
sprintf(szCameraNo, "%03d", pDecodedData->iDataSource + 1);
pSaveImgData->strImgPath = strResultPath_ + pDecodedData->strTrainDate + "/" + pDecodedData->strTrainName + "/" + szCameraNo;
pSaveImgData->strImgName = std::to_string(pSaveImgData->iFrameId) + ".jpg";
pSaveImgData->bIsEnd = pDecodedData->bIsEnd;
pSaveImgData->bSaveToFtp = true;
pSaveImgData->i64TimeStamp = pDecodedData->i64TimeStamp;
pSaveImgData->iDirection = pDecodedData->iDirection;
iRet = outputQueMap_[strPort0_]->push(std::static_pointer_cast<void>(pSaveImgData));
}
iMoveDataNO_++;
//结束帧或停车时需重新初始化相关信息
if (pDecodedData->bIsEnd)
{
InitParam();
}
}
return APP_ERR_OK;
}