diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index bb47f05..e57ac0f 100644 --- a/AlgorithmModule/src/ImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ImgCheckAnalysisy.cpp @@ -623,6 +623,7 @@ int ImgCheckAnalysisy::Adapt_Config(Mat img, Rect cur_roi, bool b_update){ m_old_cur_markLine_mark1 = m_AnalysisyConfig.baseFunction.markLine.mark_local_1; m_old_cur_markLine_mark2 = m_AnalysisyConfig.baseFunction.markLine.mark_local_2; m_old_cur_regionConfigArr = m_AnalysisyConfig.commonCheckConfig.nodeConfigArr[0].regionConfigArr; + m_old_cur_traditional_region = m_AnalysisyConfig.baseFunction.traditionDet.detArea; } /*计算old_roi到new_roi的完整仿射变换矩阵(平移+缩放+旋转)*/ @@ -660,6 +661,7 @@ int ImgCheckAnalysisy::Adapt_Config(Mat img, Rect cur_roi, bool b_update){ cv::Point& cur_markLine_mark1 = m_AnalysisyConfig.baseFunction.markLine.mark_local_1; cv::Point& cur_markLine_mark2 = m_AnalysisyConfig.baseFunction.markLine.mark_local_2; std::vector& cur_regionConfigArr = m_AnalysisyConfig.commonCheckConfig.nodeConfigArr[0].regionConfigArr; + std::vector& cur_traditional_region = m_AnalysisyConfig.baseFunction.traditionDet.detArea; // if (img.empty()) // { @@ -717,6 +719,9 @@ int ImgCheckAnalysisy::Adapt_Config(Mat img, Rect cur_roi, bool b_update){ cur_regionConfigArr[i].basicInfo.pointArry[j] = affinePoint(m_old_cur_regionConfigArr[i].basicInfo.pointArry[j]); } } + for(int i = 0; i < cur_traditional_region.size(); i++){ + cur_traditional_region[i] = affinePoint(m_old_cur_traditional_region[i]); + } /*show*/ // if (img.empty()) @@ -1846,6 +1851,9 @@ int ImgCheckAnalysisy::Traditional_Detect_Thread(const cv::Mat &img, cv::Mat &Re cp.nFilterHigh = traditionParam.nFilterHigh; cp.nAreaFilter = traditionParam.nAreaFilter; cp.nCountFilter = traditionParam.nCountFilter; + cp.productId = DetImgInfo_shareP->strImgProductID; + cp.productChannel = m_strCurDetChannel; + cp.bDebugsaveImg = DetImgInfo_shareP->bsaveProcessImg; m_tcsCheck.SetChecConfig(&cp); } diff --git a/TcsCheckModule/include/TcsCheck.h b/TcsCheckModule/include/TcsCheck.h index db7b285..3a55f55 100644 --- a/TcsCheckModule/include/TcsCheck.h +++ b/TcsCheckModule/include/TcsCheck.h @@ -28,6 +28,10 @@ struct CHECK_PARAM{ int nAreaFilter; // blob filter for drawing, only draw blob with area >= nAreaFilter int nCountFilter; // blob filter for counting, Only the first nCountFilters with areas arranged from largest to smallest + + std::string productId; // product id + std::string productChannel; // product channel + bool bDebugsaveImg; }; /* 长宽比 >= 3 ? diff --git a/TcsCheckModule/src/TcsCheck.cpp b/TcsCheckModule/src/TcsCheck.cpp index f8a53ae..0184a05 100644 --- a/TcsCheckModule/src/TcsCheck.cpp +++ b/TcsCheckModule/src/TcsCheck.cpp @@ -1,5 +1,26 @@ #include "TcsCheck.h" +namespace { +// 静默递归创建多级目录(成功或已存在返回 true) +bool MakeDirs(const std::string& path, mode_t mode = 0755) +{ + if (path.empty()) { + return false; + } + if (mkdir(path.c_str(), mode) == 0 || errno == EEXIST) { + return true; + } + const std::size_t pos = path.find_last_of('/'); + if (pos == std::string::npos || pos == 0) { + return false; + } + if (!MakeDirs(path.substr(0, pos), mode)) { + return false; + } + return (mkdir(path.c_str(), mode) == 0 || errno == EEXIST); +} +} // namespace + class CLock { public: @@ -178,6 +199,18 @@ cv::Mat CTcsCheck::AdaptiveBinary(cv::Mat matBlur) cv::inRange(block, minGrey, maxGrey, blockBin); cv::bitwise_not(blockBin, blockBin); blockBin.copyTo(result(blockRect)); + + // 传统检测残点图存图 + if (m_cpCfg.bDebugsaveImg) + { + std::string roi_ext = "[" + std::to_string(x) + "," + std::to_string(y) + "]"; + std::string strSaveDir = "/home/aidlux/BOE/CELL_AOI/AI_Detect/" + m_cpCfg.productId + "/"; + MakeDirs(strSaveDir); + std::string strSavePath_in = strSaveDir + m_cpCfg.productChannel +"_"+ roi_ext + "_"+ "in" + ".png"; + std::string strSavePath_out = strSaveDir + m_cpCfg.productChannel +"_"+ roi_ext + "_"+ "out" + ".png"; + cv::imwrite(strSavePath_in, block); + cv::imwrite(strSavePath_out, blockBin); + } } } return result;