@@ -119,9 +119,9 @@ struct MACEImpl CV_FINAL : MACE {
119
119
int IMGSIZE_2X = IMGSIZE * 2 ;
120
120
int TOTALPIXEL = IMGSIZE_2X * IMGSIZE_2X;
121
121
122
- Mat_<Vec2d > D (TOTALPIXEL, 1 , 0.0 );
123
- Mat_<Vec2d> S (TOTALPIXEL, size, 0.0 );
124
- Mat_<Vec2d> SPLUS (size, TOTALPIXEL, 0.0 );
122
+ Mat_<double > D (TOTALPIXEL, 1 , 0.0 );
123
+ Mat_<Vec2d> S (TOTALPIXEL, size, Vec2d ( 0 , 0 ) );
124
+ Mat_<Vec2d> SPLUS (size, TOTALPIXEL, Vec2d ( 0 , 0 ) );
125
125
for (int i=0 ; i<size; i++) {
126
126
Mat_<Vec2d> dftImg = isdft ? images[i] : dftImage (images[i]);
127
127
for (int l=0 ; l<IMGSIZE_2X; l++) {
@@ -130,35 +130,24 @@ struct MACEImpl CV_FINAL : MACE {
130
130
Vec2d s = dftImg (l, m);
131
131
S (j, i) = s;
132
132
SPLUS (i, j) = Vec2d (s[0 ], -s[1 ]);
133
- D (j, 0 )[ 0 ] += (s[0 ]*s[0 ]) + (s[1 ]*s[1 ]);
133
+ D (j, 0 ) += (s[0 ]*s[0 ]) + (s[1 ]*s[1 ]);
134
134
}
135
135
}
136
136
}
137
+ Mat_<double > DSQ; cv::sqrt (D, DSQ);
138
+ Mat_<double > DINV = TOTALPIXEL * size / DSQ;
137
139
138
- #if 0 // https://github.com/opencv/opencv_contrib/issues/1848
139
- // FIXIT What is expected here? complex numbers math?
140
- // D(,)[1] is 0 (always)
141
- Mat sq; cv::sqrt(D, sq); // Per-element sqrt(): sq(,)[1] is 0 (always)
142
- Mat_<Vec2d> DINV = TOTALPIXEL * size / sq; // "per-element" division which provides "Inf"
143
- #else
144
- Mat sq; cv::sqrt (D.reshape (1 ).col (0 ), sq);
145
- Mat_<Vec2d> DINV (TOTALPIXEL, 1 , Vec2d (0 , 0 ));
146
- DINV.reshape (1 ).col (0 ) = TOTALPIXEL * size / sq;
147
- #endif
148
- Mat_<Vec2d> DINV_S (TOTALPIXEL, size, 0.0 );
149
- Mat_<Vec2d> SPLUS_DINV (size, TOTALPIXEL, 0.0 );
140
+ Mat_<Vec2d> DINV_S (TOTALPIXEL, size);
141
+ Mat_<Vec2d> SPLUS_DINV (size, TOTALPIXEL);
150
142
for (int l=0 ; l<size; l++) {
151
143
for (int m=0 ; m<TOTALPIXEL; m++) {
152
- SPLUS_DINV (l, m)[0 ] = SPLUS (l,m)[0 ] * DINV (m,0 )[0 ];
153
- SPLUS_DINV (l, m)[1 ] = SPLUS (l,m)[1 ] * DINV (m,0 )[1 ]; // FIXIT: DINV(,)[1] is 0 (always)
154
- DINV_S (m, l)[0 ] = S (m,l)[0 ] * DINV (m,0 )[0 ];
155
- DINV_S (m, l)[1 ] = S (m,l)[1 ] * DINV (m,0 )[1 ];
144
+ DINV_S (m, l) = S (m,l) * DINV (m,0 );
145
+ SPLUS_DINV (l, m) = SPLUS (l,m) * DINV (m,0 );
156
146
}
157
147
}
158
148
159
149
Mat_<Vec2d> SPLUS_DINV_S = SPLUS_DINV * S;
160
- Mat_<Vec2d> SPLUS_DINV_S_INV (size, size);
161
- Mat_<double > SPLUS_DINV_S_INV_1 (2 *size, 2 *size);
150
+ Mat_<double > SPLUS_DINV_S_INV_1 (2 *size, 2 *size, 0.0 );
162
151
for (int l=0 ; l<size; l++) {
163
152
for (int m=0 ; m<size; m++) {
164
153
Vec2d s = SPLUS_DINV_S (l, m);
@@ -170,14 +159,15 @@ struct MACEImpl CV_FINAL : MACE {
170
159
}
171
160
invert (SPLUS_DINV_S_INV_1, SPLUS_DINV_S_INV_1);
172
161
162
+ Mat_<Vec2d> SPLUS_DINV_S_INV (size, size);
173
163
for (int l=0 ; l<size; l++) {
174
164
for (int m=0 ; m<size; m++) {
175
165
SPLUS_DINV_S_INV (l, m) = Vec2d (SPLUS_DINV_S_INV_1 (l,m), SPLUS_DINV_S_INV_1 (l,m+size));
176
166
}
177
167
}
178
168
179
169
Mat_<Vec2d> Hmace = DINV_S * SPLUS_DINV_S_INV;
180
- Mat_<Vec2d> C (size,1 , Vec2d (1 ,0 ));
170
+ Mat_<Vec2d> C (size, 1 , Vec2d (1 ,0 ));
181
171
maceFilter = Mat (Hmace * C).reshape (2 ,IMGSIZE_2X);
182
172
}
183
173
0 commit comments