SDC C-Project CF Review 프로그램
LYW
2022-06-30 c220de6f70051797e9d8b371830d06def9dc9cbd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
#pragma once
#define PROJECTION_DIR "D:\\IJPReflowJudgement"
 
enum CellSide {CS_TOP, CS_LEFT, CS_RIGHT/*, CS_BOTTOM*/};
 
 
 
//20190926 chm CSOT DAM 판정시 모노모가 넘치는 부분도 
//완전히 검은색 라인이 사라지는것이아니라 조정해줘야되서 추가
extern int m_nLineCheckerLocalPeakPeriod;
 
class reflowParam
{
public:
    reflowParam()
    {
        pImageBuffer = NULL;
        nImageWidth = -1;
        nImageHeight = -1;
        nChannel = -1;
        nImageWidthStep = -1;
        ROI_Rect = NULL;
        nSide = -1;
        nBaseTh = -1;
        nDamTh2 = -1;
        nDamTh1 = -1;
        nDamTh2_in = -1;
        nDamTh1_in = -1;
        nDistance = NULL;
        nBaseline = -1;
        nBaseDam2 = -1;
        nDam2Dist = -1;
        nDam12Dist = -1;
        nDam1Dist = -1;
 
        pMasterBuffer = NULL;
        nMasterWidth = -1;
        nMasterHeight = -1;
        nMasterChannel = -1;
        nMasterWidthStep = -1;
        nPeakPeriod = 10;
    }
 
    BYTE *pImageBuffer;
    int nImageWidth;
    int nImageHeight;
    int nChannel;
    int nImageWidthStep;
    CRect *ROI_Rect;
    int nSide;
    int nBaseTh;
    int nDamTh2;
    int nDamTh1;
    int    nDamTh2_in;
    int    nDamTh1_in;
    int *nDistance;
    int nBaseline;
    int nBaseDam2;
    int nDam2Dist;
    int nDam12Dist;
    int nDam1Dist;
 
    BYTE *pMasterBuffer;
    int nMasterWidth;
    int nMasterHeight;
    int nMasterChannel;
    int nMasterWidthStep;
 
    int nPeakPeriod;
};
 
//20190926chm Reflow Result 데이터 없길래 만듬
class reflowResult
{
public:
    reflowResult()
    {
        nDAM1 =FALSE;
        nDam1_in =FALSE;
        nDam2_in =FALSE;
        nDam2 =FALSE;
 
        nDam2_GrayMin = -1;
        nDam2_GrayMax =-1;
        nDam2_GrayDif=-1;
        nDam2_GrayTH=-1;
 
        nDam2_in_GrayMin = -1;
        nDam2_in_GrayMax = -1;
        nDam2_in_GrayDif=-1;
        nDam2_in_GrayTH=-1;
 
        nDam1_in_GrayMin = -1;
        nDam1_in_GrayMax = -1;
        nDam1_in_GrayDif=-1;
        nDam1_in_GrayTH=-1;
 
        nDAM1_GrayMin = -1;
        nDAM1_GrayMax = -1;
        nDam1_GrayDif=-1;
        nDam1_GrayTH=-1;
 
        nErrorcode = -1;
 
    }
    // 0 FAIL 1 SUCCESS
    int nDAM1; 
    int nDam1_in;
    int nDam2_in;
    int nDam2;
 
    int nDam2_GrayMin;
    int nDam2_GrayMax;
    int nDam2_GrayDif;//MIN MAX 차이 
    int nDam2_GrayTH;//보정후 TH 
 
    int nDam2_in_GrayMin;
    int nDam2_in_GrayMax;
    int nDam2_in_GrayDif;//MIN MAX 차이 
    int nDam2_in_GrayTH;//보정후 TH 
 
    int nDAM1_GrayMin;
    int nDAM1_GrayMax;
    int nDam1_GrayDif;//MIN MAX 차이 
    int nDam1_GrayTH;//보정후 TH 
 
    int nDam1_in_GrayMin;
    int nDam1_in_GrayMax;
    int nDam1_in_GrayDif;//MIN MAX 차이 
    int nDam1_in_GrayTH;//보정후 TH 
 
 
    //ERROR CODE 
    int nErrorcode;
 
 
};
//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_out
//nDamTh2_in : threshold dam2_in
//nDamTh1 : threshold dam1_out
//nDamTh1_in : threshold dam1_in
//nBaseline : Base Line distance
//nBaseDam2 : Base Line - dam2 distance
//nDam2Dist : dam2 distance
//nDam12Dist : dam2-dam1 distance
//nDam1Dist : dam1 distance
 
 
#define LOCAL_PEAK_PERIOD 10
//#define LINE_COMPENSATION
 
 
 
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);
 
reflowResult AFX_EXT_API Linecheck_New_Method(int* boe_line, reflowParam *rParam, BOOL bSetMaster);
////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
//int Linecheck_Method_Side0(int* boe_line, BYTE* pImage, int nImageWidth, int nImageHeight, CRect* ROI_Rect, int thDam2, int thDam2_2, int thDam1, int thDam1_2, int *nDistance); //distDam2Out, distDam2In, distDam1Out, distDam1In
//int Linecheck_Method_Side1(int* boe_line, BYTE* pImage, int nImageWidth, int nImageHeight, CRect* ROI_Rect, int thDam2, int thDam2_2, int thDam1, int thDam1_2, int *nDistance);
//int Linecheck_Method_Side2(int* boe_line, BYTE* pImage, int nImageWidth, int nImageHeight, CRect* ROI_Rect, int thDam2, int thDam2_2, int thDam1, int thDam1_2, int *nDistance);
 
int Linecheck_Method_Side0(int* boe_line, BYTE* pImage, int nImageWidth, int nImageHeight, CRect* ROI_Rect, int thDam2, int thDam2_2, int thDam1, int thDam1_2, int *nDistance,reflowResult* result); //distDam2Out, distDam2In, distDam1Out, distDam1In
int Linecheck_Method_Side1(int* boe_line, BYTE* pImage, int nImageWidth, int nImageHeight, CRect* ROI_Rect, int thDam2, int thDam2_2, int thDam1, int thDam1_2, int *nDistance,reflowResult* result);
int Linecheck_Method_Side2(int* boe_line, BYTE* pImage, int nImageWidth, int nImageHeight, CRect* ROI_Rect, int thDam2, int thDam2_2, int thDam1, int thDam1_2, int *nDistance,reflowResult* result);
 
 
 
//Error Code 의미 부여용 define
#define REFLOW_RESULT_IMAGE_LOAD_ERROR -1
#define REFLOW_RESULT_ROI_SETTING_ERROR -2
#define REFLOW_RESULT_DAM_SETTING_ERROR -3
#define REFLOW_RESULT_MATCHING_ERROR -4
#define REFLOW_RESULT_OUTPUT_ARRAY_ERROR -5
#define REFLOW_RESULT_REFLOWPARAM_SETTING_ERROR -6
 
 
 
 
//비사용 method
 
//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);
 
//위의 메소드와 같은 기능을 수행하지만, Threshold를 Dam1(Th1), Dam2(Th2)로 나눠서 검사하는 메소드
//int Linecheck_Method_Side0(int* boe_line, BYTE* pImage, int imageWidth, int imageHeight, CRect* ROI_Rect, int thDam2, int thDam1, int *nDistance); //distDam2Out, distDam2In, distDam1Out, distDam1In
//int Linecheck_Method_Side1(int* boe_line, BYTE* pImage, int imageWidth, int imageHeight, CRect* ROI_Rect, int thDam2, int thDam1, int *nDistance);
//int Linecheck_Method_Side2(int* boe_line, BYTE* pImage, int imageWidth, int imageHeight, CRect* ROI_Rect, int thDam2, int thDam1, int *nDistance);
 
//int AFX_EXT_API BOE_Linecheck(int* boe_line, reflowParam *rParam, BOOL bSetMaster = FALSE);
 
//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);
 
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"