From 9aa3a8ff940e89bb0b5c75bc8abd0864e4c85874 Mon Sep 17 00:00:00 2001 From: LYW <leeyeanwoo@diteam.co.kr> Date: 화, 17 8월 2021 10:00:15 +0900 Subject: [PATCH] 이전 머지간 누락된 코드 삽입 --- ReviewHistory/ReveiwHistory/akDefectFormation.h | 431 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 431 insertions(+), 0 deletions(-) diff --git a/ReviewHistory/ReveiwHistory/akDefectFormation.h b/ReviewHistory/ReveiwHistory/akDefectFormation.h new file mode 100644 index 0000000..56533b9 --- /dev/null +++ b/ReviewHistory/ReveiwHistory/akDefectFormation.h @@ -0,0 +1,431 @@ +#pragma once + +#include <vector> +#include "Singleton.h" + +struct _DefectDisplayOption //그냥 여기에 만들자..;; 해더 하나더 파기 귀찬.. +{ + _DefectDisplayOption() + { + m_bShowDefectNormal = TRUE; + m_bShowDefectGroupRound = TRUE; + m_bShowDefectGroupLine = TRUE; + m_bShowNoFilteredDefect = FALSE; + + m_nShowLabel = -1; + m_nShowSize = 0; + } + BOOL m_bShowDefectNormal; + BOOL m_bShowDefectGroupRound; + BOOL m_bShowDefectGroupLine; + BOOL m_bShowNoFilteredDefect; + + int m_nShowLabel; // 0보다 작으면 모두 보기 + int m_nShowSize; //해당값보다 작거나 같으면 제거 +}; + +struct _akDefect +{ + int nDefectID; + double dPositionX; + double dPositionY; + + int nLabel; + + int nSize; // + int nType;//0:black defect, 1:white defect + + int nGraySrc; + int nGrayTar; + int nGrayDiff; + + int nFilter;//1이면 제외 + //("SIZE_S"); + //("SIZE_W"); + //("SIZE_L"); + //("SIZE_H"); + //("DEFECT_CODE"); + //("DEF_AVG_1"); + //("REF_AVG_1"); + //("REF_GRAY_1"); + //("MASK_DEFECT"); + //("COMMON_DEFECT"); + //("XY_RATIO"); + //("CAM_NUM"); + //("LAMP_VALUE"); + CString m_strInfos[16]; + + short m_nDefectID; + short m_nCameraID; + short m_nScanIdx; + //short m_nDefectIdx; // 카메라에서의 결함 인덱스 + int m_nDefectIdx; // 카메라에서의 결함 인덱스 201207 CJH - 자릿 수 넘침. int형으로 변경 + + int m_nPixelConv; // pixel 단위 좌표 + int m_nPixelScan; // pixel 단위 좌표 + + short m_nPixelSize; // 결함크기 ---------------------------------PS + short/*SERVER_DefectType*/ m_DefectType; // 결함 타입 ---------------------------------DT + short/*SERVER_DefectSubType*/ m_DefectSubType; // 결함의 판정상태. + short/*SERVER_DefectBDType*/ m_DefectBDType; // 결함 타입 - Bright, Dark, Both + + short m_sPixelWidth; // 픽셀단위 결함 너비 + short m_sPixelHeight; // 픽셀단위 결함 높이 + short m_nLevelSrcMin; // 결함 밝기 Min -----------------------------SN + short m_nLevelSrcMax; // 결함 밝기 Max -----------------------------SX + short m_nLevelSrcAvg; // 결함 밝기 Avg -----------------------------SA + short m_nLevelRefMin; // 비교대상 밝기 Min -------------------------RN + short m_nLevelRefMax; // 비교대상 밝기 Max -------------------------RX + short m_nLevelRefAvg; // 비교대상 밝기 Avg -------------------------RA + short m_nLevelDiffMin; // 비교차 Min ---------------------------------DN + short m_nLevelDiffMax; // 비교차 Max ---------------------------------DX + short m_nLevelDiffAvg; // 비교차 Avg ---------------------------------DA + + int m_nDefectRScale; // 픽셀단위 결함 높이 -------------------------RS + short m_sThreshold; // 결함을 검출할 때의 Threshold + short m_sThresholdAvg; // 결함을 검출할 때의 Threshold AVG + short m_sDefectPeak; // 결함의 Peak. + short m_sDefectLevel; // (DiffAvg - Th) BOE 8G 요청사항 + + int m_nPixelGlassStart; // Glass 시작 픽셀 + short m_sDefectLoc; + + short m_sZonePixelCount[16]; // Zone별 결함 Pixel 수 + short m_sZoneValueMin[16]; // Zone별 결함 Min + short m_sZoneValueMax[16]; // Zone별 결함 Max + short m_sZoneValueAvg[16]; // Zone별 결함 Avg + short m_sZonePixelPercent[16]; // --------------------------------------Z0~ZF + + //210127 CJH - Zone별 Source Gray 입력 + short m_sZoneValueSrcMin[16]; // Zone별 Source Min + short m_sZoneValueSrcMax[16]; // Zone별 Source Max + short m_sZoneValueSrcAvg[16]; // Zone별 Source Avg + + int m_nUMOriginX; // um단위 x좌표 (원점기준) + int m_nUMOriginY; // um단위 y조표 (원점기준) + int m_nUMCenterAlignX; // um단위 X좌표 (Glass Center 기준, 얼라인보정 후) + int m_nUMCenterAlignY; // um단위 Y좌표 (Glass Center 기준, 얼라인보정 후) + int m_nUMCenterX; // um단위 X좌표 (Glass Center 기준, 얼라인보정 전) + int m_nUMCenterY; // um단위 Y좌표 (Glass Center 기준, 얼라인보정 전) + int m_nUMSizeX; // um단위 X 크기 -----------------------------UX + int m_nUMSizeY; // um단위 Y 크기 -----------------------------UY + int m_nUMSize; // um단위 크기. + CRect m_RectUM; // 디펙 센터 기준 사각형. + + short/*SERVER_DefectSizeType*/ m_DefectSizeType; // 결함 크기 종류enum SERVER_DefectSizeType { SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra }; + short/*SERVER_DefectPeakType*/ m_DefectPeakType; // Peak의 종류. + short/*Judgement*/ m_DefectJudgement; // 결함 판정. + BOOL m_bDefectCutoff; // 컷 오프 디펙(TRUE= Cutoff, FALSE) + short/*MAP16_DefectClass*/ m_DefectClass; // BOE Defect Class 16등분 구분 + int m_nPadRegionIdx; // PAD 영역 인덱스 + + int m_nUMCellX; // 셀 원점 기준 x 좌표 + int m_nUMCellY; // 셀 원점 기준 y 좌표 + short m_nModelIdx; // 몇 번째 모델인가? + short m_nCellIdx; // 몇번째 셀인가? + short m_nCellGate; // 셀별 Gate라인(얼라인 보정 전) + short m_nCellData; // 셀별 Data라인(얼라인 보정 전) + short m_nCellGateAlign; // 셀별 Gate라인(얼라인 보정 후) + short m_nCellDataAlign; // 셀별 Data라인(얼라인 보정 후) + + int m_nUMShotX; // 샷 기준 X좌표 + int m_nUMShotY; // 샷 기준 Y좌표 + short m_nMaskDefectIdx; // 한 Glass에서 발견된 마스크결함 묶음의 인덱스. + short m_nShotIdx; // 노광샷 번호 + short m_nMatchShotCount; // 동일한 마스크 결함의 수. + short m_nMatchMaxSize; // 동일한 마스크 중 가장 큰 결함의 크기. + + short m_nRepeatCount; // 연속결함발견위한 동일좌표 반복수 + short m_nMaskRepeatCount; + int m_StackInfo; // Stack Flag + BOOL m_bRealStack; // Stack 머지에 의한 TD(TRUE) 인지, 필터링에 의한 TD(FALSE)구분할 수 있다. + short m_nStackStepCount; // Stack 수 + short m_nStackColorIdx; // Color를 선택하는 인덱스. + //CString m_strStackStep[CFDEFECT_STACKCOUNT]; // Stack Step. + char m_strStackFirst[60]; // Stack Step. //201221 CJH - 최대 사이즈 60bytes + char m_strUnitID[16]; // 유닛아이디 + + int m_ClassificationType; // enum ClassificationType { ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI나 TFE등 추가 분류 알고리즘 적용 결과. + int m_nAtomWidth; // TFE 핵 너비 + int m_nAtomHeight; // TFE 핵 높이 + short/*ReKind*/ m_DefectKind; // 결함 종류 + + char m_strDefectCode[32]; // Defect Code + BOOL m_bMergeState; // Merge Status + char m_strAoiImageName[256]; // Defect Image Name(CCD Image) + CString m_strReviewImageName; + int m_nDefectMerge; // 현재 디펙의 머지 여부 + + int m_nPixelSizeOrigin; + int m_nScratchRatio; + int m_nDensity; // 원형 결함 구분을 위한 밀도 [2017.8.2 bhs] + + char m_strDefectName[16]; + char m_strDefectType[16]; + + double m_dScanResolution; + double m_dConvResolution; + + int m_nAngle; // 각도 + int m_nMajor; // 장축 길이(Long) + int m_nMinor; // 단축 길이(Short) + int m_nCompact; // Blob 장축을 지름으로 하는 원의 넓이와 Blob 넓이의 비율 + int m_nThickness; // Blob 넓이와 장축의 비율 (Area / Major) + + short m_nHliLevelIdx; // 몇 번째 레벨(채널)인가? + int m_nHliLayers; // 해당결함에 포함된 레이어 bit처리 + + BOOL m_bShrinked; //210323 CJH - Frame Shrink 정보 추가 +}; + +struct _akModule +{ + int m_nModuleIndex; + int m_nUMShotX; // 샷 기준 X좌표 + int m_nUMShotY; // 샷 기준 Y좌표 + int m_nShotIndex; +}; + +struct _akShort +{ + int m_nUMShotX; // 샷 기준 X좌표 + int m_nUMShotY; // 샷 기준 Y좌표 + int m_nShotIndex; +}; + +struct _akReviewList +{ + short m_nDefectID; + int m_nDefectIdx; // 카메라에서의 결함 인덱스 201207 CJH - 자릿 수 넘침. int형으로 변경 + int m_nReviewIdx; + char m_strAoiImageName[256]; // Defect Image Name(CCD Image) + CString m_strReviewImageName; + CString m_strGlassID; + char m_strAoiImagePath[256]; + char m_strReviewImagePath[256]; + char m_strAlignFirst[64]; + char m_strAlignSecond[64]; + + CString m_strInfos[16]; +}; + +struct _akGlassInfo +{ + int m_nGlassSelect; + CString m_strPPID; + CString m_strGlassID; + int m_nDefectNum; + int m_nReviewNum; + CString m_strGlassJudge; + CString m_strLotID; + CString m_strSLotID; + int m_nSlot_No; + int m_nCellNum; + int m_nGlassSizeHeight; + int m_nGlassSizeWidth; + + CString m_strInfos[16]; +}; + +struct _akReviewHeader +{ + short m_nDefectID; + int m_nDefectIdx; + CString m_strGlassID; + CString m_strPPID; + int m_nReviewIdx; + CString m_strJudge; + CString m_strFileTime; + CString m_strFileName; + CString m_strLoading; + CString m_strFilePath; + + CString m_strInfos[16]; +}; + +struct _akFormation +{ + _akFormation() + { + m_nFormLabel = -1; + m_nFormType = 0; + m_dRectLeft = 0; + m_dRectTop = 0; + m_dRectRight = 0; + m_dRectBottom = 0; + } + void MergeDefect(_akDefect* pDefect) + { + if (!m_vecForms.empty()) + { + if(m_dRectLeft > pDefect->dPositionX) m_dRectLeft = pDefect->dPositionX; + if(m_dRectRight < pDefect->dPositionX) m_dRectRight = pDefect->dPositionX; + + if (m_dRectTop > pDefect->dPositionY) m_dRectTop = pDefect->dPositionY; + if (m_dRectBottom < pDefect->dPositionY) m_dRectBottom = pDefect->dPositionY; + } + else + { + m_dRectRight = m_dRectLeft = pDefect->dPositionX; + m_dRectTop = m_dRectBottom = pDefect->dPositionY; + } + m_vecForms.push_back(pDefect); + } + void AnalysisDefectInfo() + { + m_nDefectNumS=0; + m_nDefectNumM=0; + m_nDefectNumL=0; + m_nDefectNum1Px=0; + m_nDefectNumWhite=0; + m_nDefectNumBlack=0; + m_nDefectNum1PxWhite = 0; + m_dSizeAvg = 0; + m_dSizeStdDev = 0; + m_dDiffStdDev = 0; + m_dDiffStdDevAbs = 0; + + double dDiffAvg=0; + double dDiffAvgAbs=0; + + _akDefect* pDefect; + for (int i = 0; i < m_vecForms.size(); i++) + { + pDefect = m_vecForms[i]; + + if (pDefect->nSize >= 5) m_nDefectNumL++; + else if (pDefect->nSize >= 2) m_nDefectNumM++; + else if (pDefect->nSize >= 0) m_nDefectNumS++; + + if (pDefect->nSize == 1) m_nDefectNum1Px++; + + if (pDefect->nType == 1) m_nDefectNumWhite++; + else m_nDefectNumBlack++; + + if (pDefect->nType == 1 && pDefect->nSize == 1) m_nDefectNum1PxWhite++; + + m_dSizeAvg += (double)pDefect->nSize; + dDiffAvg += (double)pDefect->nGrayDiff; + dDiffAvgAbs += abs((double)pDefect->nGrayDiff); + } + m_dSizeAvg /= m_vecForms.size(); + dDiffAvg /= m_vecForms.size(); + dDiffAvgAbs /= m_vecForms.size(); + + for (int i = 0; i < m_vecForms.size(); i++) + { + pDefect = m_vecForms[i]; + double dDiff = m_dSizeAvg - m_vecForms[i]->nSize; + m_dSizeStdDev += dDiff * dDiff; + + dDiff = dDiffAvg - m_vecForms[i]->nGrayDiff; + m_dDiffStdDev += dDiff * dDiff; + + dDiff = dDiffAvgAbs - abs((double)pDefect->nGrayDiff); + m_dDiffStdDevAbs += dDiff * dDiff; + } + m_dSizeStdDev = sqrt(m_dSizeStdDev / (double)m_vecForms.size()); + m_dDiffStdDev = sqrt(m_dDiffStdDev / (double)m_vecForms.size()); + m_dDiffStdDevAbs = sqrt(m_dDiffStdDevAbs / (double)m_vecForms.size()); + + int nFilter = FALSE; + { + double d1PxRate = 100.0*((double)m_nDefectNum1Px / (double)m_vecForms.size()); + double d1PxWhiteRate = 100.0*((double)m_nDefectNum1PxWhite/(double)m_vecForms.size()); + + + if (m_nFormType == 0 && d1PxWhiteRate > 50) + { + nFilter = TRUE; + } + if (m_nFormType == 1 && d1PxWhiteRate > 30) + { + nFilter = TRUE; + } + if (m_dSizeStdDev == 0) + { + nFilter = TRUE; + } + if(d1PxRate>50) + { + nFilter = TRUE; + } + + } + + if (nFilter) + { + for (int i = 0; i < m_vecForms.size(); i++) + { + pDefect = m_vecForms[i]; + pDefect->nFilter = 1; + } + } + + m_nFormJudge = nFilter; + } + + std::vector<_akDefect*> m_vecForms; + + int m_nFormJudge; //0:Normal, 1:Nodefect + int m_nFormLabel; + int m_nFormType; //-1:none, 0:round, 1:line + double m_dRectLeft; + double m_dRectTop; + double m_dRectRight; + double m_dRectBottom; + + //분석 데이터들 [김태현2021/2/22] + double m_dSizeAvg; + double m_dSizeStdDev; + int m_nDefectNumS; + int m_nDefectNumM; + int m_nDefectNumL; + int m_nDefectNum1Px; + int m_nDefectNumWhite; + int m_nDefectNumBlack; + int m_nDefectNum1PxWhite; + + double m_dDiffStdDev; //그레이 차이 표준편차 + double m_dDiffStdDevAbs; //그레이 차이 절대값 표준편차 +}; + + +class akDefectFormation : public CSingleton< akDefectFormation > +{ +public: + akDefectFormation(); + virtual ~akDefectFormation(); + +public: + void Clear(); + void AddDefect(double dPosX, double dPosY); + void AddDefectTemp(double dPosX, double dPosY); + void AddDefect2(); + void AddDefectImageTemp(); + void AddDefectImage(); + void AddGlassInfo(); + void AddDefectHeaderTemp(); + +public: + std::vector<_akDefect> m_vecDefects; + std::vector<_akDefect> m_vecTempDefects; + std::vector<_akFormation> m_vecFormation; + std::vector<_akReviewList> m_vecImage; + std::vector<_akReviewList> m_vecTempImage; + std::vector<_akReviewHeader> m_vecHeader; + std::vector<_akReviewHeader> m_vecHeaderTemp; + std::vector<_akGlassInfo> m_vecGlassInfo; + + std::vector<_akDefect> m_vecPath1; + std::vector<_akDefect> m_vecPath2; + std::vector<_akDefect> m_vecPath3; + std::vector<_akDefect> m_vecPath4; + std::vector<_akDefect> m_vecPath5; + std::vector<_akDefect> m_vecPath6; + +public: + std::vector< std::vector<_akDefect > > m_vecMoudle; +}; + + -- Gitblit v1.9.3