| | |
| | | CvMemStorage* pStorage = cvCreateMemStorage(0); |
| | | cvFindContours(pProcBinImage, pStorage, &pContours, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); |
| | | for (CvSeq* c = pContours; c != nullptr; c = c->h_next) { |
| | | if (c->total == 0) { |
| | | continue; |
| | | } |
| | | |
| | | double dLength = cvArcLength(c); |
| | | if (dLength < 2000) { |
| | | continue; |
| | | } |
| | | |
| | | if (std::abs(dLength - 7000) > 1000) { |
| | | CvRect rect = cvBoundingRect(c, 0); |
| | | CRect rtDefectPos_pxl( |
| | | rect.x + rtROI.left, |
| | | rect.y + rtROI.top, |
| | | rect.x + rect.width + rtROI.left, |
| | | rect.y + rect.height + rtROI.top |
| | | ); |
| | | |
| | | CPoint ptDefectPos_pxl(0, 0); |
| | | CvPoint* ptStart = reinterpret_cast<CvPoint*>(CV_GET_SEQ_ELEM(CvPoint, c, 0)); |
| | | CvPoint* ptEnd = reinterpret_cast<CvPoint*>(CV_GET_SEQ_ELEM(CvPoint, c, c->total - 1)); |
| | | if (ptStart->x < ptEnd->x) { |
| | | ptDefectPos_pxl.x = ptStart->x + rtROI.left; |
| | | ptDefectPos_pxl.y = ptStart->y + rtROI.top; |
| | | } |
| | | else { |
| | | ptDefectPos_pxl.x = ptEnd->x + rtROI.left; |
| | | ptDefectPos_pxl.y = ptEnd->y + rtROI.top; |
| | | } |
| | | |
| | | CDefect_Info info; |
| | | info.m_iFrameIdx = stFrame.nFrameIdx; |
| | | info.m_nCamID = m_iCamera; |
| | | info.m_nScanIdx = stFrame.nScanIdx; |
| | | info.m_nGlassStartLine = m_pGlassData->GetSideData(emDim)->m_nGlassStartLine; |
| | | info.m_nSideIdx = (int)emDim; |
| | | info.m_ptDefectPos_pxl = ptDefectPos_pxl; |
| | | info.m_rtDefectPos_pxl = rtDefectPos_pxl; |
| | | info.m_DefectLoc = DefectLoc_Notch_Broken; |
| | | m_pDefectControl->ExtractDefect_NotchBroken(emDim, m_iCamera, stFrame.nScanIdx, info); |
| | | g_pLog->DisplayMessage(_T("[WARN] Notch defect contour length deviates significantly from expected: %f"), dLength); |
| | | break; |
| | | } |