|
|
|
@ -8,6 +8,22 @@
|
|
|
|
// BQ blob 的分类结果会覆盖 ErrType,用该标记记录来源掩码是 BQ mask,
|
|
|
|
// BQ blob 的分类结果会覆盖 ErrType,用该标记记录来源掩码是 BQ mask,
|
|
|
|
// 供 CalBlob_Other / CalBLobMean_GrayDis 在计算能量、灰度时选中正确的 mask。
|
|
|
|
// 供 CalBlob_Other / CalBLobMean_GrayDis 在计算能量、灰度时选中正确的 mask。
|
|
|
|
static const int BQ_BLOB_SOURCE_FLAG = -100;
|
|
|
|
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)
|
|
|
|
static bool compareContourAreas(const vector<Point> &contour1, const vector<Point> &contour2)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -1493,6 +1509,10 @@ int ImgCheckAnalysisy::GetCheckResultBLob()
|
|
|
|
m_Classtask->waitComplate();
|
|
|
|
m_Classtask->waitComplate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 分类完成后 ErrType 已是最终类型,此处按 bbox 完全相等去重,
|
|
|
|
|
|
|
|
// 避免同一缺陷被主检测与 BQ/127/RLine 多条链路各报一次。
|
|
|
|
|
|
|
|
DedupBlob_ByBBox();
|
|
|
|
|
|
|
|
|
|
|
|
// m_Classtask->waitComplate();
|
|
|
|
// m_Classtask->waitComplate();
|
|
|
|
|
|
|
|
|
|
|
|
long t13 = CheckUtil::getcurTime();
|
|
|
|
long t13 = CheckUtil::getcurTime();
|
|
|
|
@ -4182,6 +4202,56 @@ int ImgCheckAnalysisy::UpdateImgageScale()
|
|
|
|
return 0;
|
|
|
|
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()
|
|
|
|
int ImgCheckAnalysisy::BLobToDetResult()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
long t1 = CheckUtil::getcurTime();
|
|
|
|
long t1 = CheckUtil::getcurTime();
|
|
|
|
|