@@ -273,4 +273,78 @@ TEST(SURF)
273273 d_surf (d_src1, gpu::GpuMat (), d_keypoints1);
274274 d_surf (d_src2, gpu::GpuMat (), d_keypoints2);
275275 GPU_OFF;
276+ }
277+
278+
279+ TEST (BruteForceMatcher)
280+ {
281+ RNG rng (0 );
282+
283+ // Init CPU matcher
284+
285+ int desc_len = 128 ;
286+ int num_trains = rng.uniform (1 , 5 );
287+
288+ BruteForceMatcher< L2<float > > matcher;
289+
290+ Mat query;
291+ gen (query, rng.uniform (100 , 300 ), desc_len, CV_32F, 0 , 10 );
292+
293+ vector<Mat> trains (num_trains);
294+ for (int i = 0 ; i < num_trains; ++i)
295+ {
296+ Mat train;
297+ gen (train, rng.uniform (100 , 300 ), desc_len, CV_32F, 0 , 10 );
298+ trains[i] = train;
299+ }
300+ matcher.add (trains);
301+
302+ // Init GPU matcher
303+
304+ gpu::BruteForceMatcher_GPU< L2<float > > d_matcher;
305+
306+ gpu::GpuMat d_query (query);
307+
308+ vector<gpu::GpuMat> d_trains (num_trains);
309+ for (int i = 0 ; i < num_trains; ++i)
310+ {
311+ d_trains[i] = trains[i];
312+ }
313+ d_matcher.add (d_trains);
314+
315+ // Output
316+ vector< vector<DMatch> > matches (1 );
317+ vector< vector<DMatch> > d_matches (1 );
318+
319+ SUBTEST << " match" ;
320+
321+ CPU_ON;
322+ matcher.match (query, matches[0 ]);
323+ CPU_OFF;
324+
325+ GPU_ON;
326+ d_matcher.match (d_query, d_matches[0 ]);
327+ GPU_OFF;
328+
329+ SUBTEST << " knnMatch" ;
330+ int knn = rng.uniform (3 , 10 );
331+
332+ CPU_ON;
333+ matcher.knnMatch (query, matches, knn);
334+ CPU_OFF;
335+
336+ GPU_ON;
337+ d_matcher.knnMatch (d_query, d_matches, knn);
338+ GPU_OFF;
339+
340+ SUBTEST << " radiusMatch" ;
341+ float max_distance = rng.uniform (25 .0f , 65 .0f );
342+
343+ CPU_ON;
344+ matcher.radiusMatch (query, matches, max_distance);
345+ CPU_OFF;
346+
347+ GPU_ON;
348+ d_matcher.radiusMatch (d_query, d_matches, max_distance);
349+ GPU_OFF;
276350}
0 commit comments