#include "StdAfx.h" #include "CHReviewDefectFinder/ReviewDefectFinder.h" #include "MosisBuffer/MosisBuffer.h" #include "MosisAssem/MosisAssem.h" #include "CHReviewDefectFinder/PitchStat.h" #include "CHReviewDefectFinder/DefectStorage.h" #include "CHReviewDefectFinder/TempRecipe.h" CReviewDefectFinder::CReviewDefectFinder(void) { m_pPitchStat = new CPitchStat(); m_pDefectStorage = new CDefectStorage(); m_pImageBuffer = new CMosisBuffer(); m_pConvParam = new CInspectParam(); //m_pAssemControl = new CAssemControl(); InitReviewDefectFinder(); } CReviewDefectFinder::~CReviewDefectFinder(void) { if (m_pPitchStat) delete m_pPitchStat; if (m_pDefectStorage) delete m_pDefectStorage; //if (m_pAssemControl) delete m_pAssemControl; if (m_pImageBuffer) delete m_pImageBuffer; if (m_pConvParam) delete m_pConvParam; } void CReviewDefectFinder::InitReviewDefectFinder() { if (m_pDefectStorage==NULL || m_pAssemControl==NULL) return; int nMaxDefect = 10000; //m_pAssemControl->InitAssemControl(1, nMaxDefect); m_pDefectStorage->InitDefectStorage(nMaxDefect); } BOOL CReviewDefectFinder::FindDefect(BYTE* pImageData, int nWidth, int nHeight, const SReviewDefectFindParam& findParam, SReviewDefectFindResult& findResult) { findResult.nResultCode = 0; if(pImageData == NULL) return FALSE; // 0. Set pitch range stPitchParam PitchParam; //PitchParam.Interval = 64; PitchParam.Direction = findParam.nDirection; if (findParam.nDirection) PitchParam.SetPitchRange(findParam.dPitchY - findParam.nAutoPitchRange, findParam.dPitchY + findParam.nAutoPitchRange); else PitchParam.SetPitchRange(findParam.dPitchX - findParam.nAutoPitchRange, findParam.dPitchX + findParam.nAutoPitchRange); m_pConvParam->Reset(); m_pConvParam->s_RectConv = CRect(8, 8, nWidth-8, nHeight-8); m_pImageBuffer->SetBuffer(pImageData, nWidth, nHeight); // 1. ±âº» ÇÇġã±â findResult.dDefectPitch = m_pPitchStat->CheckOnePitch(*m_pImageBuffer, m_pConvParam->s_RectConv, PitchParam); PitchParam.SetPitchRange(findResult.dDefectPitch - 0.2, findResult.dDefectPitch + 0.2); // 2. »ó¼¼ ÇÇġã±â if(m_pPitchStat->CheckDynamicPitchWithTilt(*m_pImageBuffer, m_pConvParam->s_RectConv, PitchParam)==FALSE) { return FALSE; } // 3. °Ë»ç ÆÄ¶ó¹ÌÅÍ ¼³Á¤ CScanGlass scanGlass; m_pConvParam->s_dPitchScanReal = findResult.dDefectPitch; m_pConvParam->s_nPitchCycleScan = 1; m_pConvParam->m_ConvMode = ConvMode_Float; m_pConvParam->m_ConvDir = ConvDir_Vert; m_pConvParam->s_nConvWidth = 2; m_pConvParam->s_nConvHeight = 2; m_pConvParam->m_pPitch16 = m_pPitchStat->GetDataAddr(); m_pConvParam->s_lpBuffer = m_pImageBuffer->GetDataAddress(); m_pConvParam->s_nFrameWidth = m_pImageBuffer->GetDataWidth(); m_pConvParam->s_nFrameHeight = m_pImageBuffer->GetHeight(); m_pConvParam->s_RectFilter.SetRect(0, 0, m_pImageBuffer->GetWidth(), m_pImageBuffer->GetHeight()); m_pConvParam->s_nSideThreshold = findParam.nThreshold; m_pConvParam->s_nThreshold = findParam.nThreshold; m_pConvParam->s_nDThSlide = findParam.nThreshold2; m_pConvParam->s_dConvResolution = findParam.dResolutionX; m_pConvParam->s_dScanResolution = findParam.dResolutionY; m_pConvParam->m_nDefectMergePixel = findParam.nMergePixel; int multi= m_pConvParam->s_nConvWidth * m_pConvParam->s_nConvHeight; if(multi > 9) multi = 9; if(m_pConvParam->m_ConvMode == ConvMode_Float) m_pConvParam->s_nThreshold = m_pConvParam->s_nThreshold * multi; m_pConvParam->s_uiProcessing = DIT_CONV_ALL_MERGEDIVISION; m_pConvParam->m_pScanCell = scanGlass.GetScanModel(0)->GetScanRegion(0)->GetCellInfo(0); m_pConvParam->m_bUseMatchFilter = FALSE; m_pConvParam->m_MatchFilter2by2 = FALSE; m_pConvParam->m_EchoThreshold = 8; m_pConvParam->m_bPairFilter = FALSE; //m_ConvParam->m_bOnlyJumpFilter = TRUE; m_pConvParam->m_bUseUnpair = TRUE; BOOL bDeleteBlack = FALSE; BOOL bDeleteWhite = FALSE; BOOL bDeleteGeneral = FALSE; int nModel = 0; int nFilterSize = 0; // 4. °Ë»ç CMosisAssem* m_pMosisAssem = m_pAssemControl->GetMosisAssem(0); m_pMosisAssem->ResetReinspectCount(); m_pMosisAssem->ResetMosisAssem(); m_pMosisAssem->Inspect_Rect(m_pConvParam); // 5. °áÇÔ °¡Á®¿À±â m_pDefectStorage->ResetDefectStorage(); m_pDefectStorage->ExtractDefect(NULL, m_pMosisAssem, m_pConvParam, nModel, findParam.nThreshold, bDeleteBlack, bDeleteWhite, nFilterSize, bDeleteGeneral); // 6. Å« °áÇÔ À妽º ã±â CDefect* pDefect = NULL; int nMaxSize = INT_MIN; int nMaxSizeIdx = -1; int nDefectCount = m_pDefectStorage->GetDefectCount(); for(int i = 0; i < nDefectCount; i++) { pDefect = m_pDefectStorage->GetDefect(i); if (pDefect==NULL) continue; if(pDefect->m_Defect.s_nDefectArea > nMaxSize) { nMaxSize = pDefect->m_Defect.s_nDefectArea; nMaxSizeIdx = i; } } if(nMaxSizeIdx == -1) { return FALSE; } // 7. °á°ú °áÇÔ Á¤º¸ ÀúÀå pDefect = m_pDefectStorage->GetDefect(nMaxSizeIdx); findResult.nDefectPosX = pDefect->m_Defect.s_nDefectX; findResult.nDefectPosY = pDefect->m_Defect.s_nDefectY; findResult.nDefectArea = pDefect->m_Defect.s_nDefectArea; findResult.nDefectRScale = pDefect->m_Defect.s_nDefectRScale; findResult.sDefectPeak = pDefect->m_Defect.s_sDefectPeak; findResult.rtDefectRect = pDefect->m_Defect.s_DefectRect; findResult.nResultCode = 1; return TRUE; } BOOL CReviewDefectFinder::FindDefect(BYTE* pImageData, int nWidth, int nHeight, double& dPitch, int nAutoPitchRange, int nThreshold, POINT& ptDefectPos, CRect& rtDefectPos) { if(pImageData == NULL) return FALSE; BOOL bDeleteBlack, bDeleteWhite, bDeleteGeneral; int i, nModel, nFilterSize, nDefectCount, nMaxSize, nMaxSizeIdx; stPitchParam PitchParam; CDefect* pDefect = NULL; PitchParam.Direction=stPitchParam::PP_VERTICAL; //PitchParam.Direction=stPitchParam::PP_HORIZONTAL; //PitchParam.Interval = 64; PitchParam.SetPitchRange(dPitch - nAutoPitchRange, dPitch + nAutoPitchRange); m_pConvParam->Reset(); m_pConvParam->s_RectConv = CRect(10, 10, nWidth-10, nHeight-10); m_pImageBuffer->SetBuffer(pImageData, nWidth, nHeight); dPitch = m_pPitchStat->CheckOnePitch(*m_pImageBuffer, m_pConvParam->s_RectConv, PitchParam); PitchParam.SetPitchRange(dPitch - 0.2, dPitch + 0.2); if(m_pPitchStat->CheckDynamicPitchWithTilt(*m_pImageBuffer, m_pConvParam->s_RectConv, PitchParam)) { CScanGlass scanGlass; m_pConvParam->s_dPitchScanReal = dPitch; m_pConvParam->s_nPitchCycleScan = 1; m_pConvParam->m_ConvMode = ConvMode_Float; m_pConvParam->m_ConvDir = ConvDir_Vert; m_pConvParam->s_nConvWidth = 2; m_pConvParam->s_nConvHeight = 2; m_pConvParam->m_pPitch16 = m_pPitchStat->GetDataAddr(); m_pConvParam->s_lpBuffer = m_pImageBuffer->GetDataAddress(); m_pConvParam->s_nFrameWidth = m_pImageBuffer->GetDataWidth(); m_pConvParam->s_nFrameHeight = m_pImageBuffer->GetHeight(); m_pConvParam->s_nSideThreshold = nThreshold; m_pConvParam->s_nThreshold = nThreshold; m_pConvParam->s_nDThSlide = 0; m_pConvParam->s_RectFilter.SetRect(0, 0, m_pImageBuffer->GetWidth(), m_pImageBuffer->GetHeight()); int multi= m_pConvParam->s_nConvWidth * m_pConvParam->s_nConvHeight; if(multi > 9) multi = 9; if(m_pConvParam->m_ConvMode == ConvMode_Float) m_pConvParam->s_nThreshold = m_pConvParam->s_nThreshold * multi; m_pConvParam->s_uiProcessing = DIT_CONV_ALL_MERGEDIVISION; m_pConvParam->m_pScanCell = scanGlass.GetScanModel(0)->GetScanRegion(0)->GetCellInfo(0); m_pConvParam->m_bUseMatchFilter = FALSE; m_pConvParam->m_MatchFilter2by2 = FALSE; m_pConvParam->m_EchoThreshold = 8; m_pConvParam->m_bPairFilter = FALSE; //m_ConvParam->m_bOnlyJumpFilter = TRUE; m_pConvParam->m_bUseUnpair = TRUE; CMosisAssem* m_pMosisAssem = m_pAssemControl->GetMosisAssem(0); m_pMosisAssem->ResetReinspectCount(); m_pMosisAssem->ResetMosisAssem(); m_pMosisAssem->Inspect_Rect(m_pConvParam); m_pDefectStorage->ResetDefectStorage(); bDeleteBlack = FALSE; bDeleteWhite = FALSE; bDeleteGeneral = FALSE; nModel = 0; nFilterSize = 0; m_pDefectStorage->ExtractDefect(NULL, m_pMosisAssem, m_pConvParam, nModel, nThreshold, bDeleteBlack, bDeleteWhite, nFilterSize, bDeleteGeneral); nMaxSize = INT_MIN; nMaxSizeIdx = -1; nDefectCount = m_pDefectStorage->GetDefectCount(); for(i = 0; i < nDefectCount; i++) { pDefect = m_pDefectStorage->GetDefect(i); if(pDefect) { if(pDefect->m_Defect.s_nDefectArea > nMaxSize) { nMaxSize = pDefect->m_Defect.s_nDefectArea; nMaxSizeIdx = i; } } } if(nMaxSizeIdx != -1) { pDefect = m_pDefectStorage->GetDefect(nMaxSizeIdx); ptDefectPos.x = pDefect->m_Defect.s_nDefectX; ptDefectPos.y = pDefect->m_Defect.s_nDefectY; rtDefectPos = pDefect->m_Defect.s_DefectRect; } else { return FALSE; } } else { return FALSE; } return TRUE; }