SDC C-Project CF Review 프로그램
LYW
2021-10-14 26e2541b87ca76e16cf69399eb9a3cce62d2e864
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
// MosisMath.h: interface for the CMosisMath class.
//
//////////////////////////////////////////////////////////////////////
 
#if !defined(AFX_MOSISMATH_H__00204741_878C_42AB_8757_3EE86C292EFD__INCLUDED_)
#define AFX_MOSISMATH_H__00204741_878C_42AB_8757_3EE86C292EFD__INCLUDED_
 
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
 
#include "MosisBuffer.h"
 
typedef __int64 int64;
typedef unsigned char uchar;
typedef unsigned short ushort;
 
 
/*
 
// defect count ±â¹ÝÀ¸·Î cutoff point ¸¦ Ã£¾Æ ÁØ´Ù.
// AddCountData¸¦ ÅëÇÑ ¹æ¹ý°ú FindCutoff_Continue¸¦ ÅëÇÑ ¹æ¹ý µÎ°¡Áö°¡ ÀÖ´Ù.
class AFX_EXT_CLASS CCutoffFind
{
    int m_nContinuousCutoff;
    int *m_pCountData;
public:
    int m_nCountData;
    CCutoffFind()
    {
        m_nCountData= 0;
        m_pCountData= NULL;
    }
    ~CCutoffFind()
    {
        if(m_pCountData)
            delete m_pCountData;
    }
    BOOL SetSize(int nData)
    {
        m_nCountData= nData;
        if(m_pCountData)
            delete m_pCountData;
        m_pCountData= new int[nData];
        return TRUE;
    }
    
    // ¼øÂ÷ÀûÀ¸·Î È£ÃâµÇ¸é cutoffÀÎÁö¸¦ ÆÇº°ÇØ ¿¬¼Ó cutoff count¸¦ ¸®ÅÏÇØ ÁØ´Ù.
    int AddCountData(int data, int nCutoff)
    {
        if(data < nCutoff)
        {
            m_nContinuousCutoff++;
            return m_nContinuousCutoff;
        }
        m_nContinuousCutoff= 0;
        return 0;
    }
    
    
    void SetCountData(int iData, int data)
    {
        m_pCountData[iData]= data;
    }
    // Á¤,¿ª¹æÇâÀ¸·Î line by line °Ë»çÇϸç Cutoff_Continuous¸¦ Ã£¾Æ ³½´Ù.  Cutoff_Continuous°¡ ¾øÀ¸¸é false, Cutoff À§Ä¡´Â Á¤¹æÇâ ±âÁØÀÇ indexÀÌ´Ù.
    // nContinue°³¼ö ÀÌ»ó Áö¼ÓÀûÀ¸·Î cutoff°¡ »ý°Ü¾ß Cutoff_Continuous·Î °£ÁÖÇÑ´Ù.
    BOOL FindCutoff_Continuous(BOOL bForwardScan, int nCutoff, int nContinue, int &iForwardResult)
    {
        int i;
        int nOccur= 0;
        
        if(bForwardScan)
        {
            for(i= 0; i< m_nCountData; i++)
            {
                if(m_pCountData[i] > nCutoff)
                {
                    nOccur++;
                    if(nOccur >= nContinue)
                    {
                        iForwardResult= i- nContinue+ 1;
                        return TRUE;
                    }
                }else
                {
                    nOccur= 0;
                }
            }
            return FALSE;
        }
        
        for(i= m_nCountData-1; i >= 0; i--)
        {
            if(m_pCountData[i] > nCutoff)
            {
                nOccur++;
                if(nOccur >= nContinue)
                {
                    iForwardResult= i+ nContinue- 1;
                    return TRUE;
                }else
                {
                    nOccur= 0;
                }
            }
        }
        return FALSE;
    }
};
*/
 
// 1. Sum of Absolute Differences
// 2. Cross-Correlation Values.
// 3. Minimum or Maximum on a certain curve.
class AFX_EXT_CLASS CMosisMath
{
public:
 
    // 1. Get Sum of Absolute Differences on the specific area(Rect).
    static INT64    GetAbsDiff(CMosisBuffer buffer, CRect rect, CMosisBuffer buffer2, int x2, int y2)
    {
        return GetAbsDiff(buffer, rect.left, rect.top, rect.Width(), rect.Height(), buffer2, x2, y2);
    }
    static INT64    GetAbsDiff(CMosisBuffer buffer, int x1, int y1, int width, int height, CMosisBuffer buffer2, int x2, int y2);
    static INT64    GetAbsDiff(BYTE* pData, BYTE* pData2, int len);
 
    // 2. Get Cross Correlation Value on the specific area(Rect).
    static int64    Get_CCU8( CMosisBuffer buffer1, int x1, int y1, int width, int height, CMosisBuffer buffer2, int x2, int y2);
    static int64    Get_CCU8_A( const uchar * vec1, int len );
    static int64    Get_CCU8_AUA( const uchar * vec1, const uchar * vec2, int len );
    static int64    Get_CCU8_UA( const uchar * vec1, const uchar * vec2, int len );
    static int64    Get_CCU8_UA( const uchar * vec1, int len );
    static int64    Get_CCU16_A( const ushort * vec1, int len );
    static int64    Get_CCU16_AUA( const ushort * vec1, const ushort * vec2, int len );
    static int64    Get_CCU16_UA( const ushort * vec1, const ushort * vec2, int len );
    static int64    Get_CCU16_UA( const ushort * vec1, int len );
 
    static int64    SumPixels_8u( const uchar * vec, int len );
    static int64    SumPixels_16u( const ushort * vec, int len );
 
 
    // 3. y= -a(x+ b)^2+ c => ÃÖ¼Ò°ªÀ» °¡Áö´Â Æ÷¹°¼±¿¡¼­ ÃÖ¼Ò°ªÀ» Ã£´Â´Ù.
    static double    SearchMinimum(int64 *pData, int nData);
    // 3. y= a(x+ b)^2+ c => ÃÖ´ë°ªÀ» °¡Áö´Â Æ÷¹°¼±¿¡¼­ ÃÖ´ë°ªÀ» Ã£´Â´Ù.
    static double    SearchMaximum(int64 *pData, int nData);
 
    // 4. 
    static double    GetAverage(CMosisBuffer buffer);
    static INT64    GetSum(CMosisBuffer buffer);
 
    // 5.
//    static void        CountLineDefect(CMosisBuffer bufer, double xPitch, double yPitch, CCutoffFind &find);
 
public: // useless
    static int64    Get_CCU16_A( const ushort * vec1, const ushort * vec2, int len );
    static int64    Get_CCU8_A( const uchar * vec1, const uchar * vec2, int len );
 
public: // for omp
    static int64    OMP_CCU8_A(const uchar * vec1, int len);
    static int64    OMP_CCU8_UA(const uchar *vec1, int len);
    static int64    OMP_CCU8_AUA( const uchar * vec1, const uchar * vec2, int len );
 
    
    static int64    OMP_CCU16_A( const ushort * vec1, int len );
    static int64    OMP_CCU16_UA( const ushort * vec1, int len );
    static int64    OMP_CCU16_AUA( const ushort * vec1, const ushort * vec2, int len );
};
 
#endif // !defined(AFX_MOSISMATH_H__00204741_878C_42AB_8757_3EE86C292EFD__INCLUDED_)