mrDarker
2025-08-09 7201dd0993a94087a1c03e4f9700e3a6128d17e9
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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
    #pragma once
 
#include "RANSAC_LineFittingAlgorithm.h"
#include "EdgeProc.h"
#include "EdgeFind.h"
#include "ChamferInspect.h"
#include <map>
#include <vector>
 
using namespace std;
 
enum    SPLINE_ERR_MSG{ERR_SPLINE_EMPTYMASTER=1,ERR_SPLINE_EDGEPROCESS,ERR_SPLINE_LABELPROCESS,ERR_SPLINE_LABELCOUNT,ERR_SPLINE_INDEXFIND
,ERR_SPLINE_LABELPOSITION,ERR_SPLINE_POSITIONNULL,ERR_SPLINE_INS_CNT_SHORT,ERR_SPLINE_IMAGE_NULL,ERR_SPLINE_IMAGE_NULL_02
,ERR_SPLINE_IMAGE_NULL_03,SPLINE_INS_SUCESS};
 
#define MAX_SPLINE_DEFECT_COUNT        1000
 
class CSplinePoint
{
public:
    CSplinePoint()        { Reset(); }    
    void Reset()
    {
        origin = rotate = CPoint(0,0);        
        dThick = dTheta = 0.;
        bFind = FALSE;
    }
 
    CPoint    origin;
    CPoint    rotate;
    double    dThick;
    double    dTheta;
    BOOL    bFind;
};
 
class CImagePoint
{
public:
    CImagePoint()        { Reset(); }    
    void Reset()
    {
        imgPos = originPos = CPoint(0,0);    
        dTheta = 0.;
        nInsWidth = 0;
    }
 
    CPoint    imgPos;
    CPoint    originPos;
    double    dTheta;
    int        nInsWidth;
};
 
class CResultDefect
{
public:
    CResultDefect()        { Reset(); }    
    void Reset()
    {
        dThick = 0.;
        rectDefect = CRect(0,0,0,0);
    }
 
    CRect        rectDefect;
    double        dThick;
};
 
class CDetectPoint
{
public:
    CDetectPoint()        { Reset(); }    
    void Reset()
    {
        orgX = orgY = 0.;
        imgX = imgY = 0.;
        dTheta = dDist = 0.;
        bFind = FALSE;
    }
 
    double    orgX,orgY;
    double    imgX,imgY;
    double    dTheta;
    double    dDist;
    BOOL    bFind;
};
 
struct SortOrginYPos : public std::binary_function<pair<int,CSplinePoint>, pair<int,CSplinePoint>, bool>
{
    bool operator()(const pair<int,CSplinePoint> & lhs, const pair<int,CSplinePoint> & rhs)
    {
        return lhs.second.origin.y > rhs.second.origin.y;
    }
};
 
enum SPLINECHIP_INS_METHOD{METHOD_INS_LINE=0,METHOD_INT_ROUND};
enum MAKE_IMAGE_METHOD{MAKE_METHOD_LINEAR=0,MAKE_METHOD_REGRESSION,MAKE_METHOD_NONE};
enum SPLINE_INS_DIR{SPLINE_INS_DIRECTION_X=0,SPLINE_INS_DIRECTION_Y,SPLINE_INS_DIRECTION_NONE};
 
typedef struct  _CHIP_INS_REGION
{
public:
    _CHIP_INS_REGION()        { Reset(); }    
    void Reset()
    {
        bUse = FALSE;
        nStartX = nEndX = nThres = nFindThres = nSkipDist = nInsRange = 0;
        emMethod = MAKE_METHOD_NONE;
        emDir = SPLINE_INS_DIRECTION_NONE;
        nCornerYSize = -1;
    }
 
    BOOL        bUse;
    int            nStartX;
    int            nEndX;
    int            nCornerYSize;
    int            nThres;
    int            nFindThres;
    int            nSkipDist;
    int            nInsRange;
    MAKE_IMAGE_METHOD emMethod;
    SPLINE_INS_DIR    emDir;
}CHIP_INS_REGION;
 
#define        SPLINE_RESULT_DATA_CNT  2
#define        SPLINE_RANGE_RESULT_CNT 5
 
class AFX_EXT_CLASS CSplineModel
{
public:
    CSplineModel(void);        
    virtual ~CSplineModel(void);
 
public:
    BOOL        CopyModelData(CSplineModel *pSpline);
    BOOL        WriteModelData(CString strFile,CString strRecipe,CString strCut,std::multimap<int, CSplinePoint> *pPoint,CPoint pointOffset);
    BOOL        WriteCSVData(CString strFile,CPoint *pPoint,int nCnt,CPoint pointOffset);
    BOOL        ReadModelData(CString strFile,CString strRecipe);
    BOOL        IsLoadMasterImg(){return m_bLoadMasterImg;}
    CString        GetLoadModelRecipe(){return m_strLoadModel;}
    CSize        GetMasterDataSize(){return CSize(m_pointMasterMax.x,m_pointMasterMax.y);}
    std::multimap<int, CPoint> *GetMasterData(){return &m_mapMasterPos;}
    CPoint        GetptMasterMax(){return m_pointMasterMax;}
    CPoint        GetptMasterMin(){return m_pointMasterMin;}
    void        ClearModelData();
 
protected:
    BOOL        AdjustTilt(std::multimap<int, CSplinePoint> *pPos);
    double        GetTilt(std::multimap<int, CSplinePoint> *pPos,double &dCenX,double &dCenY);    
 
protected:
    BOOL        m_bLoadMasterImg;
    CString        m_strLoadModel;
    CPoint        m_pointMasterMax,m_pointMasterMin;    
    std::multimap<int, CPoint> m_mapMasterPos;    
};
 
class CSISBuffer;
class AFX_EXT_CLASS CSplineInspect
{
public:
    CSplineInspect(void);    
    CSplineInspect(CSISBuffer *lpBuffer);
    virtual ~CSplineInspect(void);
 
public:
    SPLINE_ERR_MSG    InspectSpline(CSISBuffer &pImg,CRect &rectCrop,int nDetDist,int nThres,BOOL bFlip,BOOL bSaveImg,BOOL bSaveDebug);
    double            InspectSplineChip(CSISBuffer pImg,int nPosLeft,CHIP_INS_REGION &insRegion,double dRes,int nJudgeThick,COwnerBuffer &pRes
        ,BOOL bFlip,int iReg,BOOL bSaveDebug,SPLINECHIP_INS_METHOD enOpt=METHOD_INT_ROUND);
 
    // ¼öÁ¤ ¹öÀü
    double            InspectSplineChip_New(CSISBuffer pImg,int nPosLeft,CHIP_INS_REGION &insRegion,double dRes,int nJudgeThick
        ,BOOL bFlip,int iReg,BOOL bSaveDebug,SPLINECHIP_INS_METHOD enOpt=METHOD_INT_ROUND);
    int            InspectChipBin_New(CEdgeProc &EdgeProc,CSISBuffer pOrg,CRect &insRect,CHIP_INS_REGION &insRegion,std::multimap<int, CSplinePoint> &mapIns);
    BOOL        Blob_OpenCV(CSISBuffer* pOriginImg, COwnerBuffer* pBinImage, CRect rtInsRect, std::vector<CChipBlob>* vecBlobList, ChipResionType s_RegionType,DefectPosType s_DefectPos, int nMinSize, int nSideFilter, BOOL bROIOffset=TRUE);
    int            FilteringDefect_New(CHIP_INS_REGION &insRegion,std::multimap<int, CSplinePoint> &mapIns,double dRes,int nJudge,CRect &insRect,BOOL bFlip);
 
public:    
    CChipBlob    *GetResultDefect(){return m_ResultDefect;}
    int            GetResultDefectCount(){return m_nDefectCount;}
    double        *GetResultData(){return m_dResultData;}    
    double        *GetRangeData(){return m_dRangeResult;}
    CSISBuffer    *GetSplineOrgImg(){return (CSISBuffer*)&m_insSplineOrg;}
    CSISBuffer    *GetSplineResImg(){return (CSISBuffer*)&m_insSplineRes;}
 
    BOOL        FindCADLine();
    BOOL        LabelingProcess();
    BOOL        LabelingCounting();
    BOOL        LabelFiltering(int nFilterCnt);
    int            GetRectInLabelMaxIndex(CRect &rect);
    BOOL        GetLabelPosition(int nIdx);
    std::multimap<int, CSplinePoint>    *GetSplinePos(){return &m_mapSplinePos;}
    CPoint        GetSplineOffset(){return CPoint(m_nSplineOffsetX,m_nSplineOffsetY);}
    BOOL        CheckBuffer();
    BOOL        CheckRange(int x,int y,CSISBuffer *buffer);    
    void        ContourTracing(int cy, int cx, int labelindex, int tracingdirection);
    BOOL        CheckRectToBuffer(CRect &rect);
    BOOL        Tracer(int *cy, int *cx, int *tracingdirection);
    void        ReleaseBuffer();
    BOOL        SetImage(CSISBuffer *lpBuffer);
    void        SetMasterModelData(CSplineModel *pMaster){m_pSpModel=pMaster;}
 
protected:
    void        ReleaseBlob();
    void        ResetValue();    
    BOOL        FindForeLine(CSISBuffer &pBuffer,int *nForeLine,double &dTheta);
    BOOL        ShiftNRotateImage(CSISBuffer pOrg,CSISBuffer pBin,COwnerBuffer &pProcess,COwnerBuffer &pProcImg,int *nForeLine,double dTheta,CPoint &pPosImg);
    BOOL        DistInspection(CEdgeProc &EdgeProc,CSISBuffer &pTgt,double *dResult,double *dRangeRes);
    int            GetSplineValue(CEdgeProc &glassFind,CSISBuffer pOrg,double dXPos,double dYPos);    
    void        MakeSplineResultImage(COwnerBuffer &pRes,CSISBuffer &pProcess);
    BOOL        AdjustTilt(std::multimap<int, CSplinePoint> *pPos);
    double        GetTilt(std::multimap<int, CSplinePoint> *pPos,double &dCenX,double &dCenY);    
 
protected:
    BOOL        CopyRectImg(LPBYTE pOrg,LPBYTE pTgt,CSize szImg,CRect &rectIns);
    BOOL        MakeCADLine(CHIP_INS_REGION & insRegion,std::multimap<int, CPoint> &mapData,CPoint &pointMin,CPoint &pointMax,SPLINECHIP_INS_METHOD enOpt=METHOD_INT_ROUND);
    double        GetCAD2ImgOffset(std::multimap<int, CPoint> &mapData,CSISBuffer pBin,CPoint pointMin,CPoint pointMax,int nGap=30);
    void        MakeInspectResultImage(CSISBuffer &pRes,std::multimap<int, CSplinePoint> &mapIns);
    void        MakeInspectResultImage(CSISBuffer &pRes,std::multimap<int, CPoint> &mapIns);
    void        MakeSplineDebugImg(COwnerBuffer &pRes,std::multimap<int, CPoint> *pMaster,std::multimap<int, CSplinePoint> *pData);    
    BOOL        MakeInspectLine(std::multimap<int, CPoint> &mapData,std::multimap<int, CSplinePoint> &mapIns,double dYPos,SPLINECHIP_INS_METHOD enOpt=METHOD_INT_ROUND);    
    double        InspectChip(CEdgeProc &EdgeProc,CSISBuffer pOrg,CRect &insRect,CHIP_INS_REGION &insRegion,std::multimap<int, CSplinePoint> &mapIns);
    int            InspectChipBin(CEdgeProc &EdgeProc,CSISBuffer pOrg,CRect &insRect,CHIP_INS_REGION &insRegion,std::multimap<int, CSplinePoint> &mapIns);
    int            InspectChipBin_Diagonal(CEdgeProc &EdgeProc,CSISBuffer pOrg,CRect &insRect,CHIP_INS_REGION &insRegion,std::multimap<int, CSplinePoint> &mapIns);
 
    int            FilteringDefect(CHIP_INS_REGION &insRegion,std::multimap<int, CSplinePoint> &mapIns,double dRes,int nJudge,CRect &insRect,BOOL bFlip);
    double        FindThick(CEdgeProc &EdgeProc,CSISBuffer pOrg,CRect &insRect,CPoint pointSet,CPoint &pointRotate,double dTheta,int nDetThres);
    int            AnalysisThick(CEdgeProc &EdgeProc,CRect rectImg,double dRes,int nJudgeThick,double dAvgThick,BOOL bFlip,std::multimap<int, CSplinePoint> &mapIns);    
 
public:        
    double        m_dImageTheta;
    CPoint        m_pointPosLeft;
    CPoint        m_pointDiffImg;    
    CSplineModel    *m_pSpModel;
    std::multimap<int, CSplinePoint> m_mapSplinePos;
    CChipBlob    m_ResultDefect[MAX_SPLINE_DEFECT_COUNT];
    double        m_dRangeResult[SPLINE_RANGE_RESULT_CNT];
    int            m_nDefectCount;
    CSize            m_szImageOrg;
    double        m_dResultData[SPLINE_RESULT_DATA_CNT];    
    COwnerBuffer    m_insSplineOrg,m_insSplineRes;
    CChamferInspect        m_ChamferIns;
    
    int                m_nSplineOffsetX;
    int                m_nSplineOffsetY;
    int                m_nCCCount;
    CSISBuffer        *m_lpBuffer;    
    int                **m_pLabelMap;
    int                m_nMaxContourIdx;
    int                m_nMaxContourCount;
    int                **m_pContourMap;
    int                *m_pContourCnt;
};