Train_Identify_arm/nvidia_ascend_engine/common_engine/TrainAnaEngine/TrainParationMgr.cpp

257 lines
10 KiB
C++
Raw Normal View History

2024-06-19 06:35:05 +00:00
#include "TrainParationMgr.h"
using namespace ai_matrix;
TrainParationMgr::TrainParationMgr() {}
TrainParationMgr::~TrainParationMgr() {}
APP_ERROR TrainParationMgr::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
strResultPath_ = MyYaml::GetIns()->GetPathValue("gc_result_path");
//获取主摄像头信息
mainCfg_ = MyYaml::GetIns()->GetDataSourceConfigById(0);
nFrameRate = 25;
InitParam();
nTailPixOffset = getTailPixOffset();
LogInfo << "TrainParationMgr Init ok";
return APP_ERR_OK;
}
APP_ERROR TrainParationMgr::DeInit()
{
LogInfo << "TrainParationMgr DeInit ok";
return APP_ERR_OK;
}
int TrainParationMgr::getTailPixOffset()
{
LogInfo << "TrainParationMgr getTailPixOffset start";
// 单位计算
// 帧宽像素/米
float fframewidth_meter = ((METHOD_BASE_WIDTH * 1.0) / (TRAIN_IN_CAMERA_WIDTH));
// 车尾车钩像素位置
float fOffsetPosistion = TRAIN_WIDTH * fframewidth_meter;
int nretOffset = (int)fOffsetPosistion;
return nretOffset;
}
/**
* ()
* inParam : N/A
* outParam: N/A
* return : N/A
*/
void TrainParationMgr::InitParam()
{
}
/**
*
* inParam : (:/)
* inParam :
* inParam : (:/)
* outParam: N/A
* return :
*/
int TrainParationMgr::getCouplerOffsetPosition(float fspeed, int nframeindex)
{
LogInfo << "TrainAnaEngine getCouplerOffsetPosition start";
//单位换算
// 米/秒 -> 米/帧
// 米/帧 = 米/秒 * 秒/帧(即:1/帧率)
float fmeter_frame = fspeed / nFrameRate;
// 米/帧 -> 像素/帧
// 像素/帧 = 米/帧 * 像素/米
float fpix_frame = fmeter_frame * (METHOD_BASE_WIDTH / TRAIN_IN_CAMERA_WIDTH);
int nretPixOffet = (int)fpix_frame;
nretPixOffet = nretPixOffet * nframeindex;
LogInfo << "TrainAnaEngine getCouplerOffsetPosition nretPixOffet:" << nretPixOffet;
LogInfo << "TrainAnaEngine getCouplerOffsetPosition end";
return nretPixOffet;
}
/**
*
* inParam : (:/)
* inParam :
* inParam : (:/)
* outParam: N/A
* return :
*/
int TrainParationMgr::getCouplerOffsetPix(float fspeed, int noffsetPix)
{
LogInfo << "TrainAnaEngine getCouplerOffsetPix start";
LogInfo << "TrainAnaEngine getCouplerOffsetPix fspeed:" << fspeed;
// LogInfo << "TrainAnaEngine getCouplerOffsetPix start:" << nframeindex;
//单位换算
// 米/秒 -> 米/帧
// 米/帧 = 米/秒 * 秒/帧(即:1/帧率)
float fmeter_frame = fspeed / nFrameRate;
LogInfo << "TrainAnaEngine getCouplerOffsetPix fmeter_frame:" << fmeter_frame;
// 米/帧 -> 像素/帧
// 像素/帧 = 米/帧 * 像素/米
float fpix_frame = fmeter_frame * (METHOD_BASE_WIDTH / TRAIN_IN_CAMERA_WIDTH);
LogInfo << "TrainAnaEngine getCouplerOffsetPix fpix_frame:" << fpix_frame;
int nretPixOffet = (int)fpix_frame;
nretPixOffet = (noffsetPix - (METHOD_BASE_WIDTH / 2)) / nretPixOffet;
LogInfo << "TrainAnaEngine getCouplerOffsetPix nretPixOffet:" << nretPixOffet;
LogInfo << "TrainAnaEngine getCouplerOffsetPix end";
return nretPixOffet;
}
/**
*
* inParam : (:/)
* inParam :
* inParam : (:/)
* outParam: N/A
* return :
*/
int TrainParationMgr::getOffsetFrame(float fspeed, int width, int nFrameRate)
{
LogInfo << "TrainAnaEngine getOffsetFrame start";
LogInfo << "TrainAnaEngine getOffsetFrame fspeed:" << fspeed;
LogInfo << "TrainAnaEngine getOffsetFrame width:" << width;
LogInfo << "TrainAnaEngine getOffsetFrame nFrameRate:" << nFrameRate;
//LogInfo << "TrainAnaEngine getOffsetFrame nLatestFrame:" << nLatestFrame;
//偏移值 = (中间到边缘的宽度(米) / 速度(米/秒)->时间(秒))* 帧率(帧/秒)
float ftmp = width * (float) nFrameRate;
LogInfo << "TrainAnaEngine getOffsetFrame start end:" << ftmp;
ftmp = ftmp / fspeed;
LogInfo << "TrainAnaEngine getOffsetFrame start end:" << ftmp;
int nRet = (int) ftmp;
LogInfo << "TrainAnaEngine getOffsetFrame start end:" << nRet;
return nRet;
}
APP_ERROR TrainParationMgr::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<PartionInfo> pPartionInfo = std::static_pointer_cast<PartionInfo>(pVoidData0);
int nSize = lstPartInfo.size();
int nPartionIndex = nSize - 1;
//当然车厢通过的数量
if (nSize == 0) {
PartionInfo stTempInfo;
stTempInfo.endframe = pPartionInfo->modelSpaceFrame;
stTempInfo.i64EndTimeStamp = pPartionInfo->i64EndTimeStamp;
stTempInfo.nindex = 1;
//第一节车厢开始帧为跳帧数,开始帧时间设置为来车时间
stTempInfo.startframe = mainCfg_.iSkipInterval;
std::string strTemp = pPartionInfo->strTrainDate + " " + pPartionInfo->strTrainName;
stTempInfo.i64StartTimeStamp = MyUtils::getins()->GetParamTimeMilliSeconds(strTemp);
stTempInfo.fspeed = TRAIN_DEFAULT_SPEED;
stTempInfo.fLTX = (abs(pPartionInfo->fLTX - pPartionInfo->fRBX) / 2) + pPartionInfo->fLTX;
lstPartInfo.push_back(stTempInfo);
//lstPartInfo.push_back(stTempInfo);
nPartionIndex++;
}
lstPartInfo[nPartionIndex].i64EndTimeStamp = pPartionInfo->i64EndTimeStamp;
lstPartInfo[nPartionIndex].endframe = pPartionInfo->modelSpaceFrame;
// 根据开始帧时间戳和结束帧时间错 计算当节车厢的行车速度
// 根据时间戳计算时间差
float nTimePassed = (abs(lstPartInfo[nPartionIndex].i64EndTimeStamp - lstPartInfo[nPartionIndex].i64StartTimeStamp)) * 1.0;
//防止停车导致速度过小
if(pPartionInfo->nStatus != TRAIN_PAUSE && nTimePassed <= 50000) {
lstPartInfo[nPartionIndex].fspeed = (TRAIN_WIDTH * 1000.0) /nTimePassed;
} else {
if (nPartionIndex >= 1){
lstPartInfo[nPartionIndex].fspeed = lstPartInfo[nPartionIndex - 1].fspeed / 3;
} else {
lstPartInfo[nPartionIndex].fspeed = TRAIN_DEFAULT_SPEED / 10;
}
}
//
//nSamePartionIgnoreCount = (nTimePassed / (3 * 5000)) * nFrameRate;
// 结束帧为当前帧再往后 (除以2的原因中间为车钩车钩后的车体宽度为整个镜头的宽度除以2)
lstPartInfo[nPartionIndex].bmodelconfirmed = true;
/// write json info to file
//先读取文本内容,追加新的信息后再写入
//划分信息 JSON格式
Json::Value jvPartionInfo;
//JSON保存路径
std::string strFilePath;
//检测到车厢划分信息
strFilePath = strResultPath_ + pPartionInfo->strTrainDate + "/" + pPartionInfo->strTrainName + "/"
+ std::to_string(nPartionIndex + 1) + ".txt";
LogInfo << "TrainAnaEngine Process lstPartInfo[nPartionIndex].startframe" << lstPartInfo[nPartionIndex].startframe ;
LogInfo << "TrainAnaEngine Process lstPartInfo[nPartionIndex].endframe" << lstPartInfo[nPartionIndex].endframe;
PartionInfo stTempInfo;
// 开始记录新的一节车厢信息(从索引变成序号+1 ,新增一节车厢信息+1)
stTempInfo.nindex = nPartionIndex + 2;
// 上一节车厢的结束帧 - (偏移帧 = (镜头内的车体宽度/ (速度) -> 通过时间) * 帧/秒 ) 作为下一节车厢的开始帧
int ntempOffsetFrame = lstPartInfo[nPartionIndex].endframe;
stTempInfo.startframe = ntempOffsetFrame;
stTempInfo.i64StartTimeStamp = pPartionInfo->i64EndTimeStamp;
// 初始化下一节的结束帧
//stTempInfo.endframe = 0;
lstPartInfo.push_back(stTempInfo);
// 记录过车日期
jvPartionInfo["trainDate"] = pPartionInfo->strTrainDate;
// 记录过车时间
jvPartionInfo["trainName"] = pPartionInfo->strTrainName;
// 记录车厢节数 (索引从0开始 所以这里+1)
jvPartionInfo["trainNo"] = nPartionIndex + 1;
// 记录行车开始帧
jvPartionInfo["startFrameId"] = lstPartInfo[nPartionIndex].startframe;
jvPartionInfo["startTimeStamp"] = lstPartInfo[nPartionIndex].i64StartTimeStamp;
// 记录行车结束帧
jvPartionInfo["endFrameId"] = lstPartInfo[nPartionIndex].endframe;
jvPartionInfo["endTimeStamp"] = lstPartInfo[nPartionIndex].i64EndTimeStamp;
// 记录车厢是否完全通过
jvPartionInfo["isEnd"] = pPartionInfo->bIsEnd;
//是否是间隔模型切分的车厢
jvPartionInfo["modelconfirmed"] = pPartionInfo->bmodelconfirmed;
// 记录当前车厢的信息到JSON文件
MyUtils::getins()->WriteJsonInfo(jvPartionInfo, strFilePath);
std::shared_ptr<TrainRange> pTrainRange = std::make_shared<TrainRange>();
pTrainRange->strTrainDate = jvPartionInfo["trainDate"].asString();
pTrainRange->strTrainName = jvPartionInfo["trainName"].asString();
pTrainRange->iTrainIndex = jvPartionInfo["trainNo"].asInt();
pTrainRange->iStartFrameId = jvPartionInfo["startFrameId"].asInt();
pTrainRange->i64StartTimeStamp = jvPartionInfo["startTimeStamp"].asInt64();
pTrainRange->iEndFrameId = jvPartionInfo["endFrameId"].asInt();
pTrainRange->i64EndTimeStamp = jvPartionInfo["endTimeStamp"].asInt64();
pTrainRange->bIsEnd = jvPartionInfo["isEnd"].asBool();
pTrainRange->bmodelconfirmed = jvPartionInfo["modelconfirmed"].asBool();
2024-06-19 06:41:40 +00:00
iRet = outputQueMap_[strPort0_]->push(std::static_pointer_cast<void>(pTrainRange), true);
2024-06-19 06:35:05 +00:00
if (pPartionInfo->bIsEnd) {
lstPartInfo.clear();
}
}
return APP_ERR_OK;
}