@@ -31,12 +31,11 @@ __kernel void NCC(__global const uchar *patch,
3131 int s1 = 0 , s2 = 0 , n1 = 0 , n2 = 0 , prod = 0 ;
3232 float sq1 = 0 , sq2 = 0 , ares = 0 ;
3333 int N = 225 ;
34- //NCC with positive patch
34+ //NCC with positive sample
3535 if (posFlg && id < posNum )
3636 {
3737 for (int i = 0 ; i < N ; i ++ )
3838 {
39-
4039 s1 += positiveSamples [id * N + i ];
4140 s2 += patch [i ];
4241 n1 += positiveSamples [id * N + i ] * positiveSamples [id * N + i ];
@@ -46,10 +45,10 @@ __kernel void NCC(__global const uchar *patch,
4645 sq1 = sqrt (max (0.0 , n1 - 1.0 * s1 * s1 / N ));
4746 sq2 = sqrt (max (0.0 , n2 - 1.0 * s2 * s2 / N ));
4847 ares = (sq2 == 0 ) ? sq1 / fabs (sq1 ) : (prod - s1 * s2 / N ) / sq1 / sq2 ;
49- ncc [id ] = ares ;
48+ ncc [id ] = ares ;
5049 }
5150
52- //NCC with negative patch
51+ //NCC with negative sample
5352 if (!posFlg && id < negNum )
5453 {
5554 for (int i = 0 ; i < N ; i ++ )
@@ -67,3 +66,68 @@ __kernel void NCC(__global const uchar *patch,
6766 ncc [id + 500 ] = ares ;
6867 }
6968}
69+
70+ __kernel void batchNCC (__global const uchar * patches ,
71+ __global const uchar * positiveSamples ,
72+ __global const uchar * negativeSamples ,
73+ __global float * posNcc ,
74+ __global float * negNcc ,
75+ int posNum ,
76+ int negNum ,
77+ int patchNum )
78+ {
79+ int id = get_global_id (0 );
80+ bool posFlg ;
81+
82+ if (id < 500 * patchNum )
83+ posFlg = true;
84+ if (id >= 500 * patchNum )
85+ {
86+ //Negative index
87+ id = id - 500 * patchNum ;
88+ posFlg = false;
89+ }
90+
91+ int modelSampleID = id % 500 ;
92+ int patchID = id / 500 ;
93+
94+ //Variables
95+ int s1 = 0 , s2 = 0 , n1 = 0 , n2 = 0 , prod = 0 ;
96+ float sq1 = 0 , sq2 = 0 , ares = 0 ;
97+ int N = 225 ;
98+
99+ //NCC with positive sample
100+ if (posFlg && modelSampleID < posNum )
101+ {
102+ for (int i = 0 ; i < N ; i ++ )
103+ {
104+ s1 += positiveSamples [modelSampleID * N + i ];
105+ s2 += patches [patchID * N + i ];
106+ n1 += positiveSamples [modelSampleID * N + i ] * positiveSamples [modelSampleID * N + i ];
107+ n2 += patches [patchID * N + i ] * patches [patchID * N + i ];
108+ prod += positiveSamples [modelSampleID * N + i ] * patches [patchID * N + i ];
109+ }
110+ sq1 = sqrt (max (0.0 , n1 - 1.0 * s1 * s1 / N ));
111+ sq2 = sqrt (max (0.0 , n2 - 1.0 * s2 * s2 / N ));
112+ ares = (sq2 == 0 ) ? sq1 / fabs (sq1 ) : (prod - s1 * s2 / N ) / sq1 / sq2 ;
113+ posNcc [id ] = ares ;
114+ }
115+
116+ //NCC with negative sample
117+ if (!posFlg && modelSampleID < negNum )
118+ {
119+ for (int i = 0 ; i < N ; i ++ )
120+ {
121+
122+ s1 += negativeSamples [modelSampleID * N + i ];
123+ s2 += patches [patchID * N + i ];
124+ n1 += negativeSamples [modelSampleID * N + i ] * negativeSamples [modelSampleID * N + i ];
125+ n2 += patches [patchID * N + i ] * patches [patchID * N + i ];
126+ prod += negativeSamples [modelSampleID * N + i ] * patches [patchID * N + i ];
127+ }
128+ sq1 = sqrt (max (0.0 , n1 - 1.0 * s1 * s1 / N ));
129+ sq2 = sqrt (max (0.0 , n2 - 1.0 * s2 * s2 / N ));
130+ ares = (sq2 == 0 ) ? sq1 / fabs (sq1 ) : (prod - s1 * s2 / N ) / sq1 / sq2 ;
131+ negNcc [id ] = ares ;
132+ }
133+ }
0 commit comments