From ad4bc5cfc717d98e06c60d2a497cac14ec7a5e4a Mon Sep 17 00:00:00 2001 From: liusiyang Date: Tue, 13 Oct 2026 16:13:17 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E5=AD=98=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AlgorithmModule/include/AI_Edge_Algin.h | 2 + AlgorithmModule/include/ImgCheckAnalysisy.hpp | 3 +- AlgorithmModule/include/Pin_QX_Det.h | 9 +++++ AlgorithmModule/src/AI_Edge_Algin.cpp | 25 ++++++------- AlgorithmModule/src/ImgCheckAnalysisy.cpp | 20 ++++------ AlgorithmModule/src/Pin_QX_Det.cpp | 37 +++++++++++++++++++ ConfigModule/include/CheckConfigDefine.h | 16 ++++---- ConfigModule/src/JsonConfig.cpp | 10 ++--- 8 files changed, 81 insertions(+), 41 deletions(-) diff --git a/AlgorithmModule/include/AI_Edge_Algin.h b/AlgorithmModule/include/AI_Edge_Algin.h index ed9a144..ddec88c 100644 --- a/AlgorithmModule/include/AI_Edge_Algin.h +++ b/AlgorithmModule/include/AI_Edge_Algin.h @@ -94,6 +94,7 @@ public: { int ncamId; // 相机ID BaseCheckFunction *pBaseCheckFunction; + std::string strProductID; // 产品ID(存图文件名用) std::string strChannel; // 通道 int nthresholdvalue; // 背景阈值 int nAIErodesize; // 边缘腐蚀强度 @@ -116,6 +117,7 @@ public: saveProcessImg = Save_Close; bUseDrawRoi_Check = false; drawRoi = cv::Rect(0, 0, 0, 0); + strProductID = ""; if (!drawMask.empty()) { drawMask.release(); diff --git a/AlgorithmModule/include/ImgCheckAnalysisy.hpp b/AlgorithmModule/include/ImgCheckAnalysisy.hpp index a787fe6..ff03a84 100644 --- a/AlgorithmModule/include/ImgCheckAnalysisy.hpp +++ b/AlgorithmModule/include/ImgCheckAnalysisy.hpp @@ -286,8 +286,7 @@ private: std::vector SmallRoiList; - std::string m_strRootPath_TA_cls; - std::string m_strRootPath_CA_cls; + std::string m_strRootPath_KK_cls; std::string m_strSavePath_cls; std::string m_strLastDate; diff --git a/AlgorithmModule/include/Pin_QX_Det.h b/AlgorithmModule/include/Pin_QX_Det.h index e00eca5..bddf11b 100644 --- a/AlgorithmModule/include/Pin_QX_Det.h +++ b/AlgorithmModule/include/Pin_QX_Det.h @@ -59,6 +59,7 @@ public: BaseCheckFunction *pBaseCheckFunction; std::string strChannel; + std::string strProductID; // 产品ID(存图文件名用) bool bSaveResultImg; DetConfigResult() { @@ -68,6 +69,7 @@ public: { pBaseCheckFunction = NULL; strChannel = ""; + strProductID = ""; bSaveResultImg = false; } }; @@ -80,6 +82,7 @@ public: private: int InitModel_Pin(); + int creatsavedir(); private: bool m_bInitSucc; // 是否初始化成功 @@ -89,6 +92,12 @@ private: bool m_bshowimg; cv::Mat showimg; + std::string m_strRootPath_Pin; + std::string m_strSavePath_Pin; + std::string m_strLastDate; + + ImageStorage *m_pImageStorage; + std::shared_ptr AI_Factory; private: diff --git a/AlgorithmModule/src/AI_Edge_Algin.cpp b/AlgorithmModule/src/AI_Edge_Algin.cpp index b9451c7..da93db4 100644 --- a/AlgorithmModule/src/AI_Edge_Algin.cpp +++ b/AlgorithmModule/src/AI_Edge_Algin.cpp @@ -183,8 +183,8 @@ AI_Edge_Algin::AI_Edge_Algin(std::shared_ptr &log_ref) m_bModelSucc = false; m_bModel_Mark_Succ = false; m_bshowimg = false; - m_strRootPath_Big = "/home/aidlux/BOE/Algin/"; - m_strRootPath_Mark = "/home/aidlux/BOE/MarkLine/"; + m_strRootPath_Big = "/home/aidlux/BOE/Algin/KK/"; + m_strRootPath_Mark = "/home/aidlux/BOE/MarkLine/KK/"; creatsavedir(); std::string m_strSavePath; @@ -364,6 +364,12 @@ int AI_Edge_Algin::Get_Edge(int AIModel_type, const cv::Mat &img, DetConfig *pDe cout << "imgSize: " << img.size() << ", " << "detImgSize: " << detImg.size() << ", " << "szSize: " << sz << endl; cv::resize(img, detImg, sz); + // 存图用: 通道转换(灰度化)之前的模型输入图(未开启存图时不克隆, 节省时间/内存) + cv::Mat saveInImg; + if (pDetConfig->pBaseCheckFunction->saveImg.bSaveAlginImg) + { + saveInImg = detImg.clone(); + } int re = 0; cv::Mat mask; // 模型输入要求单通道;原图为彩色时按 BGR 顺序转灰度(与 imread(path,0) 的亮度一致) @@ -387,19 +393,12 @@ int AI_Edge_Algin::Get_Edge(int AIModel_type, const cv::Mat &img, DetConfig *pDe if (pDetConfig->pBaseCheckFunction->saveImg.bSaveAlginImg) { creatsavedir(); - static int sdk = 0; - std::string str = m_strSavePath_Big + std::to_string(sdk) + "_" + pDetConfig->strChannel + "_Img.png"; - int sr = m_pImageStorage->addImage(str, detImg); + std::string str = m_strSavePath_Big + pDetConfig->strProductID + "_" + pDetConfig->strChannel + "_" + std::to_string(AIModel_type) + "_Img.png"; + int sr = m_pImageStorage->addImage(str, saveInImg); if (sr == 0) { - str = m_strSavePath_Big + std::to_string(sdk) + "_" + pDetConfig->strChannel + "_Img_mask.png"; - int sr = m_pImageStorage->addImage(str, mask, true); - sdk++; - if (sdk > 99999) - { - sdk = 0; - /* code */ - } + str = m_strSavePath_Big + pDetConfig->strProductID + "_" + pDetConfig->strChannel + "_" + std::to_string(AIModel_type) + "_Img_mask.png"; + m_pImageStorage->addImage(str, mask, true); } } diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index 9b38017..af6b93b 100644 --- a/AlgorithmModule/src/ImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ImgCheckAnalysisy.cpp @@ -40,8 +40,7 @@ ImgCheckAnalysisy::ImgCheckAnalysisy() m_pbaseCheckFunction = &m_AnalysisyConfig.baseFunction; m_strLastDate = ""; - m_strRootPath_TA_cls = "/home/aidlux/BOE/Cls/TA/"; - m_strRootPath_CA_cls = "/home/aidlux/BOE/Cls/CA/"; + m_strRootPath_KK_cls = "/home/aidlux/BOE/Cls/KK/"; creatsavedir(); m_pImageStorage = ImageStorage::getInstance(); m_nConfigIdx = -1; @@ -202,12 +201,10 @@ int ImgCheckAnalysisy::creatsavedir() return 0; } m_strLastDate = curDate; - m_strRootPath_TA_cls += m_strLastDate + "/"; - m_strRootPath_CA_cls += m_strLastDate + "/"; + m_strRootPath_KK_cls += m_strLastDate + "/"; for (int i = 0; i < AI_CLass_QX_NAME_count; i++) { - CheckUtil::CreateDir(m_strRootPath_TA_cls + std::to_string(i) + "/"); - CheckUtil::CreateDir(m_strRootPath_CA_cls + std::to_string(i) + "/"); + CheckUtil::CreateDir(m_strRootPath_KK_cls + std::to_string(i) + "/"); } return 0; } @@ -1680,18 +1677,13 @@ int ImgCheckAnalysisy::AI_QX_Class_Thread() // printf("AI Class num %d = %s %f\n", cls_num, strclassName.c_str(), result->cls_score); // 分类存图 开启。 - if (m_pbaseCheckFunction->saveImg.bSaveAlginImg) + if (m_pbaseCheckFunction->saveImg.bSaveClsImg) { std::string saveimgpaht = ""; - if (m_strCurDetChannel == "TA") { - saveimgpaht = m_strRootPath_TA_cls + std::to_string(cls_num) + "/" + std::to_string(CheckUtil::getcurTime()) + "_" + std::to_string(result->cls_score) + ".png"; - } - else - { - saveimgpaht = m_strRootPath_CA_cls + std::to_string(cls_num) + "/" + std::to_string(CheckUtil::getcurTime()) + "_" + std::to_string(result->cls_score) + ".png"; + saveimgpaht = m_strRootPath_KK_cls + std::to_string(cls_num) + "/" + std::to_string(CheckUtil::getcurTime()) + "_" + std::to_string(result->cls_score) + ".png"; } { @@ -1989,6 +1981,7 @@ int ImgCheckAnalysisy::Pin_Qx_Det(const cv::Mat &img) m_Edge_DetConfig.Init(); m_Edge_DetConfig.strChannel = m_strCurDetChannel; + m_Edge_DetConfig.strProductID = DetImgInfo_shareP->strImgProductID; m_Edge_DetConfig.pBaseCheckFunction = m_pbaseCheckFunction; m_Edge_DetConfig.bSaveResultImg = false; @@ -2932,6 +2925,7 @@ int ImgCheckAnalysisy::AI_Edge(const cv::Mat &img, cv::RotatedRect &outerRoi, cv config.bSaveResultImg = true; } config.strChannel = DetImgInfo_shareP->strChannel; + config.strProductID = DetImgInfo_shareP->strImgProductID; config.pBaseCheckFunction = m_pbaseCheckFunction; int re = m_pAI_Edge_Algin.Detect(img, &config, m_pEdge_Align_Result); if (re != 0) diff --git a/AlgorithmModule/src/Pin_QX_Det.cpp b/AlgorithmModule/src/Pin_QX_Det.cpp index 1b351bb..fa0df2e 100644 --- a/AlgorithmModule/src/Pin_QX_Det.cpp +++ b/AlgorithmModule/src/Pin_QX_Det.cpp @@ -10,6 +10,10 @@ Pin_QX_Det::Pin_QX_Det(std::shared_ptr &log_ref) { std::string m_strSavePath; AI_Factory = AIFactory::GetInstance(); + m_strLastDate = ""; + m_strRootPath_Pin = "/home/aidlux/BOE/Algin/Pin/"; + m_pImageStorage = ImageStorage::getInstance(); + creatsavedir(); } Pin_QX_Det::~Pin_QX_Det() { @@ -27,6 +31,12 @@ int Pin_QX_Det::GetPinMask(const cv::Mat &img, DetConfigResult *pDetConfig, Mat cout << "imgSize: " << img.size() << ", " << "detImgSize: " << detImg.size() << ", " << "szSize: " << sz << endl; cv::resize(img, detImg, sz); + // 存图用: 通道转换(灰度化)之前的模型输入图(未开启存图时不克隆, 节省时间/内存) + cv::Mat saveInImg; + if (pDetConfig->pBaseCheckFunction != NULL && pDetConfig->pBaseCheckFunction->saveImg.bSavePinImg) + { + saveInImg = detImg.clone(); + } int re = 0; if (detImg.channels() != 1) { @@ -41,11 +51,38 @@ int Pin_QX_Det::GetPinMask(const cv::Mat &img, DetConfigResult *pDetConfig, Mat return re123; } + // 参数 Align_Pin_Save 打开时, 保存Pin脚定位模型的输入/输出图(异步存图, 不阻塞检测) + // 输入图存未做通道转化(灰度化)之前的图; 文件名首位用产品ID + if (pDetConfig->pBaseCheckFunction != NULL && pDetConfig->pBaseCheckFunction->saveImg.bSavePinImg) + { + creatsavedir(); + std::string str = m_strSavePath_Pin + pDetConfig->strProductID + "_" + pDetConfig->strChannel + "_pin_in.png"; + int sr = m_pImageStorage->addImage(str, saveInImg); + if (sr == 0) + { + str = m_strSavePath_Pin + pDetConfig->strProductID + "_" + pDetConfig->strChannel + "_pin_out_mask.png"; + m_pImageStorage->addImage(str, mask, true); + } + } + if (pDetConfig->bSaveResultImg) { cv::imwrite(pDetConfig->strChannel +"_pin_" +"in.png", detImg); cv::imwrite(pDetConfig->strChannel +"_pin_" +"out_mask.png", mask); } + return 0; +} + +int Pin_QX_Det::creatsavedir() +{ + std::string curDate = CheckUtil::getCurrentDate(); + if (curDate == m_strLastDate) + { + return 0; + } + m_strLastDate = curDate; + m_strSavePath_Pin = m_strRootPath_Pin + curDate + "/"; + CheckUtil::CreateDir(m_strSavePath_Pin); return 0; } \ No newline at end of file diff --git a/ConfigModule/include/CheckConfigDefine.h b/ConfigModule/include/CheckConfigDefine.h index 1b71ffa..7167b88 100644 --- a/ConfigModule/include/CheckConfigDefine.h +++ b/ConfigModule/include/CheckConfigDefine.h @@ -1060,9 +1060,9 @@ struct Base_Function_SaveImg { bool bOpen; // 是否开启 - bool bSaveMarkImg; // mark 存图 bool bSaveClsImg; // 分类 存图 - bool bSaveAlginImg; // 分类 存图 + bool bSaveAlginImg; // 定位 存图 + bool bSavePinImg; // pin 存图 bool bSaveAIDetImg; // AI 检测残点图 存图(每个模型单独一级目录) Base_Function_SaveImg() @@ -1072,7 +1072,7 @@ struct Base_Function_SaveImg void Init() { bOpen = false; - bSaveMarkImg = false; + bSavePinImg = false; bSaveClsImg = false; bSaveAlginImg = false; bSaveAIDetImg = false; @@ -1082,21 +1082,21 @@ struct Base_Function_SaveImg { this->bOpen = tem.bOpen; - this->bSaveMarkImg = tem.bSaveMarkImg; + this->bSavePinImg = tem.bSavePinImg; this->bSaveClsImg = tem.bSaveClsImg; this->bSaveAlginImg = tem.bSaveAlginImg; this->bSaveAIDetImg = tem.bSaveAIDetImg; } void print(std::string str) { - printf("%s>>bOpen %d bSaveMarkImg %d bSaveClsImg %d bSaveAlginImg %d bSaveAIDetImg %d \n", str.c_str(), - bOpen, bSaveMarkImg, bSaveClsImg, bSaveAlginImg, bSaveAIDetImg); + printf("%s>>bOpen %d bSavePinImg %d bSaveClsImg %d bSaveAlginImg %d bSaveAIDetImg %d \n", str.c_str(), + bOpen, bSavePinImg, bSaveClsImg, bSaveAlginImg, bSaveAIDetImg); } std::string GetInfo(std::string str) { char buffer[256]; - sprintf(buffer, "%s>>bOpen %d bSaveMarkImg %d bSaveClsImg %d bSaveAlginImg %d bSaveAIDetImg %d \n", str.c_str(), - bOpen, bSaveMarkImg, bSaveClsImg, bSaveAlginImg, bSaveAIDetImg); + sprintf(buffer, "%s>>bOpen %d bSavePinImg %d bSaveClsImg %d bSaveAlginImg %d bSaveAIDetImg %d \n", str.c_str(), + bOpen, bSavePinImg, bSaveClsImg, bSaveAlginImg, bSaveAIDetImg); std::string str123 = buffer; return str123; } diff --git a/ConfigModule/src/JsonConfig.cpp b/ConfigModule/src/JsonConfig.cpp index 63c91dc..3c0664f 100644 --- a/ConfigModule/src/JsonConfig.cpp +++ b/ConfigModule/src/JsonConfig.cpp @@ -825,7 +825,7 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value) // _config.pinDet.print("pinDet"); // getchar(); } - if ("Det_Image_Save" == strCode) + if ("KK_Image_Save" == strCode) { auto value_f = value; // std::cout << value_f << std::endl; @@ -834,10 +834,6 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value) if (_config.saveImg.bOpen) { - if (value_f["form"]["SaveImg_Config"]["Mark_Save"]) - { - _config.saveImg.bSaveMarkImg = value_f["form"]["SaveImg_Config"]["Mark_Save"].asBool(); - } if (value_f["form"]["SaveImg_Config"]["Cls_Save"]) { _config.saveImg.bSaveClsImg = value_f["form"]["SaveImg_Config"]["Cls_Save"].asBool(); @@ -846,6 +842,10 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value) { _config.saveImg.bSaveAlginImg = value_f["form"]["SaveImg_Config"]["Align_Big_Save"].asBool(); } + if (value_f["form"]["SaveImg_Config"]["Align_Pin_Save"]) + { + _config.saveImg.bSavePinImg = value_f["form"]["SaveImg_Config"]["Align_Pin_Save"].asBool(); + } if (value_f["form"]["SaveImg_Config"]["AI_Det_Save"]) { _config.saveImg.bSaveAIDetImg = value_f["form"]["SaveImg_Config"]["AI_Det_Save"].asBool();