Train_Identify/nvidia_ascend_engine/common_engine/SaveEngine/SaveImgEngine.cpp

168 lines
5.8 KiB
C++
Raw Permalink 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 "SaveImgEngine.h"
using namespace ai_matrix;
SaveImgEngine::SaveImgEngine() {}
SaveImgEngine::~SaveImgEngine() {}
APP_ERROR SaveImgEngine::Init()
{
bUseEngine_ = true;
dataSourceConfig_ = MyYaml::GetIns()->GetDataSourceConfigById(engineId_); //获取摄像机参数
if (!dataSourceConfig_.bUse)
{
bUseEngine_ = false;
LogWarn << "engineId_:" << engineId_ << " not use engine";
return APP_ERR_OK;
}
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
iPicQuality = MyYaml::GetIns()->GetIntValue("gc_save_pic_quality");
iPushDirection_ = MyYaml::GetIns()->GetIntValue("gc_push_direction");
LogInfo << "SaveImgEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR SaveImgEngine::DeInit()
{
if (!bUseEngine_)
{
LogWarn << "engineId_:" << engineId_ << " not use engine";
return APP_ERR_OK;
}
LogInfo << "SaveImgEngine DeInit ok";
return APP_ERR_OK;
}
APP_ERROR SaveImgEngine::Process()
{
if (!bUseEngine_)
{
LogWarn << "engineId_:" << engineId_ << " not use engine";
return APP_ERR_OK;
}
vector<int> compression_params;
compression_params.push_back(cv::IMWRITE_JPEG_QUALITY); //选择jpeg
compression_params.push_back(iPicQuality); //图片质量
iDirection_ = DIRECTION_UNKNOWN;
int iRet = APP_ERR_OK;
while (!isStop_)
{
std::shared_ptr<void> pvoidd = nullptr;
inputQueMap_[strPort0_]->pop(pvoidd);
if (nullptr == pvoidd)
{
usleep(1000);
continue;
}
std::shared_ptr<SaveImgData> pSaveImgData = std::static_pointer_cast<SaveImgData>(pvoidd);
//如果设置了方向则方向不对直接过滤但结束帧不能过滤需流转到后面Engine保证后面处理正确。
if (iDirection_ == DIRECTION_UNKNOWN)
{
size_t iPos = pSaveImgData->strImgPath.rfind("/");
if (iPos != std::string::npos)
{
std::string strFilePath = pSaveImgData->strImgPath.substr(0, iPos + 1) + "direction.txt";
Json::Value jvDirectionInfo;
if (MyUtils::getins()->ReadJsonInfo(jvDirectionInfo, strFilePath, 0))
{
iDirection_ = jvDirectionInfo["direction"].asInt();
}
}
}
if (!pSaveImgData->bIsEnd)
{
if (!(iDirection_ == DIRECTION_UNKNOWN || iDirection_ == iPushDirection_ || iPushDirection_ == DIRECTION_UNKNOWN))
{
LogDebug << "image:" << pSaveImgData->strImgPath << "/" << pSaveImgData->strImgName << " no sava continue.";
continue;
}
}
else
{
iDirection_ = DIRECTION_UNKNOWN;
}
//图片绝对路径
if (pSaveImgData->strImgPath.back() != '/')
{
pSaveImgData->strImgPath += "/";
}
std::string strImgFilePath = pSaveImgData->strImgPath + pSaveImgData->strImgName;
std::string strTxtFilePath = pSaveImgData->strImgPath + std::to_string(pSaveImgData->iFrameId) + ".txt";
//1. 图片编码
uint32_t iWidth = 0;
uint32_t iHeight = 0;
int iRate = 0;
int iStatus = TRAINSTATUS_RUN;
//2. 创建保存路径
if (!MyUtils::getins()->CreateDirPath(pSaveImgData->strImgPath))
{
LogError << "engineId:" << engineId_ << " CreateDirPath err img:" << strImgFilePath;
continue;
}
// 3.保存图片
if (pSaveImgData->pData != nullptr && pSaveImgData->iSize != 0)
{
cv::Mat matBGR(pSaveImgData->iHeight, pSaveImgData->iWidth, CV_8UC3, static_cast<uint8_t *>(pSaveImgData->pData.get())); //RGB
iWidth = pSaveImgData->iWidth;
iHeight = pSaveImgData->iHeight;
// cv::Mat mtOutImage;
// cv::cvtColor(cvimg, mtOutImage, cv::COLOR_RGB2BGR);
cv::imwrite(strImgFilePath, matBGR, compression_params);
//图片旋转
if (dataSourceConfig_.iRotate != 0)
{
cv::Mat cvRotateImg;
if (dataSourceConfig_.iRotate == 90) //顺时针旋转90
{
cv::transpose(matBGR, cvRotateImg);
cv::flip(cvRotateImg, cvRotateImg, 1);
iWidth = pSaveImgData->iHeight;
iHeight = pSaveImgData->iWidth;
}
else if (dataSourceConfig_.iRotate == 180) //顺时针旋转180
{
cv::flip(matBGR, cvRotateImg, -1);
}
else if (dataSourceConfig_.iRotate == 270) //顺时针旋转270
{
cv::transpose(matBGR, cvRotateImg);
cv::flip(cvRotateImg, cvRotateImg, 0);
iWidth = pSaveImgData->iHeight;
iHeight = pSaveImgData->iWidth;
}
std::string strRotatePath = pSaveImgData->strImgPath + std::to_string(pSaveImgData->iFrameId) + "_rotate.jpg";
cv::imwrite(strRotatePath, cvRotateImg, compression_params);
}
Json::Value jvFrameInfo;
jvFrameInfo["timeStamp"] = pSaveImgData->i64TimeStamp;
jvFrameInfo["status"] = iStatus;
jvFrameInfo["direction"] = pSaveImgData->iDirection;
jvFrameInfo["width"] = iWidth;
jvFrameInfo["height"] = iHeight;
jvFrameInfo["rate"] = iRate;
jvFrameInfo["isEnd"] = pSaveImgData->bIsEnd;
MyUtils::getins()->WriteJsonInfo(jvFrameInfo, strTxtFilePath);
// LogDebug << "engineId:" << engineId_ << " save success txt:" << strTxtFilePath;
}
}
return APP_ERR_OK;
}