/* * shape_context.cpp -- Shape context demo for shape matching */ #include "opencv2/shape.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" #include #include #include using namespace std; using namespace cv; static void help() { printf("\n" "This program demonstrates a method for shape comparisson based on Shape Context\n" "You should run the program providing a number between 1 and 20 for selecting an image in the folder ../data/shape_sample.\n" "Call\n" "./shape_example [number between 1 and 20, 1 default]\n\n"); } static vector simpleContour( const Mat& currentQuery, int n=300 ) { 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 int dummy=0; for (int add=(int)contoursQuery.size()-1; add cont; for (int i=0; i("@input"); if (!parser.check()) { parser.printErrors(); help(); return 1; } if (indexQuery < 1 || indexQuery > 20) { help(); return 1; } cv::Ptr mysc = cv::createShapeContextDistanceExtractor(); Size sz2Sh(300,300); stringstream queryName; queryName< contQuery = simpleContour(query); int bestMatch = 0; float bestDis=FLT_MAX; for ( int ii=1; ii<=20; ii++ ) { if (ii==indexQuery) continue; waitKey(30); stringstream iiname; iiname< contii = simpleContour(iiIm); float dis = mysc->computeDistance( contQuery, contii ); if ( dis