diff --git a/modules/shape/test/test_emdl1.cpp b/modules/shape/test/test_emdl1.cpp deleted file mode 100644 index e52351bcf6..0000000000 --- a/modules/shape/test/test_emdl1.cpp +++ /dev/null @@ -1,263 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// Intel License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2000, Intel Corporation, all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * The name of Intel Corporation may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors "as is" and -// any express or implied warranties, including, but not limited to, the implied -// warranties of merchantability and fitness for a particular purpose are disclaimed. -// In no event shall the Intel Corporation or contributors be liable for any direct, -// indirect, incidental, special, exemplary, or consequential damages -// (including, but not limited to, procurement of substitute goods or services; -// loss of use, data, or profits; or business interruption) however caused -// and on any theory of liability, whether in contract, strict liability, -// or tort (including negligence or otherwise) arising in any way out of -// the use of this software, even if advised of the possibility of such damage. -// -//M*/ - -#include "test_precomp.hpp" - -using namespace cv; -using namespace std; - -const int angularBins=12; -const int radialBins=4; -const float minRad=0.2f; -const float maxRad=2; -const int NSN=5;//10;//20; //number of shapes per class -const int NP=100; //number of points sympliying the contour -const float CURRENT_MAX_ACCUR=95; //98% and 99% reached in several tests, 95 is fixed as minimum boundary - -class CV_ShapeEMDTest : public cvtest::BaseTest -{ -public: - CV_ShapeEMDTest(); - ~CV_ShapeEMDTest(); -protected: - void run(int); - -private: - void mpegTest(); - void listShapeNames(vector &listHeaders); - vector convertContourType(const Mat &, int n=0 ); - float computeShapeDistance(vector & queryNormal, - vector & queryFlipped1, - vector & queryFlipped2, - vector& testq); - void displayMPEGResults(); -}; - -CV_ShapeEMDTest::CV_ShapeEMDTest() -{ -} -CV_ShapeEMDTest::~CV_ShapeEMDTest() -{ -} - -vector CV_ShapeEMDTest::convertContourType(const Mat& currentQuery, int n) -{ - vector > _contoursQuery; - vector contoursQuery; - findContours(currentQuery, _contoursQuery, RETR_LIST, CHAIN_APPROX_NONE); - for (size_t border=0; border<_contoursQuery.size(); border++) - { - for (size_t p=0; p<_contoursQuery[border].size(); p++) - { - contoursQuery.push_back(Point2f((float)_contoursQuery[border][p].x, - (float)_contoursQuery[border][p].y)); - } - } - - // In case actual number of points is less than n - int dum=0; - for (int add=(int)contoursQuery.size()-1; add cont; - for (int i=0; i &listHeaders) -{ - listHeaders.push_back("apple"); //ok - listHeaders.push_back("children"); // ok - listHeaders.push_back("device7"); // ok - listHeaders.push_back("Heart"); // ok - listHeaders.push_back("teddy"); // ok -} -float CV_ShapeEMDTest::computeShapeDistance(vector & query1, vector & query2, - vector & query3, vector & testq) -{ - //waitKey(0); - Ptr mysc = createShapeContextDistanceExtractor(angularBins, radialBins, minRad, maxRad); - //Ptr cost = createNormHistogramCostExtractor(cv::DIST_L1); - //Ptr cost = createChiHistogramCostExtractor(30,0.15); - //Ptr cost = createEMDHistogramCostExtractor(); - // Ptr cost = createEMDL1HistogramCostExtractor(); - mysc->setIterations(1); //(3) - mysc->setCostExtractor( createEMDL1HistogramCostExtractor() ); - //mysc->setTransformAlgorithm(createAffineTransformer(true)); - mysc->setTransformAlgorithm( createThinPlateSplineShapeTransformer() ); - //mysc->setImageAppearanceWeight(1.6); - //mysc->setImageAppearanceWeight(0.0); - //mysc->setImages(im1,imtest); - return ( std::min( mysc->computeDistance(query1, testq), - std::min(mysc->computeDistance(query2, testq), mysc->computeDistance(query3, testq) ))); -} - -void CV_ShapeEMDTest::mpegTest() -{ - string baseTestFolder="shape/mpeg_test/"; - string path = cvtest::TS::ptr()->get_data_path() + baseTestFolder; - vector namesHeaders; - listShapeNames(namesHeaders); - - // distance matrix // - Mat distanceMat=Mat::zeros(NSN*(int)namesHeaders.size(), NSN*(int)namesHeaders.size(), CV_32F); - - // query contours (normal v flipped, h flipped) and testing contour // - vector contoursQuery1, contoursQuery2, contoursQuery3, contoursTesting; - - // reading query and computing its properties // - int counter=0; - const int loops=NSN*(int)namesHeaders.size()*NSN*(int)namesHeaders.size(); - for (size_t n=0; n origContour; - contoursQuery1=convertContourType(currentQuery, NP); - origContour=contoursQuery1; - contoursQuery2=convertContourType(flippedHQuery, NP); - contoursQuery3=convertContourType(flippedVQuery, NP); - - // compare with all the rest of the images: testing // - for (size_t nt=0; nt(NSN*(int)n+i-1, - NSN*(int)nt+it-1)=0; - continue; - } - // read testing image // - stringstream thetestpathandname; - thetestpathandname<(NSN*(int)n+i-1, NSN*(int)nt+it-1)= - computeShapeDistance(contoursQuery1, contoursQuery2, contoursQuery3, contoursTesting); - std::cout<(NSN*(int)n+i-1, NSN*(int)nt+it-1)<get_data_path() + baseTestFolder + "distanceMatrixMPEGTest.yml", FileStorage::WRITE); - fs << "distanceMat" << distanceMat; -} - -const int FIRST_MANY=2*NSN; -void CV_ShapeEMDTest::displayMPEGResults() -{ - string baseTestFolder="shape/mpeg_test/"; - Mat distanceMat; - FileStorage fs(cvtest::TS::ptr()->get_data_path() + baseTestFolder + "distanceMatrixMPEGTest.yml", FileStorage::READ); - vector namesHeaders; - listShapeNames(namesHeaders); - - // Read generated MAT // - fs["distanceMat"]>>distanceMat; - - int corrects=0; - int divi=0; - for (int row=0; row(row,col)>distanceMat.at(row,i)) - { - nsmall++; - } - } - if (nsmall<=FIRST_MANY) - { - corrects++; - } - } - } - float porc = 100*float(corrects)/(NSN*distanceMat.rows); - std::cout<<"%="<= CURRENT_MAX_ACCUR) - ts->set_failed_test_info(cvtest::TS::OK); - else - ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY); - -} - -void CV_ShapeEMDTest::run( int /*start_from*/ ) -{ - mpegTest(); - displayMPEGResults(); -} - -TEST(ShapeEMD_SCD, regression) { CV_ShapeEMDTest test; test.safe_run(); } diff --git a/modules/shape/test/test_hausdorff.cpp b/modules/shape/test/test_hausdorff.cpp deleted file mode 100644 index ec33436f06..0000000000 --- a/modules/shape/test/test_hausdorff.cpp +++ /dev/null @@ -1,280 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// Intel License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2000, Intel Corporation, all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * The name of Intel Corporation may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors "as is" and -// any express or implied warranties, including, but not limited to, the implied -// warranties of merchantability and fitness for a particular purpose are disclaimed. -// In no event shall the Intel Corporation or contributors be liable for any direct, -// indirect, incidental, special, exemplary, or consequential damages -// (including, but not limited to, procurement of substitute goods or services; -// loss of use, data, or profits; or business interruption) however caused -// and on any theory of liability, whether in contract, strict liability, -// or tort (including negligence or otherwise) arising in any way out of -// the use of this software, even if advised of the possibility of such damage. -// -//M*/ - -#include "test_precomp.hpp" -#include - -using namespace cv; -using namespace std; - -const int NSN=5;//10;//20; //number of shapes per class -const float CURRENT_MAX_ACCUR=85; //90% and 91% reached in several tests, 85 is fixed as minimum boundary - -class CV_HaussTest : public cvtest::BaseTest -{ -public: - CV_HaussTest(); - ~CV_HaussTest(); -protected: - void run(int); -private: - float computeShapeDistance(vector &query1, vector &query2, - vector &query3, vector &testq); - vector convertContourType(const Mat& currentQuery, int n=180); - vector normalizeContour(const vector & contour); - void listShapeNames( vector &listHeaders); - void mpegTest(); - void displayMPEGResults(); -}; - -CV_HaussTest::CV_HaussTest() -{ -} -CV_HaussTest::~CV_HaussTest() -{ -} - -vector CV_HaussTest::normalizeContour(const vector &contour) -{ - vector output(contour.size()); - Mat disMat((int)contour.size(),(int)contour.size(),CV_32F); - Point2f meanpt(0,0); - float meanVal=1; - - for (int ii=0, end1 = (int)contour.size(); ii(ii,jj)=0; - else - { - disMat.at(ii,jj)= - float(fabs(double(contour[ii].x*contour[jj].x)))+float(fabs(double(contour[ii].y*contour[jj].y))); - } - } - meanpt.x+=contour[ii].x; - meanpt.y+=contour[ii].y; - } - meanpt.x/=contour.size(); - meanpt.y/=contour.size(); - meanVal=float(cv::mean(disMat)[0]); - for (size_t ii=0; ii &listHeaders) -{ - listHeaders.push_back("apple"); //ok - listHeaders.push_back("children"); // ok - listHeaders.push_back("device7"); // ok - listHeaders.push_back("Heart"); // ok - listHeaders.push_back("teddy"); // ok -} - - -vector CV_HaussTest::convertContourType(const Mat& currentQuery, int n) -{ - vector > _contoursQuery; - vector contoursQuery; - findContours(currentQuery, _contoursQuery, RETR_LIST, CHAIN_APPROX_NONE); - for (size_t border=0; border<_contoursQuery.size(); border++) - { - for (size_t p=0; p<_contoursQuery[border].size(); p++) - { - contoursQuery.push_back(_contoursQuery[border][p]); - } - } - - // In case actual number of points is less than n - for (int add=(int)contoursQuery.size()-1; add cont; - for (int i=0; i& query1, vector & query2, - vector & query3, vector & testq) -{ - Ptr haus = createHausdorffDistanceExtractor(); - return std::min(haus->computeDistance(query1,testq), std::min(haus->computeDistance(query2,testq), - haus->computeDistance(query3,testq))); -} - -void CV_HaussTest::mpegTest() -{ - string baseTestFolder="shape/mpeg_test/"; - string path = cvtest::TS::ptr()->get_data_path() + baseTestFolder; - vector namesHeaders; - listShapeNames(namesHeaders); - - // distance matrix // - Mat distanceMat=Mat::zeros(NSN*(int)namesHeaders.size(), NSN*(int)namesHeaders.size(), CV_32F); - - // query contours (normal v flipped, h flipped) and testing contour // - vector contoursQuery1, contoursQuery2, contoursQuery3, contoursTesting; - - // reading query and computing its properties // - int counter=0; - const int loops=NSN*(int)namesHeaders.size()*NSN*(int)namesHeaders.size(); - for (size_t n=0; n origContour; - contoursQuery1=convertContourType(currentQuery); - origContour=contoursQuery1; - contoursQuery2=convertContourType(flippedHQuery); - contoursQuery3=convertContourType(flippedVQuery); - - // compare with all the rest of the images: testing // - for (size_t nt=0; nt(NSN*(int)n+i-1, - NSN*(int)nt+it-1)=0; - continue; - } - // read testing image // - stringstream thetestpathandname; - thetestpathandname<(NSN*(int)n+i-1, NSN*(int)nt+it-1)= - computeShapeDistance(contoursQuery1, contoursQuery2, contoursQuery3, contoursTesting); - std::cout<(NSN*(int)n+i-1, NSN*(int)nt+it-1)<get_data_path() + baseTestFolder + "distanceMatrixMPEGTest.yml", FileStorage::WRITE); - fs << "distanceMat" << distanceMat; -} - -const int FIRST_MANY=2*NSN; -void CV_HaussTest::displayMPEGResults() -{ - string baseTestFolder="shape/mpeg_test/"; - Mat distanceMat; - FileStorage fs(cvtest::TS::ptr()->get_data_path() + baseTestFolder + "distanceMatrixMPEGTest.yml", FileStorage::READ); - vector namesHeaders; - listShapeNames(namesHeaders); - - // Read generated MAT // - fs["distanceMat"]>>distanceMat; - - int corrects=0; - int divi=0; - for (int row=0; row(row,col)>distanceMat.at(row,i)) - { - nsmall++; - } - } - if (nsmall<=FIRST_MANY) - { - corrects++; - } - } - } - float porc = 100*float(corrects)/(NSN*distanceMat.rows); - std::cout<<"%="<= CURRENT_MAX_ACCUR) - ts->set_failed_test_info(cvtest::TS::OK); - else - ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY); - -} - - -void CV_HaussTest::run(int /* */) -{ - mpegTest(); - displayMPEGResults(); - ts->set_failed_test_info(cvtest::TS::OK); -} - -TEST(Hauss, regression) { CV_HaussTest test; test.safe_run(); } diff --git a/modules/shape/test/test_precomp.cpp b/modules/shape/test/test_precomp.cpp deleted file mode 100644 index 5956e13e3e..0000000000 --- a/modules/shape/test/test_precomp.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "test_precomp.hpp" diff --git a/modules/shape/test/test_precomp.hpp b/modules/shape/test/test_precomp.hpp index 819d711e85..af10e80088 100644 --- a/modules/shape/test/test_precomp.hpp +++ b/modules/shape/test/test_precomp.hpp @@ -16,6 +16,4 @@ #include "opencv2/imgcodecs.hpp" #include "opencv2/shape.hpp" -#include "opencv2/opencv_modules.hpp" - #endif diff --git a/modules/shape/test/test_shape.cpp b/modules/shape/test/test_shape.cpp index 04e89fe6b9..6a84f2bc4f 100644 --- a/modules/shape/test/test_shape.cpp +++ b/modules/shape/test/test_shape.cpp @@ -44,222 +44,258 @@ using namespace cv; using namespace std; -const int angularBins=12; -const int radialBins=4; -const float minRad=0.2f; -const float maxRad=2; -const int NSN=5;//10;//20; //number of shapes per class -const int NP=120; //number of points sympliying the contour -const float CURRENT_MAX_ACCUR=95; //99% and 100% reached in several tests, 95 is fixed as minimum boundary - -class CV_ShapeTest : public cvtest::BaseTest +template +class ShapeBaseTest : public cvtest::BaseTest { public: - CV_ShapeTest(); - ~CV_ShapeTest(); -protected: - void run(int); - -private: - void mpegTest(); - void listShapeNames(vector &listHeaders); - vector convertContourType(const Mat &, int n=0 ); - float computeShapeDistance(vector & queryNormal, - vector & queryFlipped1, - vector & queryFlipped2, - vector& testq); - void displayMPEGResults(); -}; - -CV_ShapeTest::CV_ShapeTest() -{ -} -CV_ShapeTest::~CV_ShapeTest() -{ -} - -vector CV_ShapeTest::convertContourType(const Mat& currentQuery, int n) -{ - vector > _contoursQuery; - vector contoursQuery; - findContours(currentQuery, _contoursQuery, RETR_LIST, CHAIN_APPROX_NONE); - for (size_t border=0; border<_contoursQuery.size(); border++) + typedef Point_ PointType; + ShapeBaseTest(int _NSN, int _NP, float _CURRENT_MAX_ACCUR) + : NSN(_NSN), NP(_NP), CURRENT_MAX_ACCUR(_CURRENT_MAX_ACCUR) { - for (size_t p=0; p<_contoursQuery[border].size(); p++) + // generate file list + vector shapeNames; + shapeNames.push_back("apple"); //ok + shapeNames.push_back("children"); // ok + shapeNames.push_back("device7"); // ok + shapeNames.push_back("Heart"); // ok + shapeNames.push_back("teddy"); // ok + for (vector::const_iterator i = shapeNames.begin(); i != shapeNames.end(); ++i) { - contoursQuery.push_back(Point2f((float)_contoursQuery[border][p].x, - (float)_contoursQuery[border][p].y)); + for (int j = 0; j < NSN; ++j) + { + stringstream filename; + filename << cvtest::TS::ptr()->get_data_path() + << "shape/mpeg_test/" << *i << "-" << j + 1 << ".png"; + filenames.push_back(filename.str()); + } } + // distance matrix + const int totalCount = (int)filenames.size(); + distanceMat = Mat::zeros(totalCount, totalCount, CV_32F); } - // In case actual number of points is less than n - for (int add=(int)contoursQuery.size()-1; add cont; - for (int i=0; i convertContourType(const Mat& currentQuery) const { - cont.push_back(contoursQuery[i]); - } - return cont; -} - -void CV_ShapeTest::listShapeNames( vector &listHeaders) -{ - listHeaders.push_back("apple"); //ok - listHeaders.push_back("children"); // ok - listHeaders.push_back("device7"); // ok - listHeaders.push_back("Heart"); // ok - listHeaders.push_back("teddy"); // ok -} - -float CV_ShapeTest::computeShapeDistance(vector & query1, vector & query2, - vector & query3, vector & testq) -{ - //waitKey(0); - Ptr mysc = createShapeContextDistanceExtractor(angularBins, radialBins, minRad, maxRad); - //Ptr cost = createNormHistogramCostExtractor(cv::DIST_L1); - Ptr cost = createChiHistogramCostExtractor(30,0.15f); - //Ptr cost = createEMDHistogramCostExtractor(); - //Ptr cost = createEMDL1HistogramCostExtractor(); - mysc->setIterations(1); - mysc->setCostExtractor( cost ); - //mysc->setTransformAlgorithm(createAffineTransformer(true)); - mysc->setTransformAlgorithm( createThinPlateSplineShapeTransformer() ); - //mysc->setImageAppearanceWeight(1.6); - //mysc->setImageAppearanceWeight(0.0); - //mysc->setImages(im1,imtest); - return ( std::min( mysc->computeDistance(query1, testq), - std::min(mysc->computeDistance(query2, testq), mysc->computeDistance(query3, testq) ))); -} + vector > _contoursQuery; + findContours(currentQuery, _contoursQuery, RETR_LIST, CHAIN_APPROX_NONE); -void CV_ShapeTest::mpegTest() -{ - string baseTestFolder="shape/mpeg_test/"; - string path = cvtest::TS::ptr()->get_data_path() + baseTestFolder; - vector namesHeaders; - listShapeNames(namesHeaders); + vector contoursQuery; + for (size_t border=0; border<_contoursQuery.size(); border++) + { + for (size_t p=0; p<_contoursQuery[border].size(); p++) + { + contoursQuery.push_back(PointType((T)_contoursQuery[border][p].x, + (T)_contoursQuery[border][p].y)); + } + } - // distance matrix // - Mat distanceMat=Mat::zeros(NSN*(int)namesHeaders.size(), NSN*(int)namesHeaders.size(), CV_32F); + // In case actual number of points is less than n + for (int add=(int)contoursQuery.size()-1; add contoursQuery1, contoursQuery2, contoursQuery3, contoursTesting; + // Uniformly sampling + random_shuffle(contoursQuery.begin(), contoursQuery.end()); + int nStart=NP; + vector cont; + for (int i=0; i contoursQuery1, contoursQuery2, contoursQuery3, contoursTesting; + // reading query and computing its properties + for (vector::const_iterator a = filenames.begin(); a != filenames.end(); ++a) { - // read current image // - stringstream thepathandname; - thepathandname< origContour; - contoursQuery1=convertContourType(currentQuery, NP); - origContour=contoursQuery1; - contoursQuery2=convertContourType(flippedHQuery, NP); - contoursQuery3=convertContourType(flippedVQuery, NP); - - // compare with all the rest of the images: testing // - for (size_t nt=0; nt::const_iterator b = filenames.begin(); b != filenames.end(); ++b) { - for (int it=1; it<=NSN; it++) + int bIndex = b - filenames.begin(); + float distance = 0; + // skip self-comparisson + if (a != b) { - // skip self-comparisson // - counter++; - if (nt==n && it==i) - { - distanceMat.at(NSN*(int)n+i-1, - NSN*(int)nt+it-1)=0; - continue; - } - // read testing image // - stringstream thetestpathandname; - thetestpathandname<(NSN*(int)n+i-1, NSN*(int)nt+it-1)= - computeShapeDistance(contoursQuery1, contoursQuery2, contoursQuery3, contoursTesting); - std::cout<(NSN*(int)n+i-1, NSN*(int)nt+it-1)<(aIndex, bIndex) = distance; } } } - // save distance matrix // - FileStorage fs(cvtest::TS::ptr()->get_data_path() + baseTestFolder + "distanceMatrixMPEGTest.yml", FileStorage::WRITE); - fs << "distanceMat" << distanceMat; -} -const int FIRST_MANY=2*NSN; -void CV_ShapeTest::displayMPEGResults() -{ - string baseTestFolder="shape/mpeg_test/"; - Mat distanceMat; - FileStorage fs(cvtest::TS::ptr()->get_data_path() + baseTestFolder + "distanceMatrixMPEGTest.yml", FileStorage::READ); - vector namesHeaders; - listShapeNames(namesHeaders); - - // Read generated MAT // - fs["distanceMat"]>>distanceMat; - - int corrects=0; - int divi=0; - for (int row=0; row(row,col)>distanceMat.at(row,i)) - { - nsmall++; - } + divi+=NSN; } - if (nsmall<=FIRST_MANY) + for (int col=divi-NSN; col(row,col) > distanceMat.at(row,i)) + { + nsmall++; + } + } + if (nsmall<=FIRST_MANY) + { + corrects++; + } } } + float porc = 100*float(corrects)/(NSN*distanceMat.rows); + std::cout << "Test result: " << porc << "%" << std::endl; + if (porc >= CURRENT_MAX_ACCUR) + ts->set_failed_test_info(cvtest::TS::OK); + else + ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY); + } + +protected: + int NSN; + int NP; + float CURRENT_MAX_ACCUR; + vector filenames; + Mat distanceMat; + compute cmp; +}; + +//------------------------------------------------------------------------ +// Test Shape_SCD.regression +//------------------------------------------------------------------------ + +class computeShapeDistance_Chi +{ + Ptr mysc; +public: + computeShapeDistance_Chi() + { + const int angularBins=12; + const int radialBins=4; + const float minRad=0.2f; + const float maxRad=2; + mysc = createShapeContextDistanceExtractor(angularBins, radialBins, minRad, maxRad); + mysc->setIterations(1); + mysc->setCostExtractor(createChiHistogramCostExtractor(30,0.15f)); + mysc->setTransformAlgorithm( createThinPlateSplineShapeTransformer() ); + } + float operator()(vector & query1, vector & query2, + vector & query3, vector & testq) + { + return std::min(mysc->computeDistance(query1, testq), + std::min(mysc->computeDistance(query2, testq), + mysc->computeDistance(query3, testq))); } - float porc = 100*float(corrects)/(NSN*distanceMat.rows); - std::cout<<"%="<= CURRENT_MAX_ACCUR) - ts->set_failed_test_info(cvtest::TS::OK); - else - ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY); - //done +}; + +TEST(Shape_SCD, regression) +{ + const int NSN_val=5;//10;//20; //number of shapes per class + const int NP_val=120; //number of points simplifying the contour + const float CURRENT_MAX_ACCUR_val=95; //99% and 100% reached in several tests, 95 is fixed as minimum boundary + ShapeBaseTest test(NSN_val, NP_val, CURRENT_MAX_ACCUR_val); + test.safe_run(); } -void CV_ShapeTest::run( int /*start_from*/ ) +//------------------------------------------------------------------------ +// Test ShapeEMD_SCD.regression +//------------------------------------------------------------------------ + +class computeShapeDistance_EMD { - mpegTest(); - displayMPEGResults(); - ts->set_failed_test_info(cvtest::TS::OK); + Ptr mysc; +public: + computeShapeDistance_EMD() + { + const int angularBins=12; + const int radialBins=4; + const float minRad=0.2f; + const float maxRad=2; + mysc = createShapeContextDistanceExtractor(angularBins, radialBins, minRad, maxRad); + mysc->setIterations(1); + mysc->setCostExtractor( createEMDL1HistogramCostExtractor() ); + mysc->setTransformAlgorithm( createThinPlateSplineShapeTransformer() ); + } + float operator()(vector & query1, vector & query2, + vector & query3, vector & testq) + { + return std::min(mysc->computeDistance(query1, testq), + std::min(mysc->computeDistance(query2, testq), + mysc->computeDistance(query3, testq))); + } +}; + +TEST(ShapeEMD_SCD, regression) +{ + const int NSN_val=5;//10;//20; //number of shapes per class + const int NP_val=100; //number of points simplifying the contour + const float CURRENT_MAX_ACCUR_val=95; //98% and 99% reached in several tests, 95 is fixed as minimum boundary + ShapeBaseTest test(NSN_val, NP_val, CURRENT_MAX_ACCUR_val); + test.safe_run(); } -TEST(Shape_SCD, regression) { CV_ShapeTest test; test.safe_run(); } +//------------------------------------------------------------------------ +// Test Hauss.regression +//------------------------------------------------------------------------ + +class computeShapeDistance_Haussdorf +{ + Ptr haus; +public: + computeShapeDistance_Haussdorf() + { + haus = createHausdorffDistanceExtractor(); + } + float operator()(vector &query1, vector &query2, + vector &query3, vector &testq) + { + return std::min(haus->computeDistance(query1,testq), + std::min(haus->computeDistance(query2,testq), + haus->computeDistance(query3,testq))); + } +}; + +TEST(Hauss, regression) +{ + const int NSN_val=5;//10;//20; //number of shapes per class + const int NP_val = 180; //number of points simplifying the contour + const float CURRENT_MAX_ACCUR_val=85; //90% and 91% reached in several tests, 85 is fixed as minimum boundary + ShapeBaseTest test(NSN_val, NP_val, CURRENT_MAX_ACCUR_val); + test.safe_run(); +}