From 87746fc05dad4361773bd3f5ab29ee95f02a5594 Mon Sep 17 00:00:00 2001 From: liusiyang Date: Sat, 17 Oct 2026 11:18:21 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E5=88=86=E7=B1=BB=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=90=8E=E6=B7=BB=E5=8A=A0=E5=8E=BB=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AlgorithmModule/include/ImgCheckAnalysisy.hpp | 3 + AlgorithmModule/src/ImgCheckAnalysisy.cpp | 70 +++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/AlgorithmModule/include/ImgCheckAnalysisy.hpp b/AlgorithmModule/include/ImgCheckAnalysisy.hpp index 45cb8a5..96a6294 100644 --- a/AlgorithmModule/include/ImgCheckAnalysisy.hpp +++ b/AlgorithmModule/include/ImgCheckAnalysisy.hpp @@ -260,6 +260,9 @@ private: // 更新成像精度 int UpdateImgageScale(); + // 分类完成后按 bbox 完全相等去重(同一缺陷被多个 mask 来源各提取一次) + int DedupBlob_ByBBox(); + // 把blob 汇总成 检测结果。 int BLobToDetResult(); // 二次计算缺陷面积 diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index 59ada27..3745247 100644 --- a/AlgorithmModule/src/ImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ImgCheckAnalysisy.cpp @@ -8,6 +8,22 @@ // BQ blob 的分类结果会覆盖 ErrType,用该标记记录来源掩码是 BQ mask, // 供 CalBlob_Other / CalBLobMean_GrayDis 在计算能量、灰度时选中正确的 mask。 static const int BQ_BLOB_SOURCE_FLAG = -100; +// blob 来源优先级:数值越大越优先保留(BQ 专用模型 > 127/RLine 专用模型 > 主检测) +static int BlobSourcePriority(const ERROR_DOTS_BLOB_DATA &b) +{ + if (b.UserErrorType == BQ_BLOB_SOURCE_FLAG) + { + return 3; + } + if (b.ErrType == CONFIG_QX_NAME_white_Cell || + b.ErrType == CONFIG_QX_NAME_black_Cell || + b.ErrType == CONFIG_QX_NAME_RLine_X || + b.ErrType == CONFIG_QX_NAME_RLine_Y) + { + return 2; + } + return 1; +} // 用于排序轮廓的比较函数 static bool compareContourAreas(const vector &contour1, const vector &contour2) { @@ -1493,6 +1509,10 @@ int ImgCheckAnalysisy::GetCheckResultBLob() m_Classtask->waitComplate(); } + // 分类完成后 ErrType 已是最终类型,此处按 bbox 完全相等去重, + // 避免同一缺陷被主检测与 BQ/127/RLine 多条链路各报一次。 + DedupBlob_ByBBox(); + // m_Classtask->waitComplate(); long t13 = CheckUtil::getcurTime(); @@ -4182,6 +4202,56 @@ int ImgCheckAnalysisy::UpdateImgageScale() return 0; } +// 分类完成后按 bbox 完全相等去重:同一缺陷可能被主检测与 BQ/127/RLine 各提取一次。 +// 当前判据不比较 ErrType,只要求 minx/miny/maxx/maxy 完全一致; +// 重复时保留来源优先级更高的结果(BQ > 127/RLine > 主检测)。 +int ImgCheckAnalysisy::DedupBlob_ByBBox() +{ + int oldCount = blobs.blobCount; + if (oldCount <= 1) + { + return 0; + } + + int writeIdx = 0; + int mergeNum = 0; + for (int i = 0; i < oldCount; i++) + { + bool bmerged = false; + for (int j = 0; j < writeIdx; j++) + { + if (blobs.blobTab[i].minx == blobs.blobTab[j].minx && + blobs.blobTab[i].miny == blobs.blobTab[j].miny && + blobs.blobTab[i].maxx == blobs.blobTab[j].maxx && + blobs.blobTab[i].maxy == blobs.blobTab[j].maxy) + { + // bbox 完全一致:保留来源优先级更高的结果 + if (BlobSourcePriority(blobs.blobTab[i]) > BlobSourcePriority(blobs.blobTab[j])) + { + blobs.blobTab[j] = blobs.blobTab[i]; + } + mergeNum++; + bmerged = true; + break; + } + } + + if (!bmerged) + { + if (writeIdx != i) + { + blobs.blobTab[writeIdx] = blobs.blobTab[i]; + } + writeIdx++; + } + } + + blobs.blobCount = writeIdx; + m_pdetlog->AddCheckstr(PrintLevel_1, DET_LOG_LEVEL_3, "DedupBlob", + "bbox dedup: before %d after %d merged %d", oldCount, writeIdx, mergeNum); + return 0; +} + int ImgCheckAnalysisy::BLobToDetResult() { long t1 = CheckUtil::getcurTime();