#include "PicAnalysis.h" #include "./utils/logger.hpp" PicAnalysis::PicAnalysis(/* args */) { aclInit(nullptr); } PicAnalysis::~PicAnalysis() { aclFinalize(); } int PicAnalysis::init(int dev_id) { int ret = m_vehicle_analysis.init(dev_id, 16); if(0 != ret){ return -1; } head_tail_param ht_param; ht_param.devId = dev_id; ht_param.max_batch = 16; ret = m_head_tail_algorithm.init(ht_param); if(0 != ret){ return -1; } ret = m_clothes_algorithm.init(dev_id); if(0 != ret){ return -1; } ACL_CALL(aclrtCreateContext(&m_ctx, 0), ACL_ERROR_NONE, SY_FAILED); ACL_CALL(aclrtSetCurrentContext(m_ctx), ACL_ERROR_NONE, SY_FAILED); ACL_CALL(aclrtCreateStream(&stream), ACL_SUCCESS, SY_FAILED); m_dvpp = new DvppProcess(); m_dvpp->InitResource(stream); return 0; } int PicAnalysis::analysis_sync(vector vec_file_path){ ACL_CALL(aclrtSetCurrentContext(m_ctx), ACL_ERROR_NONE, SY_FAILED); const int batch_size = vec_file_path.size(); vector vec_img; int ret = SY_FAILED; // ImageData 内部是智能指针,分析未处理完成前不得释放 ImageData dvpp_data[batch_size]; for (size_t i = 0; i < vec_file_path.size(); i++) { string file_path = vec_file_path[i]; ImageData src; ret = Utils::ReadImageFile(src, file_path); //将二进制图像读入内存,并读取宽高信息 if(ret != SY_SUCCESS){ LOG_ERROR("ReadImageFile failed!"); return -1; } ret = m_dvpp->CvtJpegToYuv420sp(dvpp_data[i], src); //解码 if(ret != SY_SUCCESS){ LOG_ERROR("CvtJpegToYuv420sp failed!"); return -1; } sy_img img; img.w_ = dvpp_data[i].width; img.h_ = dvpp_data[i].height; img.data_ = dvpp_data[i].data.get(); vec_img.push_back(img); } m_vehicle_analysis.detect(vec_img); vector head_tail_result; ret = m_head_tail_algorithm.detect(vec_img, head_tail_result); if (0 != ret) { LOG_ERROR("m_head_tail_algorithm failed!"); head_tail_result.clear(); } m_clothes_algorithm.detect(vec_img); return 0; } int PicAnalysis::release() { ACL_CALL(aclrtSetCurrentContext(m_ctx), ACL_ERROR_NONE, SY_FAILED); delete m_dvpp; m_dvpp = nullptr; if (stream != nullptr) { int ret = aclrtDestroyStream(stream); if (ret != ACL_SUCCESS) { LOG_ERROR("destroy stream failed"); } stream = nullptr; } aclrtDestroyContext(m_ctx); return 0; }