feat 分类完成后添加去重

dev_lsy
liusiyang 3 weeks ago
parent 14c6066ff9
commit 87746fc05d

@ -260,6 +260,9 @@ private:
// 更新成像精度
int UpdateImgageScale();
// 分类完成后按 bbox 完全相等去重(同一缺陷被多个 mask 来源各提取一次)
int DedupBlob_ByBBox();
// 把blob 汇总成 检测结果。
int BLobToDetResult();
// 二次计算缺陷面积

@ -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<Point> &contour1, const vector<Point> &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();

Loading…
Cancel
Save