diff --git a/AlgorithmModule/include/ImageDetConfig.h b/AlgorithmModule/include/ImageDetConfig.h index 8f18198..9859ef6 100644 --- a/AlgorithmModule/include/ImageDetConfig.h +++ b/AlgorithmModule/include/ImageDetConfig.h @@ -40,6 +40,7 @@ struct QX_ERROR_INFO_ float grayDis; float fUpIou; float density; // Blob- 密度 + bool bIsStandardLD; // 是否通过LD标准判定(跳过UP/DP的IOU检查) std::vector detLogList; // 检测日志 std::shared_ptr detlog; std::vector detRegionidxList; // 对应检测区域的 idx. diff --git a/AlgorithmModule/include/ImgCheckAnalysisy.hpp b/AlgorithmModule/include/ImgCheckAnalysisy.hpp index 1c89b27..a8e22bf 100644 --- a/AlgorithmModule/include/ImgCheckAnalysisy.hpp +++ b/AlgorithmModule/include/ImgCheckAnalysisy.hpp @@ -73,6 +73,9 @@ public: // 获取检测库 状态信息 返回:CHECK_THREAD_RUN_STATUS int GetStatus(); + // 计算blob的密度 + int CalBlobDensity_QX(); + // 更新参数 pconfig 参数指针,nConfigType 需要更新的参数类型 返回:0 成功 其他异常 int UpdateConfig(void *pconfig, int nConfigType); diff --git a/AlgorithmModule/src/CameraCheckAnalysisy.cpp b/AlgorithmModule/src/CameraCheckAnalysisy.cpp index e93f052..0ddf6e5 100644 --- a/AlgorithmModule/src/CameraCheckAnalysisy.cpp +++ b/AlgorithmModule/src/CameraCheckAnalysisy.cpp @@ -25,6 +25,7 @@ #include #include #include +#include static std::mutex g_ngImgSave_mutex; static std::vector> g_ngImgSave_futures; @@ -1239,43 +1240,52 @@ int CameraCheckAnalysisy::ngImgSave() { auto result_copy = m_pCheck_Result; std::string save_path_root = "/home/aidlux/BOE/FOG/cloud/"; - auto task = std::async(std::launch::async, [result_copy, save_path_root]() { + // 生成当天日期字符串,用于按天组织存储目录 + time_t now = time(nullptr); + struct tm tm_now; + localtime_r(&now, &tm_now); + char date_buf[16]; + strftime(date_buf, sizeof(date_buf), "%Y-%m-%d", &tm_now); + std::string date_str(date_buf); + + auto task = std::async(std::launch::async, [result_copy, save_path_root, date_str]() { try { if (!result_copy) return; // ---------- 目录清理(加锁防止并发删除)---------- + // 只保留最近 2 天的数据(今天 + 昨天),删除更早的日期目录 { static std::mutex cleanup_mutex; // 静态锁,所有实例共享 std::lock_guard lock(cleanup_mutex); + // 计算 1 天前的日期作为清理截止线(保留今天和昨天共 2 天) + time_t now_cleanup = time(nullptr); + time_t cutoff_time = now_cleanup - 1 * 24 * 3600; + struct tm tm_cutoff; + localtime_r(&cutoff_time, &tm_cutoff); + char cutoff_buf[16]; + strftime(cutoff_buf, sizeof(cutoff_buf), "%Y-%m-%d", &tm_cutoff); + std::string cutoff_str(cutoff_buf); + DIR* dir = opendir(save_path_root.c_str()); if (dir) { - std::vector> dirs; struct dirent* entry; while ((entry = readdir(dir)) != nullptr) { std::string name = entry->d_name; if (name == "." || name == "..") continue; - std::string full_path = save_path_root + name; - struct stat st; - if (stat(full_path.c_str(), &st) == 0 && S_ISDIR(st.st_mode)) { - struct stat lst; - if (lstat(full_path.c_str(), &lst) == 0 && !S_ISLNK(lst.st_mode)) { - dirs.emplace_back(full_path, st.st_mtime); + // 检查是否为日期格式目录 YYYY-MM-DD + if (name.length() == 10 && name[4] == '-' && name[7] == '-') { + // ISO 日期格式可按字典序直接比较 + if (name < cutoff_str) { + std::string full_path = save_path_root + name; + struct stat st; + if (stat(full_path.c_str(), &st) == 0 && S_ISDIR(st.st_mode)) { + CheckUtil::DeleteDir(full_path); + } } } } closedir(dir); - - if (dirs.size() > 100) { - std::sort(dirs.begin(), dirs.end(), - [](auto& a, auto& b) { return a.second < b.second; }); - const std::string& oldest_dir = dirs.front().first; - if (!oldest_dir.empty() && oldest_dir != save_path_root) { - CheckUtil::DeleteDir(oldest_dir); - } - } - } else { - cerr << ("ERROR: cannot open root directory for cleanup"); } } @@ -1304,8 +1314,8 @@ int CameraCheckAnalysisy::ngImgSave() { !m_CheckResult_shareP->resultimg.empty() && !m_CheckResult_shareP->cutSrcimg.empty()) { - // 构建保存目录(使用净化后的组件) - std::string save_dir = save_path_root + "/" + safe_product + "/" + safe_camera + "/"; + // 构建保存目录(使用净化后的组件,包含日期子目录) + std::string save_dir = save_path_root + date_str + "/" + safe_product + "/" + safe_camera + "/"; if (CheckUtil::CreateDir(save_dir) != 0) { cerr << ("Failed to create directory: " + save_dir); continue; @@ -1320,7 +1330,7 @@ int CameraCheckAnalysisy::ngImgSave() { // cv::imwrite(save_dir + safe_channel + "_AIMask.png", mask_img); // cv::imwrite(save_dir + safe_channel + "_Resultimg.png", result_img); // cv::imwrite(save_dir + safe_channel + "_CutImg.png", cut_img); - writeLog(save_dir+ safe_channel + "log", m_CheckResult_shareP->det_LogList); + writeLog(save_dir+ safe_channel + "_log", m_CheckResult_shareP->det_LogList); } catch (const cv::Exception& e) { cerr << ("OpenCV exception: " + std::string(e.what())); } catch (const std::exception& e) { diff --git a/AlgorithmModule/src/ImageResultJudge.cpp b/AlgorithmModule/src/ImageResultJudge.cpp index d07f45a..efc022d 100644 --- a/AlgorithmModule/src/ImageResultJudge.cpp +++ b/AlgorithmModule/src/ImageResultJudge.cpp @@ -328,6 +328,7 @@ int ImageResultJudge::ResultJudge(std::shared_ptr pImageResult) float hj = pParam->paramArr[j].hj; float Len = pParam->paramArr[j].length; float md = pParam->paramArr[j].density; + float area_max = pParam->paramArr[j].area_max; Judge_Status = true; @@ -386,6 +387,19 @@ int ImageResultJudge::ResultJudge(std::shared_ptr pImageResult) BOOL_TO_STR(flen >= Len), flen, BOOL_TO_ThanLess(flen > Len), Len); } + if( config_qx_type == CONFIG_QX_NAME_POL_Cell && area_max > 0) + { + if(detArea > area_max) + { + nerrortype = 0; + result = true; + bNG_Status = false; + bYS_Status = false; + } + pQxLog->AddCheckstr(PrintLevel_4, DET_LOG_LEVEL_3, "PolCell_Area_Max", "%s -> %f %s %f ", + BOOL_TO_STR(detArea > area_max), detArea, BOOL_TO_ThanLess(detArea > area_max), area_max); + } + if (!result) { break; diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index 0d28f44..0bc9f13 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.5_" + std::string(__DATE__) + "_" + std::string(__TIME__)); + return std::string("BOE_1.2.7_" + std::string(__DATE__) + "_" + std::string(__TIME__)); } std::string ImgCheckAnalysisy::GetErrorInfo() @@ -1451,6 +1451,9 @@ int ImgCheckAnalysisy::GetCheckResultBLob() BLobToDetResult(); + // 计算缺陷密度 + CalBlobDensity_QX(); + return 0; } @@ -3359,6 +3362,7 @@ int ImgCheckAnalysisy::BLobToDetResult() } } + bool bLD_Standard = false; // 是否通过LD标准判定(跳过UP/DP的IOU检查) if (config_qx_type == CONFIG_QX_NAME_MTX || config_qx_type == CONFIG_QX_NAME_POL_Cell || config_qx_type == CONFIG_QX_NAME_Other || @@ -3366,7 +3370,24 @@ int ImgCheckAnalysisy::BLobToDetResult() { 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 dbresult = -1; + if(m_pFuntion->function.f_LDConfig.bOpen && m_pFuntion->function.f_LDConfig.bUseLD_Standard) + { + if(blobs.blobTab[i].JudgArea >= m_pFuntion->function.f_LDConfig.fLD_Area && + blobs.blobTab[i].grayDis >= m_pFuntion->function.f_LDConfig.fLD_HJ && + blobs.blobTab[i].energy >= m_pFuntion->function.f_LDConfig.fLD_En && + blobs.blobTab[i].len >= m_pFuntion->function.f_LDConfig.fLD_Len) + { + dbresult = 1; + bLD_Standard = true; + } + pQxlog->AddCheckstr(PrintLevel_3, DET_LOG_LEVEL_3, "LD Analysis", "Area %0.2f > %0.2f , hj %0.2f > %0.2f , Energy %0.2f > %0.2f , len %0.2f > %0.2f", + blobs.blobTab[i].JudgArea, m_pFuntion->function.f_LDConfig.fLD_Area, blobs.blobTab[i].grayDis, m_pFuntion->function.f_LDConfig.fLD_HJ, blobs.blobTab[i].energy, m_pFuntion->function.f_LDConfig.fLD_En, blobs.blobTab[i].len, m_pFuntion->function.f_LDConfig.fLD_Len); + } + if(dbresult != 1) + { + dbresult = LDJudge(config_qx_type, roi, JudgArea, blobs.blobTab[i].maxValue, blobs.blobTab[i].grayDis, pQxlog); + } //int detre = 1; // 表示L0 和 DP 都有的 亮的 if (dbresult == 1) @@ -3374,8 +3395,7 @@ int ImgCheckAnalysisy::BLobToDetResult() 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_Pass_1(dbresult), 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) { @@ -3436,8 +3456,8 @@ int ImgCheckAnalysisy::BLobToDetResult() QX_Stauts qx_status = QX_Stauts_Analysis; - // 和UP画面进行IOU判断 - if (m_pFuntion->function.f_UseUpQX.bOpen) + // 和UP画面进行IOU判断 (通过亮点标准的缺陷跳过此检查) + if (!bLD_Standard && m_pFuntion->function.f_UseUpQX.bOpen) { if (fupS >= m_pFuntion->function.f_UseUpQX.fIOU) { @@ -3449,6 +3469,10 @@ int ImgCheckAnalysisy::BLobToDetResult() pQxlog->AddCheckstr(PrintLevel_2, DET_LOG_LEVEL_3, "Up Mask judge", "UseUpQX.bOpen = true ;fupS = %0.2f < %02f ", fupS, m_pFuntion->function.f_UseUpQX.fIOU); } } + else if (bLD_Standard) + { + pQxlog->AddCheckstr(PrintLevel_2, DET_LOG_LEVEL_3, "Up Mask judge", "bLD_Standard = true, skip UP/DP IOU check ;fupS = %0.2f ", fupS); + } else { pQxlog->AddCheckstr(PrintLevel_2, DET_LOG_LEVEL_3, "Up Mask judge", "UseUpQX.bOpen = false ;fupS = %0.2f ", fupS); @@ -3504,6 +3528,7 @@ int ImgCheckAnalysisy::BLobToDetResult() temerror.grayDis = blobs.blobTab[i].grayDis; temerror.density = blobs.blobTab[i].density; temerror.fUpIou = fupS; + temerror.bIsStandardLD = bLD_Standard; temerror.whiteOrBlack = blobs.blobTab[i].whiteOrblack; temerror.qx_status = qx_status; @@ -3921,24 +3946,34 @@ int ImgCheckAnalysisy::AI_Classify_New(const cv::Mat &src_Img, cv::Rect qx_roi, len = qx_roi.height; } - // 长宽比过大,判断成 - if (flenr > 18 && - len > 70 && - widt < 220 && - fjustarea < 800) - { - // printf("\n\n\n\n\n\n\n\n\n--------- flenr %f len %d,widt %d,fjustarea %f\n", flenr,len,widt,fjustarea); - // getchar(); - cls_num = AI_CLass_QX_NAME_line; - strclassName = "line"; - bIsLine = true; - } - // 长宽比过小,判断成 - else if (flenr > 4 && - len > 180 && - widt < 220 && - fjustarea < 800 && - fjustarea > 20) + // // 长宽比过大,判断成 + // if (flenr > 18 && + // len > 70 && + // widt < 220 && + // fjustarea < 800) + // { + // // printf("\n\n\n\n\n\n\n\n\n--------- flenr %f len %d,widt %d,fjustarea %f\n", flenr,len,widt,fjustarea); + // // getchar(); + // cls_num = AI_CLass_QX_NAME_line; + // strclassName = "line"; + // bIsLine = true; + // } + // // 长宽比过小,判断成 + // else if (flenr > 4 && + // len > 180 && + // widt < 220 && + // fjustarea < 800 && + // fjustarea > 20) + // { + // // printf("\n\n\n\n\n\n\n\n\n--------- flenr %f len %d,widt %d,fjustarea %f\n", flenr,len,widt,fjustarea); + // // getchar(); + // cls_num = AI_CLass_QX_NAME_line; + // strclassName = "line"; + // bIsLine = true; + // } + + //长宽比满足,判断为线 + if (flenr > 10) { // printf("\n\n\n\n\n\n\n\n\n--------- flenr %f len %d,widt %d,fjustarea %f\n", flenr,len,widt,fjustarea); // getchar(); @@ -4456,4 +4491,105 @@ bool ImgCheckAnalysisy::JudgeQXAnalysis(int nqx_configType, std::shared_ptrAddCheckstr(PrintLevel_3, DET_LOG_LEVEL_3, "Judge QX ", "det qx %s -> Funtion qx %s open = %s ", qx_name.c_str(), det_qx.c_str(), BOOL_TO_STR(re)); return re; -} \ No newline at end of file +} + +int ImgCheckAnalysisy::CalBlobDensity_QX() +{ + float fs_x = m_fImgage_Scale_X; + float fs_y = m_fImgage_Scale_Y; + double dis_T = m_pBasicConfig->density_R_mm; + if (dis_T <= 0 || dis_T > 99999) + { + dis_T = 5; + } + + if (!m_pDetResult || !m_pDetResult->pQx_ErrorList || m_pDetResult->pQx_ErrorList->size() <= 0) + { + m_pdetlog->AddCheckstr(PrintLevel_1, "Density_QX", "pQx_ErrorList is empty, skip density calc"); + return 0; + } + + m_pdetlog->AddCheckstr(PrintLevel_1, "Density_QX", "Start: dis_T=%.1fmm qx_count=%zu", dis_T, m_pDetResult->pQx_ErrorList->size()); + + for (int i = 0; i < m_pDetResult->pQx_ErrorList->size(); i++) + { + m_pDetResult->pQx_ErrorList->at(i).density = 1; + + if (m_pDetResult->pQx_ErrorList->at(i).nconfig_qx_type == CONFIG_QX_NAME_MTX || + m_pDetResult->pQx_ErrorList->at(i).nconfig_qx_type == CONFIG_QX_NAME_POL_Cell || + m_pDetResult->pQx_ErrorList->at(i).nconfig_qx_type == CONFIG_QX_NAME_LD || + m_pDetResult->pQx_ErrorList->at(i).nconfig_qx_type == CONFIG_QX_NAME_AD) + { + /* code */ + } + else + { + continue; + } + + cv::Rect roi = m_pDetResult->pQx_ErrorList->at(i).roi; + + cv::Point p; + p.x = roi.x + roi.width * 0.5; + p.y = roi.y + roi.height * 0.5; + + int num = 1; + double sum_dis = 0; + + for (int j = 0; j < m_pDetResult->pQx_ErrorList->size(); j++) + { + if (i == j) + { + continue; + } + if (m_pDetResult->pQx_ErrorList->at(j).nconfig_qx_type == CONFIG_QX_NAME_MTX || + m_pDetResult->pQx_ErrorList->at(j).nconfig_qx_type == CONFIG_QX_NAME_POL_Cell || + m_pDetResult->pQx_ErrorList->at(j).nconfig_qx_type == CONFIG_QX_NAME_LD || + m_pDetResult->pQx_ErrorList->at(j).nconfig_qx_type == CONFIG_QX_NAME_AD) + { + /* code */ + } + else + { + continue; + } + cv::Rect roi123 = m_pDetResult->pQx_ErrorList->at(j).roi; + + cv::Point p123; + p123.x = roi123.x + roi123.width * 0.5; + p123.y = roi123.y + roi123.height * 0.5; + + double dis_x = std::abs(p123.x - p.x) * fs_x; + double dis_y = std::abs(p123.y - p.y) * fs_y; + double dis = std::sqrt(dis_x * dis_x + dis_y * dis_y); + if (dis > dis_T) + { + continue; + } + num++; + sum_dis += dis; + } + + float avdis = dis_T; + if (num > 1) + { + avdis = sum_dis / (num - 1); + } + float fScore = (dis_T - avdis) / dis_T; + + double fD = num + fScore; + m_pDetResult->pQx_ErrorList->at(i).density = fD; + + m_pdetlog->AddCheckstr(PrintLevel_2, "Density_QX", " idx=%d type=%d(%s) roi[%d,%d,%d,%d] near_num=%d avgDis=%.2f score=%.3f density=%.2f", + i, + m_pDetResult->pQx_ErrorList->at(i).nconfig_qx_type, + m_pDetResult->pQx_ErrorList->at(i).qx_name.c_str(), + roi.x, roi.y, roi.width, roi.height, + num, avdis, fScore, fD); + } + + m_pdetlog->AddCheckstr(PrintLevel_1, "Density_QX", "End: processed %zu defects", m_pDetResult->pQx_ErrorList->size()); + + return 0; +} + diff --git a/AlgorithmModule/src/QX_Merge_Analysis.cpp b/AlgorithmModule/src/QX_Merge_Analysis.cpp index 1325992..3702942 100644 --- a/AlgorithmModule/src/QX_Merge_Analysis.cpp +++ b/AlgorithmModule/src/QX_Merge_Analysis.cpp @@ -485,7 +485,7 @@ int QX_Merge_Analysis::Analysis_single_Config(QXAnalysis_Config *pconfig, QX_cha fmaxLen = pqxList->qxList.at(i).length; } // 长度超过阈值 - if (pqxList->qxList.at(i).length > pconfig->len) + if (pconfig->len > 0 && pqxList->qxList.at(i).length > pconfig->len) { blenerror = true; pqxList->qxList.at(i).nqx_type = QX_ERROR_TYPE_Len; @@ -593,7 +593,7 @@ int QX_Merge_Analysis::Analysis_single_Config(QXAnalysis_Config *pconfig, QX_cha { int minidx = -1; - bool bdis = true; + bool bdis = (pconfig->dis > 0); double remindis = 0; // 对距离有要求 if (pconfig->dis > 0) @@ -612,6 +612,11 @@ int QX_Merge_Analysis::Analysis_single_Config(QXAnalysis_Config *pconfig, QX_cha allmindis = pqxList->qxList.at(i).tem_dis; } } + else + { + // 无邻近缺陷,距离检查自动通过 + bdis = false; + } remindis = pqxList->qxList.at(i).tem_dis; } @@ -847,11 +852,20 @@ int QX_Merge_Analysis::Analysis_AD(ALL_Qx_DataList *pALLTypeqxList, int qx_idx) int list_idx = -1; int channel_s = 0; + int roi_expand = (round)(pAd_checkParma->analysis_iou.AD_Expand); bool bnew_add = true; for (int idx = 0; idx < AD_list.size(); idx++) { + cv::Rect tem_roi(AD_list.at(idx).roi.x-roi_expand, AD_list.at(idx).roi.y-roi_expand, AD_list.at(idx).roi.width+2*roi_expand, AD_list.at(idx).roi.height+2*roi_expand); + cv::Rect tem_roi2(roi.x-roi_expand, roi.y-roi_expand, roi.width+2*roi_expand, roi.height+2*roi_expand); + float fiou = CheckUtil::CalIoU(AD_list.at(idx).roi, roi); - if (fiou > 0.15) + m_pMergedetlog->AddCheckstr(PrintLevel_3, 3, "CalIoU", + "roi1 %s roi2 %s expand %d iou %f", + CheckUtil::GetRectString(AD_list.at(idx).roi).c_str(), + CheckUtil::GetRectString(roi).c_str(), + roi_expand, fiou); + if (fiou > pAd_checkParma->analysis_iou.AD_IOU) { list_idx = idx; } diff --git a/ConfigModule/include/CheckConfigDefine.h b/ConfigModule/include/CheckConfigDefine.h index 11497a5..e1ddb7c 100644 --- a/ConfigModule/include/CheckConfigDefine.h +++ b/ConfigModule/include/CheckConfigDefine.h @@ -869,6 +869,12 @@ struct Function_AI_LD bool bWTBLD; // 是否是WTB亮点 bool bHSLD; // 黑闪类型的亮点 float fDP_IOU; // DP的IOU + + bool bUseLD_Standard; // 是否使用亮点标准化参数 + float fLD_Area; // 亮点面积 + float fLD_En; // 亮点的能量 + float fLD_HJ; // 亮点灰阶 + float fLD_Len; // 亮点长度 Function_AI_LD() { Init(); @@ -880,6 +886,11 @@ struct Function_AI_LD bWTBLD = false; bHSLD = false; fDP_IOU = 0.1; + fLD_Area = -1; + fLD_En = -1; + fLD_HJ = -1; + fLD_Len = -1; + bUseLD_Standard = false; } void copy(Function_AI_LD tem) { @@ -888,6 +899,11 @@ struct Function_AI_LD this->bWTBLD = tem.bWTBLD; this->bHSLD = tem.bHSLD; this->fDP_IOU = tem.fDP_IOU; + this->fLD_Area = tem.fLD_Area; + this->fLD_En = tem.fLD_En; + this->fLD_HJ = tem.fLD_HJ; + this->fLD_Len = tem.fLD_Len; + this->bUseLD_Standard = tem.bUseLD_Standard; } void print(std::string str) { @@ -1519,6 +1535,34 @@ struct AD_Analysisy_S return str123; } }; +// 暗点同位置判断(IOU) +struct AD_Analysisy_IOU +{ + float AD_IOU; // IOU 阈值 + float AD_Expand; // 扩张阈值 + AD_Analysisy_IOU() + { + Init(); + } + void Init() + { + AD_IOU = 0.15f; + AD_Expand = 0.0f; + } + void copy(AD_Analysisy_IOU tem) + { + this->AD_IOU = tem.AD_IOU; + this->AD_Expand = tem.AD_Expand; + } + std::string GetInfo(std::string str) + { + char buffer[256]; + sprintf(buffer, "%s:AD_IOU %f AD_Expand %f;", str.c_str(), + AD_IOU, AD_Expand); + std::string str123 = buffer; + return str123; + } +}; // 暗点检测功能 struct Function_AD_Check { @@ -1530,6 +1574,7 @@ struct Function_AD_Check AD_Analysisy_Num analysis_num; // 数量分析 AD_Analysisy_Dis analysis_dis; // 距离分析 AD_Analysisy_S analysis_s; // s 标准分析 + AD_Analysisy_IOU analysis_iou; // IOU 分析 Function_AD_Check() { @@ -1544,6 +1589,7 @@ struct Function_AD_Check analysis_num.Init(); analysis_dis.Init(); analysis_s.Init(); + analysis_iou.Init(); } void copy(Function_AD_Check tem) @@ -1555,16 +1601,18 @@ struct Function_AD_Check this->analysis_num.copy(tem.analysis_num); this->analysis_dis.copy(tem.analysis_dis); this->analysis_s.copy(tem.analysis_s); + this->analysis_iou.copy(tem.analysis_iou); } void print(std::string str) { - printf("%s>>bOpen %d %s %s %s %s %s %s\n", str.c_str(), + printf("%s>>bOpen %d %s %s %s %s %s %s %s\n", str.c_str(), bOpen, S_standard_3s.GetInfo("3S").c_str(), S_standard_2s.GetInfo("2S").c_str(), S_standard_1s.GetInfo("1S").c_str(), analysis_num.GetInfo("analysis_num").c_str(), analysis_dis.GetInfo("analysis_dis").c_str(), - analysis_s.GetInfo("analysis_s").c_str()); + analysis_s.GetInfo("analysis_s").c_str(), + analysis_iou.GetInfo("analysis_iou").c_str()); } std::string GetInfo(std::string str) { @@ -1577,6 +1625,7 @@ struct Function_AD_Check str123 += analysis_num.GetInfo("analysis_num"); str123 += analysis_dis.GetInfo("analysis_dis"); str123 += analysis_s.GetInfo("analysis_s"); + str123 += analysis_iou.GetInfo("analysis_iou"); return str123; } @@ -2155,6 +2204,7 @@ struct Base_Function_AD_Check AD_Analysisy_Num analysis_num; // 数量分析 AD_Analysisy_Dis analysis_dis; // 距离分析 AD_Analysisy_S analysis_s; // s 标准分析 + AD_Analysisy_IOU analysis_iou; // IOU 分析 Base_Function_AD_Check() { @@ -2169,6 +2219,7 @@ struct Base_Function_AD_Check analysis_num.Init(); analysis_dis.Init(); analysis_s.Init(); + analysis_iou.Init(); } void copy(Base_Function_AD_Check tem) @@ -2180,6 +2231,7 @@ struct Base_Function_AD_Check this->analysis_num.copy(tem.analysis_num); this->analysis_dis.copy(tem.analysis_dis); this->analysis_s.copy(tem.analysis_s); + this->analysis_iou.copy(tem.analysis_iou); } void print(std::string str) { @@ -2189,7 +2241,8 @@ struct Base_Function_AD_Check S_standard_1s.GetInfo("1S").c_str(), analysis_num.GetInfo("analysis_num").c_str(), analysis_dis.GetInfo("analysis_dis").c_str(), - analysis_s.GetInfo("analysis_s").c_str()); + analysis_s.GetInfo("analysis_s").c_str(), + analysis_iou.GetInfo("analysis_iou").c_str()); } std::string GetInfo(std::string str) { @@ -2202,6 +2255,7 @@ struct Base_Function_AD_Check str123 += analysis_num.GetInfo("analysis_num"); str123 += analysis_dis.GetInfo("analysis_dis"); str123 += analysis_s.GetInfo("analysis_s"); + str123 += analysis_iou.GetInfo("analysis_iou"); return str123; } diff --git a/ConfigModule/src/ConfigManager.cpp b/ConfigModule/src/ConfigManager.cpp index 70439ce..dfcc692 100644 --- a/ConfigModule/src/ConfigManager.cpp +++ b/ConfigModule/src/ConfigManager.cpp @@ -22,62 +22,6 @@ ConfigManager::~ConfigManager() { } -std::vector QX_Result_Names = - { - "OK", - "AD_YX", - "X_Line", - "Y_Line", - "fangge", - "Rubbing_Mura", - "Broken_line", - "ZARA", - "MTX", - "POL_Cell", - "Bright_Point", - "Dark_Point", - "BLack_Point", - "White_Point", - "Scratch", - "Weak_Bright_Mura", - "No_Label", - "Bright_Mura_Exe", - "Sweak_Line_Dark", - "STEAM_POCKET", - "Dirty", - "other", - "Cell_W", - "Cell_B", - "LackPol"}; -std::vector QX_Result_Code = - { - "P1153", - "P6873", - "P3351", - "P3452", - "P3453", - "P1550", - "P3379", - "P1153", - "P1164", - "P1101", - "P1112", - "P1111", - "P1104", - "P1103", - "P1557", - "P1654", - "P2833", - "P1549", - "P1204", - "P2534", - "P2534", - "P1101", - "P1103", - "P1104", - "P8001", -}; - int ReadFlawCodeConfig(std::string json_path) { m_FlawCodeList.erase(m_FlawCodeList.begin(), m_FlawCodeList.end()); diff --git a/ConfigModule/src/JsonConfig.cpp b/ConfigModule/src/JsonConfig.cpp index 6168c86..a2e1f79 100644 --- a/ConfigModule/src/JsonConfig.cpp +++ b/ConfigModule/src/JsonConfig.cpp @@ -560,6 +560,27 @@ int ChannelFuntonConfigJson::GetFunction(Json::Value value, CheckFunction &funct { function.f_LDConfig.fDP_IOU = value_f["form"]["LD_Det"]["DP_IOU"].asFloat(); } + + if (value_f["form"]["LD_Standard"]["LD_Area"]) + { + function.f_LDConfig.fLD_Area = value_f["form"]["LD_Standard"]["LD_Area"].asFloat(); + } + if (value_f["form"]["LD_Standard"]["LD_En"]) + { + function.f_LDConfig.fLD_En = value_f["form"]["LD_Standard"]["LD_En"].asFloat(); + } + if (value_f["form"]["LD_Standard"]["LD_HJ"]) + { + function.f_LDConfig.fLD_HJ = value_f["form"]["LD_Standard"]["LD_HJ"].asFloat(); + } + if (value_f["form"]["LD_Standard"]["LD_Len"]) + { + function.f_LDConfig.fLD_Len = value_f["form"]["LD_Standard"]["LD_Len"].asFloat(); + } + if (value_f["form"]["LD_Standard"]["bUseLD_Standard"]) + { + function.f_LDConfig.bUseLD_Standard = value_f["form"]["LD_Standard"]["bUseLD_Standard"].asBool(); + } } else { @@ -970,7 +991,6 @@ int ChannelFuntonConfigJson::GetFunction(Json::Value value, CheckFunction &funct { function.f_AD_Check.S_standard_3s.len = value_f["form"]["AD_S_Standard"]["AD_3S_Len"].asFloat(); } - if (value_f["form"]["AD_S_Standard"]["AD_2S_Area"]) { function.f_AD_Check.S_standard_2s.area = value_f["form"]["AD_S_Standard"]["AD_2S_Area"].asFloat(); @@ -979,7 +999,6 @@ int ChannelFuntonConfigJson::GetFunction(Json::Value value, CheckFunction &funct { function.f_AD_Check.S_standard_2s.len = value_f["form"]["AD_S_Standard"]["AD_2S_Len"].asFloat(); } - if (value_f["form"]["AD_S_Standard"]["AD_1S_Area"]) { function.f_AD_Check.S_standard_1s.area = value_f["form"]["AD_S_Standard"]["AD_1S_Area"].asFloat(); @@ -1011,7 +1030,6 @@ int ChannelFuntonConfigJson::GetFunction(Json::Value value, CheckFunction &funct { function.f_AD_Check.analysis_s.bOpen = value_f["form"]["AD_Check_S"]["Open"].asBool(); } - if (value_f["form"]["AD_Check_S"]["S_value"]) { function.f_AD_Check.analysis_s.Check_s_Value = value_f["form"]["AD_Check_S"]["S_value"].asInt(); @@ -1024,6 +1042,15 @@ int ChannelFuntonConfigJson::GetFunction(Json::Value value, CheckFunction &funct { function.f_AD_Check.analysis_s.Check_s_Num = value_f["form"]["AD_Check_S"]["Num"].asInt(); } + + if (value_f["form"]["AD_Check_IOU"]["AD_IOU"]) + { + function.f_AD_Check.analysis_iou.AD_IOU = value_f["form"]["AD_Check_IOU"]["AD_IOU"].asFloat(); + } + if (value_f["form"]["AD_Check_IOU"]["AD_Expand"]) + { + function.f_AD_Check.analysis_iou.AD_Expand = value_f["form"]["AD_Check_IOU"]["AD_Expand"].asFloat(); + } } else {