#pragma once #define PROJECTION_DIR "D:\\IJPReflowJudgement" enum CellSide {CS_TOP, CS_LEFT, CS_RIGHT, CS_BOTTOM=7}; class reflowParam { public: reflowParam() { pImageBuffer = NULL; nImageWidth = -1; nImageHeight = -1; nChannel = -1; nImageWidthStep = -1; ROI_Rect = NULL; nSide = -1; nBaseTh = -1; nDamTh2 = -1; nDistance = NULL; nBaseline = -1; nBaseDam2 = -1; nDam2Dist = -1; nDam12Dist = -1; nDam1Dist = -1; pMasterBuffer = NULL; nMasterWidth = -1; nMasterHeight = -1; nMasterChannel = -1; nMasterWidthStep = -1; } BYTE *pImageBuffer; int nImageWidth; int nImageHeight; int nChannel; int nImageWidthStep; CRect *ROI_Rect; int nSide; int nBaseTh; int nDamTh2; int nDamTh1; int *nDistance; int nBaseline; int nBaseDam2; int nDam2Dist; int nDam12Dist; int nDam1Dist; BYTE *pMasterBuffer; int nMasterWidth; int nMasterHeight; int nMasterChannel; int nMasterWidthStep; }; //pImageBuffer : Input Image. 입력받은 Image Buffer및 Channel을 활용하여 GrayScale로 변환 후 사용 //imageWidth, imageHeight : Image 크기. //imageWidthStep : margin을 포함한 Image의 한 Line을 구성하는 Byte 수 //ROI_Rect : 검사 영역 설정 //nChannel : Input Image의 Color Channel 수. 1~4 //nSide : CS_TOP(vertical 0->dam2->dam1->pattern), CS_LEFT(horizontal 0->dam2->dam1->pattern), CS_RIGHT(horizontal 0->pattern->dam1->dam2) //nBaseTh : threshold baseline //nDamTh2 : threshold dam2 //nDamTh1 : threshold dam1 //nBaseline : Base Line distance //nBaseDam2 : Base Line - dam2 distance //nDam2Dist : dam2 distance //nDam12Dist : dam2-dam1 distance //nDam1Dist : dam1 distance #define LOCAL_PEAK_PERIOD 30 BYTE LocalMinima(int *pProjection, int x, int width); BYTE LocalMaxima(int *pProjection, int x, int width); int LocalMinimaAddr(int *pProjection, int x, int width); BOOL Match_Vertical(BYTE *pImage, int nImageWidth, int nImageHeight, BYTE *pMaster, int nMasterWidth, int nMasterHeight, CRect *rtMatch); BOOL Match_Horizontal(BYTE *pImage, int nImageWidth, int nImageHeight, BYTE *pMaster, int nMasterWidth, int nMasterHeight, CRect *rtMatch); int AFX_EXT_API Linecheck_Method(int* boe_line, reflowParam *rParam, BOOL bSetMaster); int AFX_EXT_API BOE_Linecheck(int* boe_line, reflowParam *rParam, BOOL bSetMaster = FALSE); ////image와 parameter(roi, side, threshold, distance)를 입력받아 boe_line[6] 배열 및 return(line 개수) 출력 ////OUTPUT //return 값 : 검출한 Line의 개수. 3 미만 : DAM2 Reflow 판정, 4~5 : DAM1 Reflow 판정, 6 : no Reflow 판정 / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -4 : master image matching fail, -5 : select wrong side //boe_line : Line 좌표 출력 배열. DAM#2 바깥 2 Lines, DAM#2, DAM#1 순으로 좌표가 저장됨(즉, Pattern을 기준으로 바깥쪽부터 저장) ////INPUT //reflowParam : 검사 Parameter CString AFX_EXT_API Reflow_Judge(int LineCheck); ////BOE_LineCheck Method의 Return 값을 토대로 판정을 String으로 출력 //LineCheck : 검출한 Line의 개수, BOE_Linecheck 메소드의 Return 값 //return 값 : 3 미만 : "DAM2 Reflow", "DAM1 Reflow", 6 : "no Reflow" / -1 : "image not loaded", -2 : "roi setting error", -3 : "roi length error", -5 : "select wrong side" int BOE_Linecheck_Side0(int* boe_line, BYTE* pImage, int imageWidth, int imageHeight, CRect* ROI_Rect, int th, int th2, int th3, int dist0, int dist1, int dist2, int dist3, int dist4); int BOE_Linecheck_Side1(int* boe_line, BYTE* pImage, int imageWidth, int imageHeight, CRect* ROI_Rect, int th, int th2, int th3, int dist0, int dist1, int dist2, int dist3, int dist4); int BOE_Linecheck_Side2(int* boe_line, BYTE* pImage, int imageWidth, int imageHeight, CRect* ROI_Rect, int th, int th2, int th3, int dist0, int dist1, int dist2, int dist3, int dist4); int Linecheck_Method_Side0(int* boe_line, BYTE* pImage, int imageWidth, int imageHeight, CRect* ROI_Rect, int th, int *nDistance); //distDam2Out, distDam2In, distDam1Out, distDam1In int Linecheck_Method_Side1(int* boe_line, BYTE* pImage, int imageWidth, int imageHeight, CRect* ROI_Rect, int th, int *nDistance); int Linecheck_Method_Side2(int* boe_line, BYTE* pImage, int imageWidth, int imageHeight, CRect* ROI_Rect, int th, int *nDistance);