|
|
|
@ -648,6 +648,12 @@ int ImgCheckAnalysisy::CheckRun()
|
|
|
|
float aouter = CheckUtil::getLongAxisAngle(m_outer_rroi);
|
|
|
|
float aouter = CheckUtil::getLongAxisAngle(m_outer_rroi);
|
|
|
|
float ainner = CheckUtil::getLongAxisAngle(m_inner_rroi);
|
|
|
|
float ainner = CheckUtil::getLongAxisAngle(m_inner_rroi);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 计算内边缘宽高与标准差值
|
|
|
|
|
|
|
|
float dinnerLen = std::abs(m_inner_rroi.size.width - m_pbaseCheckFunction->ALign_Config.len) * m_fImgage_Scale_X;
|
|
|
|
|
|
|
|
float dinnerWidth = std::abs(m_inner_rroi.size.height - m_pbaseCheckFunction->ALign_Config.width) * m_fImgage_Scale_Y;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool bSizeerr = (dinnerLen > m_pbaseCheckFunction->ALign_Config.len_diff || dinnerWidth > m_pbaseCheckFunction->ALign_Config.width_diff);
|
|
|
|
|
|
|
|
|
|
|
|
float diff_align = std::fabs(aouter - ainner);
|
|
|
|
float diff_align = std::fabs(aouter - ainner);
|
|
|
|
diff_align = std::fmod(diff_align, 180.0f); // 模 180 度
|
|
|
|
diff_align = std::fmod(diff_align, 180.0f); // 模 180 度
|
|
|
|
|
|
|
|
|
|
|
|
@ -665,31 +671,31 @@ int ImgCheckAnalysisy::CheckRun()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 使用 ALign_Config.x_offset / y_offset (mm) 卡控内外边缘中心偏移(mm 转像素)
|
|
|
|
// 2. 使用 ALign_Config.x_offset / y_offset (mm) 卡控内外边缘中心偏移(mm 转像素)
|
|
|
|
float offX_px = 0.0f;
|
|
|
|
float offX_mm = 0.0f;
|
|
|
|
float offY_px = 0.0f;
|
|
|
|
float offY_mm = 0.0f;
|
|
|
|
if (m_pbaseCheckFunction != NULL)
|
|
|
|
if (m_pbaseCheckFunction != NULL)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (m_fImgage_Scale_X > 0.0f)
|
|
|
|
if (m_fImgage_Scale_X > 0.0f)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
offX_px = m_pbaseCheckFunction->ALign_Config.x_offset / m_fImgage_Scale_X;
|
|
|
|
offX_mm = m_pbaseCheckFunction->ALign_Config.x_offset;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (m_fImgage_Scale_Y > 0.0f)
|
|
|
|
if (m_fImgage_Scale_Y > 0.0f)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
offY_px = m_pbaseCheckFunction->ALign_Config.y_offset / m_fImgage_Scale_Y;
|
|
|
|
offY_mm = m_pbaseCheckFunction->ALign_Config.y_offset;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 3. 内外边缘中心坐标偏移(像素)
|
|
|
|
// 3. 内外边缘中心坐标偏移(像素)
|
|
|
|
float dx_px = std::fabs(m_outer_rroi.center.x - m_inner_rroi.center.x);
|
|
|
|
float dx_mm = std::fabs(m_outer_rroi.center.x - m_inner_rroi.center.x) * m_fImgage_Scale_X;
|
|
|
|
float dy_px = std::fabs(m_outer_rroi.center.y - m_inner_rroi.center.y);
|
|
|
|
float dy_mm = std::fabs(m_outer_rroi.center.y - m_inner_rroi.center.y) * m_fImgage_Scale_Y;
|
|
|
|
|
|
|
|
|
|
|
|
bool bAngleErr = diff_align > angleTh;
|
|
|
|
bool bAngleErr = diff_align > angleTh;
|
|
|
|
bool bOffsetXErr = (offX_px > 0.0f) && (dx_px > offX_px);
|
|
|
|
bool bOffsetXErr = (offX_mm > 0.0f) && (dx_mm > offX_mm);
|
|
|
|
bool bOffsetYErr = (offY_px > 0.0f) && (dy_px > offY_px);
|
|
|
|
bool bOffsetYErr = (offY_mm > 0.0f) && (dy_mm > offY_mm);
|
|
|
|
bool bOffsetErr = bOffsetXErr || bOffsetYErr;
|
|
|
|
bool bOffsetErr = bOffsetXErr || bOffsetYErr;
|
|
|
|
|
|
|
|
|
|
|
|
// 角度超差或中心偏移超差 -> 添加到缺陷列表
|
|
|
|
// 角度超差或中心偏移超差 -> 添加到缺陷列表
|
|
|
|
if (bAngleErr || bOffsetErr)
|
|
|
|
if (bAngleErr || bOffsetErr || bSizeerr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
QX_ERROR_INFO_ alignErr;
|
|
|
|
QX_ERROR_INFO_ alignErr;
|
|
|
|
alignErr.Idx = static_cast<int>(m_pDetResult->pQx_ErrorList->size());
|
|
|
|
alignErr.Idx = static_cast<int>(m_pDetResult->pQx_ErrorList->size());
|
|
|
|
@ -703,8 +709,8 @@ int ImgCheckAnalysisy::CheckRun()
|
|
|
|
alignErr.fbreadth = tplRect.height * m_fImgage_Scale_Y;
|
|
|
|
alignErr.fbreadth = tplRect.height * m_fImgage_Scale_Y;
|
|
|
|
|
|
|
|
|
|
|
|
// 缺陷列表中原 other(其他)已移除;内外边缘对齐超差暂按 C型卡口异常 上报(待确认)
|
|
|
|
// 缺陷列表中原 other(其他)已移除;内外边缘对齐超差暂按 C型卡口异常 上报(待确认)
|
|
|
|
alignErr.nconfig_qx_type = CONFIG_QX_NAME_C_BianXing;
|
|
|
|
alignErr.nconfig_qx_type = CONFIG_QX_NAME_HunLiao;
|
|
|
|
alignErr.qx_name = CONFIG_QX_NAME_Names[CONFIG_QX_NAME_C_BianXing];
|
|
|
|
alignErr.qx_name = CONFIG_QX_NAME_Names[CONFIG_QX_NAME_HunLiao];
|
|
|
|
alignErr.grayDis = diff_align; // 记录内外边缘夹角(度)
|
|
|
|
alignErr.grayDis = diff_align; // 记录内外边缘夹角(度)
|
|
|
|
alignErr.detRegionidxList.push_back(0);
|
|
|
|
alignErr.detRegionidxList.push_back(0);
|
|
|
|
|
|
|
|
|
|
|
|
@ -718,13 +724,18 @@ int ImgCheckAnalysisy::CheckRun()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (bOffsetXErr)
|
|
|
|
if (bOffsetXErr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_pdetlog->AddCheckstr(PrintLevel_0, "Align Check", "center offset dx %.1f px > %.1f px",
|
|
|
|
m_pdetlog->AddCheckstr(PrintLevel_0, "Align Check", "center offset dx %.1f mm > %.1f mm",
|
|
|
|
dx_px, offX_px);
|
|
|
|
dx_mm, offX_mm);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (bOffsetYErr)
|
|
|
|
if (bOffsetYErr)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_pdetlog->AddCheckstr(PrintLevel_0, "Align Check", "center offset dy %.1f px > %.1f px",
|
|
|
|
m_pdetlog->AddCheckstr(PrintLevel_0, "Align Check", "center offset dy %.1f mm > %.1f mm",
|
|
|
|
dy_px, offY_px);
|
|
|
|
dy_mm, offY_mm);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bSizeerr)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
m_pdetlog->AddCheckstr(PrintLevel_0, "Align Check", "inner size diff len %.1f mm, width %.1f mm > threshold",
|
|
|
|
|
|
|
|
dinnerLen, dinnerWidth);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|