Path: blob/master/modules/features2d/perf/perf_batchDistance.cpp
16354 views
#include "perf_precomp.hpp"12namespace opencv_test3{4using namespace perf;56CV_ENUM(NormType, NORM_L1, NORM_L2, NORM_L2SQR, NORM_HAMMING, NORM_HAMMING2)78typedef tuple<NormType, MatType, bool> Norm_Destination_CrossCheck_t;9typedef perf::TestBaseWithParam<Norm_Destination_CrossCheck_t> Norm_Destination_CrossCheck;1011typedef tuple<NormType, bool> Norm_CrossCheck_t;12typedef perf::TestBaseWithParam<Norm_CrossCheck_t> Norm_CrossCheck;1314typedef tuple<MatType, bool> Source_CrossCheck_t;15typedef perf::TestBaseWithParam<Source_CrossCheck_t> Source_CrossCheck;1617void generateData( Mat& query, Mat& train, const int sourceType );1819PERF_TEST_P(Norm_Destination_CrossCheck, batchDistance_8U,20testing::Combine(testing::Values((int)NORM_L1, (int)NORM_L2SQR),21testing::Values(CV_32S, CV_32F),22testing::Bool()23)24)25{26NormType normType = get<0>(GetParam());27int destinationType = get<1>(GetParam());28bool isCrossCheck = get<2>(GetParam());29int knn = isCrossCheck ? 1 : 0;3031Mat queryDescriptors;32Mat trainDescriptors;33Mat dist;34Mat ndix;3536generateData(queryDescriptors, trainDescriptors, CV_8U);3738TEST_CYCLE()39{40batchDistance(queryDescriptors, trainDescriptors, dist, destinationType, (isCrossCheck) ? ndix : noArray(),41normType, knn, Mat(), 0, isCrossCheck);42}4344SANITY_CHECK(dist);45if (isCrossCheck) SANITY_CHECK(ndix);46}4748PERF_TEST_P(Norm_CrossCheck, batchDistance_Dest_32S,49testing::Combine(testing::Values((int)NORM_HAMMING, (int)NORM_HAMMING2),50testing::Bool()51)52)53{54NormType normType = get<0>(GetParam());55bool isCrossCheck = get<1>(GetParam());56int knn = isCrossCheck ? 1 : 0;5758Mat queryDescriptors;59Mat trainDescriptors;60Mat dist;61Mat ndix;6263generateData(queryDescriptors, trainDescriptors, CV_8U);6465TEST_CYCLE()66{67batchDistance(queryDescriptors, trainDescriptors, dist, CV_32S, (isCrossCheck) ? ndix : noArray(),68normType, knn, Mat(), 0, isCrossCheck);69}7071SANITY_CHECK(dist);72if (isCrossCheck) SANITY_CHECK(ndix);73}7475PERF_TEST_P(Source_CrossCheck, batchDistance_L2,76testing::Combine(testing::Values(CV_8U, CV_32F),77testing::Bool()78)79)80{81int sourceType = get<0>(GetParam());82bool isCrossCheck = get<1>(GetParam());83int knn = isCrossCheck ? 1 : 0;8485Mat queryDescriptors;86Mat trainDescriptors;87Mat dist;88Mat ndix;8990generateData(queryDescriptors, trainDescriptors, sourceType);9192declare.time(50);93TEST_CYCLE()94{95batchDistance(queryDescriptors, trainDescriptors, dist, CV_32F, (isCrossCheck) ? ndix : noArray(),96NORM_L2, knn, Mat(), 0, isCrossCheck);97}9899SANITY_CHECK(dist);100if (isCrossCheck) SANITY_CHECK(ndix);101}102103PERF_TEST_P(Norm_CrossCheck, batchDistance_32F,104testing::Combine(testing::Values((int)NORM_L1, (int)NORM_L2SQR),105testing::Bool()106)107)108{109NormType normType = get<0>(GetParam());110bool isCrossCheck = get<1>(GetParam());111int knn = isCrossCheck ? 1 : 0;112113Mat queryDescriptors;114Mat trainDescriptors;115Mat dist;116Mat ndix;117118generateData(queryDescriptors, trainDescriptors, CV_32F);119declare.time(100);120121TEST_CYCLE()122{123batchDistance(queryDescriptors, trainDescriptors, dist, CV_32F, (isCrossCheck) ? ndix : noArray(),124normType, knn, Mat(), 0, isCrossCheck);125}126127SANITY_CHECK(dist, 1e-4);128if (isCrossCheck) SANITY_CHECK(ndix);129}130131void generateData( Mat& query, Mat& train, const int sourceType )132{133const int dim = 500;134const int queryDescCount = 300; // must be even number because we split train data in some cases in two135const int countFactor = 4; // do not change it136RNG& rng = theRNG();137138// Generate query descriptors randomly.139// Descriptor vector elements are integer values.140Mat buf( queryDescCount, dim, CV_32SC1 );141rng.fill( buf, RNG::UNIFORM, Scalar::all(0), Scalar(3) );142buf.convertTo( query, sourceType );143144// Generate train descriptors as follows:145// copy each query descriptor to train set countFactor times146// and perturb some one element of the copied descriptors in147// in ascending order. General boundaries of the perturbation148// are (0.f, 1.f).149train.create( query.rows*countFactor, query.cols, sourceType );150float step = (sourceType == CV_8U ? 256.f : 1.f) / countFactor;151for( int qIdx = 0; qIdx < query.rows; qIdx++ )152{153Mat queryDescriptor = query.row(qIdx);154for( int c = 0; c < countFactor; c++ )155{156int tIdx = qIdx * countFactor + c;157Mat trainDescriptor = train.row(tIdx);158queryDescriptor.copyTo( trainDescriptor );159int elem = rng(dim);160float diff = rng.uniform( step*c, step*(c+1) );161trainDescriptor.col(elem) += diff;162}163}164}165166} // namespace167168169