diff --git a/AlgorithmModule/include/ALLImgCheckAnalysisy.hpp b/AlgorithmModule/include/ALLImgCheckAnalysisy.hpp index 5de6285..bce3078 100644 --- a/AlgorithmModule/include/ALLImgCheckAnalysisy.hpp +++ b/AlgorithmModule/include/ALLImgCheckAnalysisy.hpp @@ -125,6 +125,9 @@ private: int InitAIFactory(); + // 初始化模板 + int InitTemplateMask(); + private: // 图片处理线程 std::shared_ptr ptr_thread_Run; @@ -170,6 +173,9 @@ private: std::string m_strTest; + // 模板信息 + cv::RotatedRect m_tplOuterRect; // 模板外接矩形 + std::vector> m_tplPinContours; // 模板 pin blob 轮廓点集 }; diff --git a/AlgorithmModule/include/ImageDetBase.h b/AlgorithmModule/include/ImageDetBase.h index 627251e..ff5cc08 100644 --- a/AlgorithmModule/include/ImageDetBase.h +++ b/AlgorithmModule/include/ImageDetBase.h @@ -3,7 +3,7 @@ * @Date: 2025-09-11 15:32:52 * @LastEditors: xiewenji 527774126@qq.com * @LastEditTime: 2025-09-14 17:41:14 - * @FilePath: /BOE_CELL_AOI_Detect/AlgorithmModule/include/ImageDetBase.h + * @FilePath: /BOE_ZB_SOCKET_Detect/AlgorithmModule/include/ImageDetBase.h * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #ifndef ImageDetBase_H_ diff --git a/AlgorithmModule/include/Pin_QX_Det.h b/AlgorithmModule/include/Pin_QX_Det.h index 1cc7370..b1c4615 100644 --- a/AlgorithmModule/include/Pin_QX_Det.h +++ b/AlgorithmModule/include/Pin_QX_Det.h @@ -3,7 +3,7 @@ * @Date: 2025-08-04 21:26:32 * @LastEditors: xiewenji 527774126@qq.com * @LastEditTime: 2025-08-13 16:05:08 - * @FilePath: /BOE_CELL_AOI/AlgorithmModule/include/Pin_QX_Det.h + * @FilePath: /BOE_ZB_SOCKET/AlgorithmModule/include/Pin_QX_Det.h * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ /* @@ -11,7 +11,7 @@ * @Date: 2025-08-04 21:26:32 * @LastEditors: xiewenji 527774126@qq.com * @LastEditTime: 2025-08-04 21:29:05 - * @FilePath: /BOE_CELL_AOI/AlgorithmModule/include/Pin_QX_Det.h + * @FilePath: /BOE_ZB_SOCKET/AlgorithmModule/include/Pin_QX_Det.h * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ /* @@ -179,6 +179,7 @@ public: Pin_QX_Det(std::shared_ptr& log_ref); ~Pin_QX_Det(); + int GetPinMask(const cv::Mat &img, DetConfigResult *pDetConfig, Mat &mask); int Detect(const cv::Mat &img, DetConfigResult *pDetConfig); private: diff --git a/AlgorithmModule/src/AI_Edge_Algin.cpp b/AlgorithmModule/src/AI_Edge_Algin.cpp index f7d5732..b3fef72 100644 --- a/AlgorithmModule/src/AI_Edge_Algin.cpp +++ b/AlgorithmModule/src/AI_Edge_Algin.cpp @@ -3,7 +3,7 @@ * @Date: 2025-09-11 15:32:52 * @LastEditors: xiewenji 527774126@qq.com * @LastEditTime: 2025-09-22 16:56:41 - * @FilePath: /BOE_CELL_AOI_Detect/AlgorithmModule/src/AI_Edge_Algin.cpp + * @FilePath: /BOE_ZB_SOCKET_Detect/AlgorithmModule/src/AI_Edge_Algin.cpp * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ diff --git a/AlgorithmModule/src/ALLImgCheckAnalysisy.cpp b/AlgorithmModule/src/ALLImgCheckAnalysisy.cpp index 3ed5e0b..5aef7c5 100644 --- a/AlgorithmModule/src/ALLImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ALLImgCheckAnalysisy.cpp @@ -128,6 +128,7 @@ ALLImgCheckAnalysisy::ALLImgCheckAnalysisy() { m_strTest = ""; + m_pdetlog = std::make_shared(); } ALLImgCheckAnalysisy::~ALLImgCheckAnalysisy() @@ -180,6 +181,12 @@ int ALLImgCheckAnalysisy::RunStart(void *pconfig1) m_nErrorCode = re; return m_nErrorCode; } + re = InitTemplateMask(); + if (CHECK_OK != re) + { + m_nErrorCode = re; + return m_nErrorCode; + } m_nErrorCode = CHECK_OK; printf(">>>> ALLImgCheckAnalysisy Start Succ \n"); @@ -307,6 +314,143 @@ int ALLImgCheckAnalysisy::InitAIFactory() return 0; } +int ALLImgCheckAnalysisy::InitTemplateMask() +{ + std::shared_ptr AI_Factory = AIFactory::GetInstance(); + if (!AI_Factory || !AI_Factory->Align_Outer || !AI_Factory->Pin_Loc) + { + return -1; + } + m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_1, "---Init Tpl---" , "start"); + + // 模板图路径,暂时使用固定路径 + string tplImgPath = "/home/aidlux/BOE/ZB_SOCKET/Tpl/tpl.bmp"; // 模板图片路径 + Mat tplImg = imread(tplImgPath, IMREAD_UNCHANGED); + if (tplImg.empty()) + { + m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_1, "", "Failed to load template image!"); + return -2; + } + + // 模板外接矩形,通过模型Align_Outer得到 + RotatedRect tplOuterRect; // 模板外接矩形 + std::shared_ptr pSocket_Align; + pSocket_Align = AI_Factory->Align_Outer; + cv::Size sz; + sz.width = pSocket_Align->input_0.width; + sz.height = pSocket_Align->input_0.height; + cv::Mat detImg; + cout << "imgSize: " << tplImg.size() << ", " << "detImgSize: " << detImg.size() << ", " << "szSize: " << sz << endl; + + cv::resize(tplImg, detImg, sz); + int re = 0; + cv::Mat mask; + if (detImg.channels() != 1) + { + cv::cvtColor(detImg, detImg, cv::COLOR_RGB2GRAY); + } + + re = pSocket_Align->AIDet(detImg, mask); + if (re != 0) + { + m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_1, "Init Tpl", "AICheck_Edge----error %d ", re); + int re123 = 100 + re; + return re123; + } + + // 找到最大轮廓 + bool found; + std::vector boundingBox = CheckUtil::getLargestContourROI(mask, found); + if (!found) + { + m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_1, "AI_Edge_Algin ", "No contours found!----error "); + return 4; + } + // 边缘轮廓点集还原为原图坐标,并计算得到RotateROI + if (sz.width <= 0 || sz.height <= 0) + { + m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_1, "AI_Edge_Algin ", "invalid model input size!----error "); + return 5; + } + // 检测小图 到 原图 的缩放比例 + const float scale_x = static_cast(tplImg.cols) / sz.width; + const float scale_y = static_cast(tplImg.rows) / sz.height; + // 轮廓点还原到原图坐标系 + std::vector srcContour; + srcContour.reserve(boundingBox.size()); + for (const auto &pt : boundingBox) + { + srcContour.emplace_back(pt.x * scale_x, pt.y * scale_y); + } + + if (srcContour.size() < 3) + { + m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_1, "AI_Edge_Algin ", "contour points too few!----error "); + return 6; + } + tplOuterRect = cv::minAreaRect(srcContour); + + // 模板Pinmask,通过模型Pin_Loc得到 + Mat tplPinMask; // 模板mask + std::shared_ptr pSocket_Pin; + pSocket_Pin = AI_Factory->Pin_Loc; + sz.width = pSocket_Pin->input_0.width; + sz.height = pSocket_Pin->input_0.height; + cv::Mat pinImg = tplImg(tplOuterRect.boundingRect()).clone(); // 裁剪模板图像为外接矩形区域 + cout << "imgSize: " << tplImg.size() << ", " << "pinImgSize: " << pinImg.size() << ", " << "szSize: " << sz << endl; + + cv::resize(pinImg, detImg, sz); + if (detImg.channels() != 1) + { + cv::cvtColor(detImg, detImg, cv::COLOR_RGB2GRAY); + } + + re = pSocket_Pin->AIDet(detImg, tplPinMask); + if (re != 0) + { + m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_1, "AI_Pin ", "AICheck_Pin----error %d ", re); + int re123 = 100 + re; + return re123; + } + + // 统计tplPinMask的blob边缘点,并绘制到tplImg上 + vector> pin_contours; + vector hierarchy; + cv::findContours(tplPinMask, pin_contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE); + // mask 尺寸 -> 裁剪图(pinImg) 尺寸 的缩放比例 + const float pin_scale_x = (tplPinMask.cols > 0) ? static_cast(pinImg.cols) / tplPinMask.cols : 0.0f; + const float pin_scale_y = (tplPinMask.rows > 0) ? static_cast(pinImg.rows) / tplPinMask.rows : 0.0f; + // 裁剪区域在 tplImg 上的偏移 + const cv::Point pin_offset = tplOuterRect.boundingRect().tl(); + // 将轮廓点从 mask 坐标系 映射回 tplImg 坐标系 + m_tplPinContours.clear(); + m_tplPinContours.reserve(pin_contours.size()); + for (size_t i = 0; i < pin_contours.size(); i++) + { + std::vector mapped; + mapped.reserve(pin_contours[i].size()); + for (const auto &pt : pin_contours[i]) + { + mapped.emplace_back(cvRound(pt.x * pin_scale_x) + pin_offset.x, + cvRound(pt.y * pin_scale_y) + pin_offset.y); + } + m_tplPinContours.push_back(mapped); + } + // 保存模板外接矩形 + m_tplOuterRect = tplOuterRect; + + // 绘制到 tplImg 上 + { + Mat showImg = tplImg.clone(); + rectangle(showImg, tplOuterRect.boundingRect(), Scalar(0, 0, 255), 2); + cv::drawContours(showImg, m_tplPinContours, -1, Scalar(0, 255, 0), 2); + cv::imwrite("/home/aidlux/BOE/ZB_SOCKET/Tpl/tpl_pin_contours.png", showImg); + } + + m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_1, "---Init Tpl---" , "end"); + return 0; +} + int ALLImgCheckAnalysisy::LoadRunConfig(void *p) { return 0; diff --git a/AlgorithmModule/src/CameraResult.cpp b/AlgorithmModule/src/CameraResult.cpp index 02a974f..df2af29 100644 --- a/AlgorithmModule/src/CameraResult.cpp +++ b/AlgorithmModule/src/CameraResult.cpp @@ -3,7 +3,7 @@ * @Date: 2025-09-13 20:39:37 * @LastEditors: xiewenji 527774126@qq.com * @LastEditTime: 2025-09-17 16:39:47 - * @FilePath: /BOE_CELL_AOI_Detect/AlgorithmModule/src/CameraResult.cpp + * @FilePath: /BOE_ZB_SOCKET_Detect/AlgorithmModule/src/CameraResult.cpp * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #include "CameraResult.h" diff --git a/AlgorithmModule/src/ImageAllResult.cpp b/AlgorithmModule/src/ImageAllResult.cpp index 392a266..ac97084 100644 --- a/AlgorithmModule/src/ImageAllResult.cpp +++ b/AlgorithmModule/src/ImageAllResult.cpp @@ -3,7 +3,7 @@ * @Date: 2025-09-13 20:39:37 * @LastEditors: xiewenji 527774126@qq.com * @LastEditTime: 2025-09-23 14:29:12 - * @FilePath: /BOE_CELL_AOI_Detect/AlgorithmModule/src/CameraResult.cpp + * @FilePath: /BOE_ZB_SOCKET_Detect/AlgorithmModule/src/CameraResult.cpp * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #include "ImageAllResult.h" diff --git a/AlgorithmModule/src/ImageStorage.cpp b/AlgorithmModule/src/ImageStorage.cpp index d62e97c..9474f97 100644 --- a/AlgorithmModule/src/ImageStorage.cpp +++ b/AlgorithmModule/src/ImageStorage.cpp @@ -3,7 +3,7 @@ * @Date: 2025-09-11 15:32:52 * @LastEditors: xiewenji 527774126@qq.com * @LastEditTime: 2025-09-16 09:40:36 - * @FilePath: /BOE_CELL_AOI_Detect/AlgorithmModule/src/ImageStorage.cpp + * @FilePath: /BOE_ZB_SOCKET_Detect/AlgorithmModule/src/ImageStorage.cpp * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #include "ImageStorage.h" diff --git a/AlgorithmModule/src/Pin_QX_Det.cpp b/AlgorithmModule/src/Pin_QX_Det.cpp index 19361c2..84a833b 100644 --- a/AlgorithmModule/src/Pin_QX_Det.cpp +++ b/AlgorithmModule/src/Pin_QX_Det.cpp @@ -38,19 +38,9 @@ Pin_QX_Det::Pin_QX_Det(std::shared_ptr &log_ref) Pin_QX_Det::~Pin_QX_Det() { } -int Pin_QX_Det::Detect(const cv::Mat &img, DetConfigResult *pDetConfig) -{ - // if (!pDetConfig->pBaseCheckFunction->edgeDet.bOpen) - // { - // return 0; - // } - - m_bshowimg = false; - if (pDetConfig->bSaveResultImg) - { - m_bshowimg = true; - } +int Pin_QX_Det::GetPinMask(const cv::Mat &img, DetConfigResult *pDetConfig, Mat &mask) +{ std::shared_ptr pSocket_Pin; pSocket_Pin = AI_Factory->Pin_Loc; cv::Size sz; @@ -62,7 +52,6 @@ int Pin_QX_Det::Detect(const cv::Mat &img, DetConfigResult *pDetConfig) cv::resize(img, detImg, sz); int re = 0; - cv::Mat mask; if (detImg.channels() != 1) { cv::cvtColor(detImg, detImg, cv::COLOR_RGB2GRAY); @@ -71,7 +60,7 @@ int Pin_QX_Det::Detect(const cv::Mat &img, DetConfigResult *pDetConfig) re = pSocket_Pin->AIDet(detImg, mask); if (re != 0) { - m_pdetlog->AddCheckstr(PrintLevel_3, DET_LOG_LEVEL_3, "AI_Edge_Algin ", "AICheck_Edge----error %d ", re); + m_pdetlog->AddCheckstr(PrintLevel_3, DET_LOG_LEVEL_3, "AI_Pin ", "AICheck_Pin----error %d ", re); int re123 = 100 + re; return re123; } @@ -86,6 +75,27 @@ int Pin_QX_Det::Detect(const cv::Mat &img, DetConfigResult *pDetConfig) cv::imwrite(pDetConfig->strChannel +"_pin_" +"in.png", detImg); cv::imwrite(pDetConfig->strChannel +"_pin_" +"out_mask.png", mask); } +} + +int Pin_QX_Det::Detect(const cv::Mat &img, DetConfigResult *pDetConfig) +{ + if (!pDetConfig->pBaseCheckFunction->edgeDet.bOpen) + { + return 0; + } + + m_bshowimg = false; + if (pDetConfig->bSaveResultImg) + { + m_bshowimg = true; + } + + // 获取pin检测mask + Mat pin_mask; + int re = GetPinMask(img, pDetConfig, pin_mask); + + // 获取pin模板mask + if (m_bshowimg) { diff --git a/AlgorithmModule/src/Product.cpp b/AlgorithmModule/src/Product.cpp index 6d8be72..064aae3 100644 --- a/AlgorithmModule/src/Product.cpp +++ b/AlgorithmModule/src/Product.cpp @@ -3,7 +3,7 @@ * @Date: 2025-09-13 19:26:19 * @LastEditors: xiewenji 527774126@qq.com * @LastEditTime: 2025-09-17 18:10:38 - * @FilePath: /BOE_CELL_AOI_Detect/AlgorithmModule/src/Product.cpp + * @FilePath: /BOE_ZB_SOCKET_Detect/AlgorithmModule/src/Product.cpp * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * */ diff --git a/ConfigModule/include/ConfigBase.h b/ConfigModule/include/ConfigBase.h index d24e498..aedb920 100644 --- a/ConfigModule/include/ConfigBase.h +++ b/ConfigModule/include/ConfigBase.h @@ -3,7 +3,7 @@ * @Date: 2025-09-11 15:32:54 * @LastEditors: xiewenji 527774126@qq.com * @LastEditTime: 2025-09-13 18:49:40 - * @FilePath: /BOE_CELL_AOI_Detect/ConfigModule/include/ConfigBase.h + * @FilePath: /BOE_ZB_SOCKET_Detect/ConfigModule/include/ConfigBase.h * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #ifndef ConfigBase_H_ diff --git a/example/deal.cpp b/example/deal.cpp index cd9cb11..ff62110 100644 --- a/example/deal.cpp +++ b/example/deal.cpp @@ -458,7 +458,7 @@ int deal::preCheck() std::shared_ptr checkResult; int re = m_pALLImgCheckAnalysisy->GetCheckReuslt(checkResult); - saveImg("/home/aidlux/BOE/CELL_AOI/testresult/", checkResult); + saveImg("/home/aidlux/BOE/ZB_SOCKET/testresult/", checkResult); getresultNum++; if (getresultNum == pushImgNum) { @@ -804,14 +804,14 @@ void deal::ResultThread(int id) // 存图 // std::string savepath = "/home/aidlux/BOE/Detsave/" + runConfig.filePath + "/"; // saveImg(savepath, dealResult); - saveImg("/home/aidlux/BOE/CELL_AOI/Detsave/", dealResult); + saveImg("/home/aidlux/BOE/ZB_SOCKET/Detsave/", dealResult); } { // 存 检测统计 日志 mutex_DetResult_.lock(); m_DetResult.print(false); - std::string strlog = "/home/aidlux/BOE/CELL_AOI/ResultImg/"; + std::string strlog = "/home/aidlux/BOE/ZB_SOCKET/ResultImg/"; if (m_strCurDate != "") { strlog += m_strCurDate;