diff --git a/AlgorithmModule/include/CheckUtil.hpp b/AlgorithmModule/include/CheckUtil.hpp index 946fc47..c781c31 100644 --- a/AlgorithmModule/include/CheckUtil.hpp +++ b/AlgorithmModule/include/CheckUtil.hpp @@ -44,6 +44,7 @@ public: static int SizeRect(cv::Rect &roi, int img_w, int img_h, int addw, int addh); static int CalHj(const cv::Mat &img, const cv::Mat &mask, int b_value); static int CalHj(const cv::Mat &img, const cv::Mat &mask, const cv::Mat &backgroundimg); + static int CalHjWeighted(const cv::Mat &img, const cv::Mat &mask, int b_value, float power = 2.0f); static float CalRoi2RoiPre(cv::Rect rect1, cv::Rect rect2); // 计算平均灰度 static float CalImgBrightness(cv::Mat imgRoi); diff --git a/AlgorithmModule/src/CameraCheckAnalysisy.cpp b/AlgorithmModule/src/CameraCheckAnalysisy.cpp index 5bd93b8..2828720 100644 --- a/AlgorithmModule/src/CameraCheckAnalysisy.cpp +++ b/AlgorithmModule/src/CameraCheckAnalysisy.cpp @@ -724,6 +724,10 @@ int CameraCheckAnalysisy::preDet_BQ(const cv::Mat &L255CutImg, std::shared_ptrcameraBaseResult->pBQ_Result->pBQ_roiList.size(); i++) { cv::Rect boundingRect = m_pCheck_Result->cameraBaseResult->pBQ_Result->pBQ_roiList.at(i); + boundingRect.x -= 2; + boundingRect.y -= 2; + boundingRect.width += 4; + boundingRect.height += 4; detImg_mask(boundingRect).setTo(255); } if (L255->result->in_shareImage->bDebugsaveImg) diff --git a/AlgorithmModule/src/CheckUtil.cpp b/AlgorithmModule/src/CheckUtil.cpp index 7b247f8..d4848a1 100644 --- a/AlgorithmModule/src/CheckUtil.cpp +++ b/AlgorithmModule/src/CheckUtil.cpp @@ -457,6 +457,32 @@ int CheckUtil::CalHj(const cv::Mat &img, const cv::Mat &mask, const cv::Mat &bac return meanValue123[0]; } +int CheckUtil::CalHjWeighted(const cv::Mat &img, const cv::Mat &mask, int b_value, float power) +{ + cv::Mat imgf; + if (img.type() != CV_32F) + img.convertTo(imgf, CV_32F); + else + imgf = img; + + cv::Mat absDiff = cv::abs(imgf - b_value); + + cv::Mat weight; + cv::pow(absDiff, power, weight); + + cv::Mat maskedDiff, maskedWeight; + absDiff.copyTo(maskedDiff, mask); + weight.copyTo(maskedWeight, mask); + + cv::Scalar weightedSum = cv::sum(maskedDiff.mul(weight)); + cv::Scalar weightSum = cv::sum(maskedWeight); + + if (weightSum[0] < 1e-6) + return 0; + + return static_cast(weightedSum[0] / weightSum[0]); +} + float CheckUtil::CalRoi2RoiPre(cv::Rect rect1, cv::Rect rect2) { // 计算交集区域 diff --git a/AlgorithmModule/src/ImageResultJudge.cpp b/AlgorithmModule/src/ImageResultJudge.cpp index 0a15846..9d1a722 100644 --- a/AlgorithmModule/src/ImageResultJudge.cpp +++ b/AlgorithmModule/src/ImageResultJudge.cpp @@ -415,6 +415,7 @@ int ImageResultJudge::ResultJudge(std::shared_ptr pImageResult) Judge_Status = true; checkFlage = ANALYSIS_TYPE_TF; nerrortype = 1; + bNG_Status = true; } } // 暗点 3S 分析 对 好品 或者 是 疑是的缺陷进行3S分析。S数量分析。 3S的暗点直接NG. diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index 8de1640..3a9dd7d 100644 --- a/AlgorithmModule/src/ImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ImgCheckAnalysisy.cpp @@ -170,7 +170,7 @@ int ImgCheckAnalysisy::GetStatus() std::string ImgCheckAnalysisy::GetVersion() { - return std::string("BOE_1.2.0"); + return std::string("BOE_1.2.1_" + std::string(__DATE__) + "_" + std::string(__TIME__)); } std::string ImgCheckAnalysisy::GetErrorInfo() @@ -332,7 +332,7 @@ cv::Scalar ImgCheckAnalysisy::calc_blob_info_withstats(cv::Mat &img, const cv::M // 计算 hj(差异图像大于0的像素均值) // double hj = std::abs(fbk - fdet); - double hj = CheckUtil::CalHj(cimg, cmask, mean_bk.val[0]); + double hj = CheckUtil::CalHjWeighted(cimg, cmask, fbk, 2.0f); int worb = 0; if (fdet >= fbk) @@ -381,7 +381,7 @@ double ImgCheckAnalysisy::CalBlobHJ(cv::Mat &img, const cv::Mat &mask, cv::Rect // 计算 hj(差异图像大于0的像素均值) // double hj = std::abs(fbk - fdet); - double hj = CheckUtil::CalHj(cimg, cmask, fbk); + double hj = CheckUtil::CalHjWeighted(cimg, cmask, fbk, 2.0f); static int kkk = 0; unsigned char *pErrordata = (unsigned char *)cimg.data; @@ -589,6 +589,7 @@ int ImgCheckAnalysisy::SetNewConfig() m_pRegionAnalysisyParam = &m_pCommonAnalysisyConfig->regionConfigArr.at(0); GetParamidx(); UpdateImgageScale(); + UPdateLDConfig(); if (true) { printf("SetNewConfig m_nConfigIdx %d m_CheckConfig.strSkuName %s \n", m_nConfigIdx, m_AnalysisyConfig.strSkuName.c_str()); @@ -2484,6 +2485,11 @@ int ImgCheckAnalysisy::AI_Detect_QX() m_pdetlog->AddCheckstr(PrintLevel_2, DET_LOG_LEVEL_3, strBaseLog, "=======model use Chess"); pAI_Model = AI_Factory->AI_defect_Chess; } + else if (m_pFuntion->function.f_BaseDet.strAIMode == "RGB-HGRAY") + { + m_pdetlog->AddCheckstr(PrintLevel_2, DET_LOG_LEVEL_3, strBaseLog, "=======model use RE_RGBHGRAY"); + pAI_Model = AI_Factory->AI_defect_RE_RGBHGRAY; + } else { m_pdetlog->AddCheckstr(PrintLevel_2, DET_LOG_LEVEL_3, strBaseLog, "=======model use base"); @@ -3358,17 +3364,17 @@ int ImgCheckAnalysisy::BLobToDetResult() config_qx_type == CONFIG_QX_NAME_Other || config_qx_type == CONFIG_QX_NAME_LD) { - std::string qx_name = CONFIG_QX_NAME_Names[config_qx_type]; + qx_name = CONFIG_QX_NAME_Names[config_qx_type]; // m_TemCheck.AddCheckstr(PrintLevel_3, DET_LOG_LEVEL_3, "LD", "stsrt config_qx_type %s ", qx_name.c_str()); int dbresult = LDJudge(config_qx_type, roi, JudgArea, blobs.blobTab[i].maxValue, blobs.blobTab[i].grayDis, pQxlog); - int detre = 1; + //int detre = 1; // 表示L0 和 DP 都有的 亮的 if (dbresult == 1) { config_qx_type = CONFIG_QX_NAME_LD; qx_name = CONFIG_QX_NAME_Names[config_qx_type]; } - pQxlog->AddCheckstr(PrintLevel_2, DET_LOG_LEVEL_3, " LD Judge ", "%s qx %s ", Re_TO_STR_False(detre), qx_name.c_str()); + pQxlog->AddCheckstr(PrintLevel_2, DET_LOG_LEVEL_3, " LD Judge ", "%s qx %s ", Re_TO_STR_Pass_1(dbresult), qx_name.c_str()); } // 如果是chess 画面,缺陷类型直接是chess异常。 if (m_pFuntion->function.f_AIQX.bAllToChess) @@ -3452,7 +3458,7 @@ int ImgCheckAnalysisy::BLobToDetResult() bool ban = JudgeQXAnalysis(config_qx_type, pQxlog); if (!ban) { - std::string qx_name = CONFIG_QX_NAME_Names[config_qx_type]; + qx_name = CONFIG_QX_NAME_Names[config_qx_type]; pQxlog->AddCheckstr(PrintLevel_2, DET_LOG_LEVEL_3, "Judge QX", "qx function close, config_qx_type %s Not Det", qx_name.c_str()); @@ -3469,7 +3475,7 @@ int ImgCheckAnalysisy::BLobToDetResult() isMarksheildQX = Judge_MarkLine_QX(config_qx_type, roi, pQxlog); if (isMarksheildQX) { - std::string qx_name = CONFIG_QX_NAME_Names[config_qx_type]; + qx_name = CONFIG_QX_NAME_Names[config_qx_type]; pQxlog->AddCheckstr(PrintLevel_2, DET_LOG_LEVEL_3, "MarkLine_QX", "MarkLine_QX close, config_qx_type %s Not Det", qx_name.c_str()); diff --git a/AlgorithmModule/src/QX_Merge_Analysis.cpp b/AlgorithmModule/src/QX_Merge_Analysis.cpp index b02aaf5..1325992 100644 --- a/AlgorithmModule/src/QX_Merge_Analysis.cpp +++ b/AlgorithmModule/src/QX_Merge_Analysis.cpp @@ -972,6 +972,7 @@ int QX_Merge_Analysis::Analysis_AD(ALL_Qx_DataList *pALLTypeqxList, int qx_idx) } A_2S_num += AD_list.at(ad_i).num_2s; A_3S_num += AD_list.at(ad_i).num_3s; + if(AD_list.at(ad_i).num_1s >= 3) A_3S_num++; m_pMergedetlog->AddCheckstr(PrintLevel_2, 3, "AD RGBL255", "AD_list %d %s", ad_i, AD_list.at(ad_i).GetInfo().c_str()); } @@ -1028,7 +1029,7 @@ int QX_Merge_Analysis::Analysis_AD(ALL_Qx_DataList *pALLTypeqxList, int qx_idx) } else { - m_pMergedetlog->AddCheckstr(PrintLevel_2, 3, "AD RGBL255", "3S Analysis --> %s result NG 3S %d < 1", + m_pMergedetlog->AddCheckstr(PrintLevel_2, 3, "AD RGBL255", "3S Analysis --> %s result OK 3S %d < 1", pQXChannelList->channel_name.c_str(), A_3S_num); } } diff --git a/ConfigModule/src/ConfigInstance.cpp b/ConfigModule/src/ConfigInstance.cpp index 8755cd0..4b225da 100644 --- a/ConfigModule/src/ConfigInstance.cpp +++ b/ConfigModule/src/ConfigInstance.cpp @@ -213,6 +213,7 @@ int ConfigInstance::Updata_Check(Json::Value json_value) int ConfigInstance::SetStatus(int nConfigType) { + std::lock_guard lock(mutex_status); for (int i = 0; i < MAX_USER_COUNT; i++) { m_USER_ConfigUpdataStatusList[nConfigType][i] = true; diff --git a/ConfigModule/src/ConfigManager.cpp b/ConfigModule/src/ConfigManager.cpp index 1d78b57..70439ce 100644 --- a/ConfigModule/src/ConfigManager.cpp +++ b/ConfigModule/src/ConfigManager.cpp @@ -203,6 +203,7 @@ int ConfigManager::UpdateConfig() if (!std::filesystem::exists(strConfigPath)) { strConfigPath = m_strConfigRootPath + "/param.json"; } + printf("read param %s\n", strConfigPath.c_str()); std::shared_ptr temConfig = ConfigBase::GetInstance(); re = LoadParamConfig(temConfig, strConfigPath); if (re != 0) @@ -218,7 +219,12 @@ int ConfigManager::UpdateConfig() printf("Error >>>> camear Name is empty \n"); continue; } - Config_instances_[p.commonCheckConfig.baseConfig.strCamearName] = temConfig; + auto it = Config_instances_.find(p.commonCheckConfig.baseConfig.strCamearName); + if (it != Config_instances_.end() && it->second) { + LoadParamConfig(it->second, strConfigPath); + } else { + Config_instances_[p.commonCheckConfig.baseConfig.strCamearName] = temConfig; + } } // getchar(); diff --git a/ConfigModule/src/JsonConfig.cpp b/ConfigModule/src/JsonConfig.cpp index b838f7f..6168c86 100644 --- a/ConfigModule/src/JsonConfig.cpp +++ b/ConfigModule/src/JsonConfig.cpp @@ -32,7 +32,7 @@ void CommonParamToCheckConfigJson::toObjectFromValue(Json::Value root) std::unique_ptr reader(builder.newCharReader()); Json::Value rootvalue; std::string err; - // std::cout << strJson << std::endl; + std::cout << strJson << std::endl; auto nSize = strJson.size(); if (reader->parse(strJson.c_str(), strJson.c_str() + nSize, &rootvalue, &err)) { @@ -48,7 +48,8 @@ void CommonParamToCheckConfigJson::toObjectFromValue(Json::Value root) if ( _config.baseConfig.strConfigVersion == "") { _config.baseConfig.strConfigVersion = "NULL"; - } + } + _config.baseConfig.image_widht = value["image_widht"].asInt(); _config.baseConfig.Image_height = value["Image_height"].asInt(); _config.baseConfig.bDrawShieldRoi = value["bDrawShieldRoi"].asBool();