#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;
|
}
|