diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index 6fb0b54..d8726b2 100644 --- a/AlgorithmModule/src/ImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ImgCheckAnalysisy.cpp @@ -1646,25 +1646,17 @@ int ImgCheckAnalysisy::Traditional_Detect_Thread(const cv::Mat &img, cv::Mat &Re return -1; } - Base_Function_TraditionDet traditionParam = m_pbaseCheckFunction->traditionDet; - // 首次调用时初始化传统检测参数(从 m_AnalysisyConfig 映射) - static bool bTcsInited = false; - if (!bTcsInited) + Base_Function_TraditionDet traditionParam = m_pbaseCheckFunction->traditionDet; // 首次调用时初始化传统检测参数(从 m_AnalysisyConfig 映射) { CHECK_PARAM cp; cp.nAreaLowFilter = 80; cp.nBlockSize = traditionParam.nBlockSize; - cp.nDiscardTop = 0; - cp.nDiscardBottom = 0; - cp.nDiscardLeft = 0; - cp.nDiscardRight = 0; cp.fZoomRatio = traditionParam.fZoomRatio; - cp.nFilterLow = 15; - cp.nFilterHigh = 15; + cp.nFilterLow = traditionParam.nFilterLow; + cp.nFilterHigh = traditionParam.nFilterHigh; cp.nAreaFilter = traditionParam.nAreaFilter; cp.nCountFilter = traditionParam.nCountFilter; m_tcsCheck.SetChecConfig(&cp); - bTcsInited = true; } cv::Rect detroi = cv::boundingRect(traditionParam.detArea); diff --git a/ConfigModule/include/CheckConfigDefine.h b/ConfigModule/include/CheckConfigDefine.h index 204adcd..051345e 100644 --- a/ConfigModule/include/CheckConfigDefine.h +++ b/ConfigModule/include/CheckConfigDefine.h @@ -1788,6 +1788,8 @@ struct Base_Function_TraditionDet float fZoomRatio; // 缩放比例 float nAreaFilter; // 面积过滤 int nCountFilter; // 数量过滤 + int nFilterLow; // 低灰度过滤 + int nFilterHigh; // 高灰度过滤 cv::Rect detArea_ROI; std::vector detArea; bool bdetArea; // 是否使用区域 @@ -1804,6 +1806,8 @@ struct Base_Function_TraditionDet fZoomRatio = 0; nAreaFilter = 0; nCountFilter = 0; + nFilterLow = 0; + nFilterHigh = 0; bdetArea = false; detArea_ROI = cv::Rect(0, 0, 0, 0); detArea.clear(); @@ -1816,20 +1820,22 @@ struct Base_Function_TraditionDet this->fZoomRatio = tem.fZoomRatio; this->nAreaFilter = tem.nAreaFilter; this->nCountFilter = tem.nCountFilter; + this->nFilterLow = tem.nFilterLow; + this->nFilterHigh = tem.nFilterHigh; this->bdetArea = tem.bdetArea; this->detArea_ROI = tem.detArea_ROI; this->detArea.assign(tem.detArea.begin(), tem.detArea.end()); } void print(std::string str) { - printf("%s>>bOpen %d nAreaLowFilter %f nBlockSize %d fZoomRatio %f nAreaFilter %f nCountFilter %d \n", str.c_str(), - bOpen, nAreaLowFilter, nBlockSize, fZoomRatio, nAreaFilter, nCountFilter); + printf("%s>>bOpen %d nAreaLowFilter %f nBlockSize %d fZoomRatio %f nAreaFilter %f nCountFilter %d nFilterLow %d nFilterHigh %d \n", str.c_str(), + bOpen, nAreaLowFilter, nBlockSize, fZoomRatio, nAreaFilter, nCountFilter, nFilterLow, nFilterHigh); } std::string GetInfo(std::string str) { char buffer[256]; - sprintf(buffer, "%s>>bOpen %d nAreaLowFilter %f nBlockSize %d fZoomRatio %f nAreaFilter %f nCountFilter %d \n", str.c_str(), - bOpen, nAreaLowFilter, nBlockSize, fZoomRatio, nAreaFilter, nCountFilter); + sprintf(buffer, "%s>>bOpen %d nAreaLowFilter %f nBlockSize %d fZoomRatio %f nAreaFilter %f nCountFilter %d nFilterLow %d nFilterHigh %d \n", str.c_str(), + bOpen, nAreaLowFilter, nBlockSize, fZoomRatio, nAreaFilter, nCountFilter, nFilterLow, nFilterHigh); std::string str123 = buffer; return str123; } diff --git a/ConfigModule/src/JsonConfig.cpp b/ConfigModule/src/JsonConfig.cpp index 171cda6..3937608 100644 --- a/ConfigModule/src/JsonConfig.cpp +++ b/ConfigModule/src/JsonConfig.cpp @@ -1333,6 +1333,14 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value) { _config.traditionDet.nCountFilter = value_f["form"]["Tradition_Param"]["nCountFilter"].asInt(); } + if (value_f["form"]["Tradition_Param"]["nFilterLow"]) + { + _config.traditionDet.nFilterLow = value_f["form"]["Tradition_Param"]["nFilterLow"].asInt(); + } + if (value_f["form"]["Tradition_Param"]["nFilterHigh"]) + { + _config.traditionDet.nFilterHigh = value_f["form"]["Tradition_Param"]["nFilterHigh"].asInt(); + } // 2、读取区域点 { auto value_region = value_f["form"]["Tradition_Param"]["detArea"]; diff --git a/TcsCheckModule/src/TcsCheck.cpp b/TcsCheckModule/src/TcsCheck.cpp index 2874acb..9304a51 100644 --- a/TcsCheckModule/src/TcsCheck.cpp +++ b/TcsCheckModule/src/TcsCheck.cpp @@ -149,11 +149,25 @@ cv::Mat CTcsCheck::AdaptiveBinary(cv::Mat matBlur) // 按 localBlockSize_ 分块,使用每个块的局部均值做动态阈值。 // 当前规则:落在 [avg-lower_, avg+upper_] 内置 0,超出置 255。 cv::Mat result = cv::Mat::zeros(matBlur.size(), CV_8UC1); + m_cpCfg.nBlockSize = std::min(m_cpCfg.nBlockSize, matBlur.cols); + m_cpCfg.nBlockSize = std::min(m_cpCfg.nBlockSize, matBlur.rows); for (int y = 0; y < matBlur.rows; y += m_cpCfg.nBlockSize) { for (int x = 0; x < matBlur.cols; x += m_cpCfg.nBlockSize) { - const int blockW = std::min(m_cpCfg.nBlockSize, matBlur.cols - x); - const int blockH = std::min(m_cpCfg.nBlockSize, matBlur.rows - y); - cv::Rect blockRect(x, y, blockW, blockH); + // const int blockW = std::min(m_cpCfg.nBlockSize, matBlur.cols - x); + // const int blockH = std::min(m_cpCfg.nBlockSize, matBlur.rows - y); + cv::Rect blockRect(x, y, m_cpCfg.nBlockSize, m_cpCfg.nBlockSize); + if(x + m_cpCfg.nBlockSize > matBlur.cols) + { + blockRect = cv::Rect(matBlur.cols - m_cpCfg.nBlockSize, y, m_cpCfg.nBlockSize, m_cpCfg.nBlockSize); + } + if(y + m_cpCfg.nBlockSize > matBlur.rows) + { + blockRect = cv::Rect(x, matBlur.rows - m_cpCfg.nBlockSize, m_cpCfg.nBlockSize, m_cpCfg.nBlockSize); + } + if(x + m_cpCfg.nBlockSize > matBlur.cols && y + m_cpCfg.nBlockSize > matBlur.rows) + { + blockRect = cv::Rect(matBlur.cols - m_cpCfg.nBlockSize, matBlur.rows - m_cpCfg.nBlockSize, m_cpCfg.nBlockSize, m_cpCfg.nBlockSize); + } cv::Mat block = matBlur(blockRect); const double avg = cv::mean(block)[0]; @@ -324,6 +338,10 @@ int CTcsCheck::TraditionalDetect(const cv::Mat& img, cv::Rect detRoi, cv::Mat& b return -1; } + // getchar(); + // cv::Mat showImg = img.clone(); + // cv::rectangle(showImg, detRoi, cv::Scalar(255), 2); + // cv::imwrite("detRoi.png", showImg); m_matLoad = img; // 确保 m_sizeImage 始终与 m_matLoad 同步 m_sizeImage = img.size(); @@ -368,7 +386,8 @@ int CTcsCheck::TraditionalDetect(const cv::Mat& img, cv::Rect detRoi, cv::Mat& b // 5. 高斯模糊 — 缓存到 m_matBlur cv::GaussianBlur(matResized, m_matBlur, cv::Size(5, 5), 0); - + // cv::imwrite("matResized.png", matResized); + // cv::imwrite("m_matBlur.png", m_matBlur); // 6. 自适应二值化检测 m_matBlob = AdaptiveBinary(m_matBlur); blobImg = m_matBlob.clone();