From 01247bccb953d0ca1ec623ee6219ce1b73effdad Mon Sep 17 00:00:00 2001 From: liusiyang Date: Fri, 9 Oct 2026 22:17:45 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E4=B8=BB=E9=80=9A=E9=81=93=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=AC=A1=E9=80=9A=E9=81=93?= =?UTF-8?q?=E8=B5=B0=E8=80=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AlgorithmModule/include/QX_Merge_Analysis.h | 3 +- AlgorithmModule/src/ALLImgCheckAnalysisy.cpp | 24 ++++----- AlgorithmModule/src/QX_Merge_Analysis.cpp | 57 +++++++++++++++++++- 3 files changed, 69 insertions(+), 15 deletions(-) diff --git a/AlgorithmModule/include/QX_Merge_Analysis.h b/AlgorithmModule/include/QX_Merge_Analysis.h index acd038a..7e48493 100644 --- a/AlgorithmModule/include/QX_Merge_Analysis.h +++ b/AlgorithmModule/include/QX_Merge_Analysis.h @@ -214,7 +214,8 @@ private: int Judge_OK_Config(); int Judge_NG_Config(); - int Analysis_AD(ALL_Qx_DataList *pALLTypeqxList, int qx_idx); + // pAllowChannels 非空时仅列表内通道参与分析(用于主通道为空回退时仅跑次通道); nullptr=不过滤 + int Analysis_AD(ALL_Qx_DataList *pALLTypeqxList, int qx_idx, const std::vector *pAllowChannels = nullptr); int Analysis_AD_Bind(ALL_Qx_DataList *pALLTypeqxList, int qx_idx); // 关联过滤源过滤:移除与关联通道过滤源缺陷重叠的缺陷,使其不参与后续数量/距离/S分析 diff --git a/AlgorithmModule/src/ALLImgCheckAnalysisy.cpp b/AlgorithmModule/src/ALLImgCheckAnalysisy.cpp index 9319eff..4c274f1 100644 --- a/AlgorithmModule/src/ALLImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ALLImgCheckAnalysisy.cpp @@ -318,18 +318,18 @@ int ALLImgCheckAnalysisy::InitAIFactory() GPU_Config gpu; int num = 0; - for (int i = 0; i < MAX_GPU_NUM; i++) - { - gpu.UseGPUList[i] = m_RunConfig.UseGPUList[i]; - if (gpu.UseGPUList[i] >= 0) - { - num++; - } - } - if (num == 0) - { - gpu.UseGPUList[0] = 0; - gpu.UseGPUList[1] = 1; + // for (int i = 0; i < MAX_GPU_NUM; i++) + // { + // gpu.UseGPUList[i] = m_RunConfig.UseGPUList[i]; + // if (gpu.UseGPUList[i] >= 0) + // { + // num++; + // } + // } + // if (num == 0) + { + gpu.UseGPUList[0] = 1; + gpu.UseGPUList[1] = -1; } for (int i = 0; i < MAX_GPU_NUM; i++) { diff --git a/AlgorithmModule/src/QX_Merge_Analysis.cpp b/AlgorithmModule/src/QX_Merge_Analysis.cpp index 941fc0c..3ecace4 100644 --- a/AlgorithmModule/src/QX_Merge_Analysis.cpp +++ b/AlgorithmModule/src/QX_Merge_Analysis.cpp @@ -8,6 +8,9 @@ #include "CheckUtil.hpp" #include "CheckConfigDefine.h" +// Analysis_AD_Bind 返回码: 主通道为空(配置为空或本次无匹配通道), 调用方回退执行 Analysis_AD +static const int AD_BIND_RE_MAIN_EMPTY = 2; + QX_Merge_Analysis::QX_Merge_Analysis() { m_bExit = false; @@ -1025,7 +1028,35 @@ int QX_Merge_Analysis::Analysis_QXtype(ALL_Qx_DataList *pALLTypeqxList, int qx_i { if(m_pbaseCheckFunction->ad_check.analysis_bind.bUse) { - Analysis_AD_Bind(pALLTypeqxList, qx_idx); + // 主通道为空: Analysis_AD_Bind 返回回退码, 用次通道列表里的通道走 Analysis_AD 老逻辑 + if (Analysis_AD_Bind(pALLTypeqxList, qx_idx) == AD_BIND_RE_MAIN_EMPTY) + { + // 回退过滤: 仅次通道列表(2s_second_channel + 3s_second_channel, 去重)中的通道参与 + std::vector fallback_channels; + const std::vector &fallback_sec2 = m_pbaseCheckFunction->ad_check.analysis_bind.second_channel_2s; + const std::vector &fallback_sec3 = m_pbaseCheckFunction->ad_check.analysis_bind.second_channel_3s; + fallback_channels.insert(fallback_channels.end(), fallback_sec2.begin(), fallback_sec2.end()); + for (size_t k = 0; k < fallback_sec3.size(); k++) + { + if (std::find(fallback_channels.begin(), fallback_channels.end(), fallback_sec3[k]) == fallback_channels.end()) + { + fallback_channels.push_back(fallback_sec3[k]); + } + } + std::string strFallbackChannels; + for (size_t k = 0; k < fallback_channels.size(); k++) + { + strFallbackChannels += fallback_channels[k]; + if (k + 1 < fallback_channels.size()) + { + strFallbackChannels += ","; + } + } + m_pMergedetlog->AddCheckstr(PrintLevel_1, 3, "Analysis_AD_Bind", + "main channel empty --> fallback Analysis_AD (only second channels: %s)", + fallback_channels.empty() ? "" : strFallbackChannels.c_str()); + Analysis_AD(pALLTypeqxList, qx_idx, &fallback_channels); + } } else { @@ -1073,7 +1104,7 @@ int QX_Merge_Analysis::Judge_NG_Config() return 0; } -int QX_Merge_Analysis::Analysis_AD(ALL_Qx_DataList *pALLTypeqxList, int qx_idx) +int QX_Merge_Analysis::Analysis_AD(ALL_Qx_DataList *pALLTypeqxList, int qx_idx, const std::vector *pAllowChannels) { AD_list.clear(); if (!m_pbaseCheckFunction) @@ -1092,6 +1123,14 @@ int QX_Merge_Analysis::Analysis_AD(ALL_Qx_DataList *pALLTypeqxList, int qx_idx) { QX_channel_List *pQXChannelList = &pALLTypeqxList->channelqxList[i]; + // 回退过滤: pAllowChannels 非空时仅允许列表内(次通道列表)的通道参与 + if (pAllowChannels && + std::find(pAllowChannels->begin(), pAllowChannels->end(), pQXChannelList->channel_name) == pAllowChannels->end()) + { + pQXChannelList->pChannelDetlog->AddCheckstr(PrintLevel_1, 3, "Analysis_AD", + "channel %s not in allow list(fallback) --> skip", pQXChannelList->channel_name.c_str()); + continue; + } if (!pAd_checkParma) { continue; @@ -1336,6 +1375,14 @@ int QX_Merge_Analysis::Analysis_AD(ALL_Qx_DataList *pALLTypeqxList, int qx_idx) { QX_channel_List *pQXChannelList = &pALLTypeqxList->channelqxList[i]; + // 回退过滤: pAllowChannels 非空时仅允许列表内(次通道列表)的通道被判定NG + if (pAllowChannels && + std::find(pAllowChannels->begin(), pAllowChannels->end(), pQXChannelList->channel_name) == pAllowChannels->end()) + { + pQXChannelList->pChannelDetlog->AddCheckstr(PrintLevel_1, 3, "Analysis_AD", + "channel %s not in allow list(fallback) --> skip NG mark", pQXChannelList->channel_name.c_str()); + continue; + } if (!pAd_checkParma->bOpen) { @@ -1546,6 +1593,12 @@ int QX_Merge_Analysis::Analysis_AD_Bind(ALL_Qx_DataList *pALLTypeqxList, int qx_ m_pMergedetlog->AddCheckstr(PrintLevel_2, 3, "Analysis_AD_Bind", "main_channel %d second_channel %d", (int)main_channel_s_qxList.size(), (int)second_channel_s_qxList.size()); + /* 主通道为空(配置为空或本次无匹配通道): 返回回退码, 由调用方改用 Analysis_AD 老逻辑 */ + if (main_channel_s_qxList.empty()) + { + return AD_BIND_RE_MAIN_EMPTY; + } + /* 画面分析 */ AD_list_bind.clear(); for(int i_main = 0; i_main < main_channel_s_qxList.size(); i_main++)