From 785725de6f33118f29fbf4affd524267b7c4d5b6 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期五, 22 八月 2025 15:40:29 +0800
Subject: [PATCH] 1. 添加NotchBroken报警

---
 EdgeInspector_App/Data/DefectStorage.cpp    |   43 +++++++++++++++++++++
 EdgeInspector_App/Process/InspectCamera.cpp |   34 +++++++++++++++++
 EdgeInspector_App/Data/DefectStorage.h      |    1 
 EdgeInspector_App/Defect.h                  |    2 +
 EdgeInspector_App/Process/InspectCamera.h   |    1 
 EdgeInspector_App/Data/PostProcess.cpp      |    2 
 6 files changed, 81 insertions(+), 2 deletions(-)

diff --git a/EdgeInspector_App/Data/DefectStorage.cpp b/EdgeInspector_App/Data/DefectStorage.cpp
index 20497cd..352809c 100644
--- a/EdgeInspector_App/Data/DefectStorage.cpp
+++ b/EdgeInspector_App/Data/DefectStorage.cpp
@@ -231,6 +231,49 @@
 	return m_nDefect;
 }
 
+int	CDefectControl::ExtractDefect_NotchBroken(DimensionDir emDim, int iCam, int iScan, CDefect_Info defect)
+{
+	if (m_pGrabber == NULL) {
+		return m_nDefect;
+	}
+
+	CSingleLock MyLock(&m_csDefect);
+	MyLock.Lock();
+
+	if (m_nDefect >= m_maxDefect) {
+		MyLock.Unlock();
+		return m_nDefect;
+	}
+
+	CDefect* pDefect = GetDefect(m_nDefect);
+	if (pDefect == NULL) {
+		MyLock.Unlock();
+		return m_nDefect;
+	}
+
+	pDefect->Reset();
+	pDefect->m_bJudge_NG = TRUE;
+	pDefect->m_DefectInfo = defect;
+
+	int nXStart = pDefect->m_DefectInfo.m_ptDefectPos_pxl.x - (DEFECTIMAGE_WIDTH / 2);
+	int nYStart = pDefect->m_DefectInfo.m_ptDefectPos_pxl.y - (DEFECTIMAGE_HEIGHT / 2);
+	int nXSize = DEFECTIMAGE_WIDTH;
+	int nYSize = DEFECTIMAGE_HEIGHT;
+	//int nXStart = pDefect->m_DefectInfo.m_rtDefectPos_pxl.left;
+	//int nYStart = pDefect->m_DefectInfo.m_rtDefectPos_pxl.top;
+	//int nXSize = pDefect->m_DefectInfo.m_rtDefectPos_pxl.Width();
+	//int nYSize = pDefect->m_DefectInfo.m_rtDefectPos_pxl.Height();
+	if (m_pGrabber->GetSmallImage(iScan, pDefect->m_Image, nXStart, nYStart, nXSize, nYSize, FALSE) == FALSE) {
+		MyLock.Unlock();
+		return m_nDefect;
+	}
+
+	m_nDefect++;
+
+	MyLock.Unlock();
+	return m_nDefect;
+}
+
 int CDefectControl::ExtractDefect_UserDefect(DimensionDir emDim, int iCam, int iScan, int nUserDefectAreaIdx, std::vector<CDefect_Info>* vecPreDefectList)
 {
 	if(m_pGrabber == NULL)
diff --git a/EdgeInspector_App/Data/DefectStorage.h b/EdgeInspector_App/Data/DefectStorage.h
index d2f88e8..110af29 100644
--- a/EdgeInspector_App/Data/DefectStorage.h
+++ b/EdgeInspector_App/Data/DefectStorage.h
@@ -45,6 +45,7 @@
 	int			ExtractDefect(DimensionDir emDim, int iCam, int iScan, CDefect_Info preDefectList);
 	int			ExtractDefect_Side(DimensionDir emDim, int iCam, int iScan, std::vector<CDefect_Info>* vecPreDefectList);
 	int			ExtractDefect_Notch(DimensionDir emDim, int iCam, int iScan, int nNotchDefectAreaIdx, std::vector<CDefect_Info>* vecPreDefectList);
+	int			ExtractDefect_NotchBroken(DimensionDir emDim, int iCam, int iScan, CDefect_Info defect);
 	int			ExtractDefect_UserDefect(DimensionDir emDim, int iCam, int iScan, int nUserDefectAreaIdx, std::vector<CDefect_Info>* vecPreDefectList);
 	int			ExtractDefect_Measure(DimensionDir emDim, int iCam, int iScan, CDefect_Info defect, double dMeasureResult_um, double dMeasureDiff_um);
 
diff --git a/EdgeInspector_App/Data/PostProcess.cpp b/EdgeInspector_App/Data/PostProcess.cpp
index 55aebb4..513be32 100644
--- a/EdgeInspector_App/Data/PostProcess.cpp
+++ b/EdgeInspector_App/Data/PostProcess.cpp
@@ -1211,7 +1211,7 @@
 		bJudgeUse		= (pSideParam->m_UserDefectPrm[pDefect->m_nUserDefectAreaIdx].m_nJudge_Size_Min_OR_AND == 0) ? FALSE : TRUE;
 		break;
 	case DefectLoc_Notch_Crack:
-		
+	case DefectLoc_Notch_Broken:
 	case DefectLoc_Notch_NoGrind:
 		nJudgeW_um = pSideParam->m_NotchPrm[pDefect->m_nNotchIdx].m_nNotch_Inspect_Defect_Judge_X_um;
 		nJudgeH_um = pSideParam->m_NotchPrm[pDefect->m_nNotchIdx].m_nNotch_Inspect_Defect_Judge_Y_um;
diff --git a/EdgeInspector_App/Defect.h b/EdgeInspector_App/Defect.h
index 7e556e3..f3ee211 100644
--- a/EdgeInspector_App/Defect.h
+++ b/EdgeInspector_App/Defect.h
@@ -22,6 +22,7 @@
 	DefectLoc_Measure_Chamfer,
 
 	DefectLoc_Notch_Crack,
+	DefectLoc_Notch_Broken,
 	DefectLoc_Notch_NoGrind,
 	DefectLoc_Notch_Dimension,
 	DefectLoc_Notch_Chamfer,
@@ -62,6 +63,7 @@
 	_T("Chamfer"),
 
 	_T("Notch"),
+	_T("Notch_Broken"),
 	_T("Notch_NoGrind"),
 	_T("Notch_Dimension"),
 	_T("Notch_Chamfer"),
diff --git a/EdgeInspector_App/Process/InspectCamera.cpp b/EdgeInspector_App/Process/InspectCamera.cpp
index afa2e45..0f820fd 100644
--- a/EdgeInspector_App/Process/InspectCamera.cpp
+++ b/EdgeInspector_App/Process/InspectCamera.cpp
@@ -4447,12 +4447,46 @@
 	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;
 		}
diff --git a/EdgeInspector_App/Process/InspectCamera.h b/EdgeInspector_App/Process/InspectCamera.h
index 1300e24..f8f7b78 100644
--- a/EdgeInspector_App/Process/InspectCamera.h
+++ b/EdgeInspector_App/Process/InspectCamera.h
@@ -112,7 +112,6 @@
 	// 9. Notch Inspect
 	BOOL				Notch_Process(int iThread,DimensionDir emDim, stFrameIndex stFrame);
 	void				Notch_Process_PreProcess(DimensionDir emDim, stFrameIndex stFrame, int nNotchIdx, IplImage* scr, IplImage* img_Edge, IplImage* img_Bin, CRect rtROI);
-	void				Notch_Process_PreProcess_2(DimensionDir emDim, stFrameIndex stFrame, int nNotchIdx, IplImage* scr, IplImage* img_Edge, IplImage* img_Bin, CRect rtROI);
 	void				Notch_Process_Measure(DimensionDir emDim, stFrameIndex stFrame, int nNotchIdx, IplImage* scr,IplImage* img_Edge,IplImage* img_Bin, CRect rtROI);
 	bool				Notch_Process_Calculate(DimensionDir emDim, stFrameIndex stFrame, int nNotchIdx, IplImage* scr,IplImage* img_Edge,IplImage* img_Bin, CRect rtROI);
 	void				Notch_Process_Judge(DimensionDir emDim, stFrameIndex stFrame, int nNotchIdx, IplImage* scr,IplImage* img_Edge,IplImage* img_Bin, CRect rtROI);

--
Gitblit v1.9.3