Train_Identify/nvidia_ascend_engine/common_engine/DataSourceEngine/ReadImgEngine.cpp

160 lines
5.0 KiB
C++

#include "ReadImgEngine.h"
#include <algorithm>
#include <string>
#include <regex>
#include <boost/filesystem.hpp>
#include <sys/stat.h>
#include "myutils.h"
using namespace ai_matrix;
namespace
{
//按照文件名排序
bool CompareFileName(const std::string &sParam1, const std::string &sParam2)
{
int iPos1 = sParam1.find(".");
int iPos11 = sParam1.find_last_of("/");
int iPos2 = sParam2.find(".");
int iPos22 = sParam2.find_last_of("/");
std::string sFileName1 = sParam1.substr(iPos11+1, iPos1-iPos11-1);
std::string sFileName2 = sParam2.substr(iPos22+1, iPos2-iPos22-1);
return (atoi(sFileName1.c_str()) < atoi(sFileName2.c_str()));
}
}
ReadImgEngine::ReadImgEngine() {}
ReadImgEngine::~ReadImgEngine() {}
APP_ERROR ReadImgEngine::Init()
{
bUseEngine_ = true;
dataSourceConfig_ = MyYaml::GetIns()->GetDataSourceConfigById(engineId_); //获取摄像机参数
if (MyYaml::GetIns()->GetStringValue("gc_data_source") != "images" || !dataSourceConfig_.bUse)
{
bUseEngine_ = false;
LogWarn << "engineId_:" << engineId_ << " not use engine";
return APP_ERR_OK;
}
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
LogInfo << "engineId_:" << engineId_ << " ReadImgEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR ReadImgEngine::DeInit()
{
if (!bUseEngine_)
{
LogWarn << "engineId_:" << engineId_ << " not use engine";
return APP_ERR_OK;
}
LogInfo << "engineId_:" << engineId_ << " ReadImgEngine DeInit ok";
return APP_ERR_OK;
}
void ReadImgEngine::RecursionReadDir(const std::string &strDir)
{
boost::filesystem::directory_iterator end_itr;
for (boost::filesystem::directory_iterator itr(strDir); itr != end_itr; ++itr)
{
if (boost::filesystem::is_directory(*itr)) //文件夹
{
RecursionReadDir(itr->path().string());
}
else
{
std::string strExt = itr->path().extension().string();
if (strExt.compare(".jpg") == 0)
{
vecFiles_.push_back(itr->path().string()); //保存绝对路径
}
}
}
}
std::string ReadImgEngine::GetFileName(const std::string &strParam)
{
int iPos = strParam.find(".");
int iPos1 = strParam.find_last_of("/");
return strParam.substr(iPos1 + 1, iPos - iPos1 - 1);
}
APP_ERROR ReadImgEngine::Process()
{
if (!bUseEngine_)
{
LogWarn << "engineId_:" << engineId_ << " not use engine";
return APP_ERR_OK;
}
int iRet = APP_ERR_OK;
RecursionReadDir(dataSourceConfig_.strUrl); //递归读取文件夹
if (vecFiles_.size() == 0)
{
LogError << "engineId_:" << engineId_ << " no file";
return APP_ERR_COMM_FAILURE;
}
std::sort(vecFiles_.begin(), vecFiles_.end(), CompareFileName);
LogInfo << "engineId_:" << engineId_ << " vecFiles_ size: " << vecFiles_.size();
int iFileIndex = 0; //文件序号
while (!isStop_)
{
std::string strFilePath = vecFiles_.at(iFileIndex);
cv::Mat matBGR = cv::imread(strFilePath);
//组织数据
std::shared_ptr<ProcessData> pProcessData = std::make_shared<ProcessData>();
pProcessData->iWidth = matBGR.cols;
pProcessData->iHeight = matBGR.rows;
pProcessData->iRate = 25;
pProcessData->i64TimeStamp = MyUtils::getins()->GetCurrentTimeMillis();
pProcessData->iDataSource = engineId_;
uint32_t iBGRSize = pProcessData->iWidth * pProcessData->iHeight * 3;
void *pBGRBuffer = nullptr;
pBGRBuffer = new uint8_t[iBGRSize];
memcpy(pBGRBuffer, matBGR.data, iBGRSize);
pProcessData->pData.reset(pBGRBuffer, [](void *data){if(data) {delete[] data; data = nullptr;} }); // 智能指针管理内存
pProcessData->iSize = iBGRSize;
// //读取文件内容
// RawData rawData;
// iRet = ReadFile(strFilePath, rawData);
// if (iRet != APP_ERR_OK)
// {
// LogError << "engineId_:" << engineId_ << " Failed to read image on " << strFilePath << ", iRet = " << iRet << ".";
// return iRet;
// }
// //组织数据
// std::shared_ptr<FrameData> pFrameData = std::make_shared<FrameData>();
// pFrameData->iDataSource = engineId_;
// pFrameData->iFrameId = iFileIndex + 1;
// pFrameData->iSize = rawData.lenOfByte;
// pFrameData->pData = rawData.data;
// pFrameData->i64TimeStamp = MyUtils::getins()->GetCurrentTimeMillis();
iRet = outputQueMap_[strPort0_]->push(std::static_pointer_cast<void>(pProcessData));
iFileIndex = (iFileIndex + 1) % vecFiles_.size();
if (iFileIndex == 0)
{
LogInfo << "engineId_:" << engineId_ << " read images finish ";
while (!isStop_)
{
usleep(100000); //100ms
}
//break; //只发布一遍
}
//模拟1秒25帧
usleep(40000); //40ms
}
return APP_ERR_OK;
}