From: Maria Dimashova Date: Wed, 8 Jun 2011 14:51:42 +0000 (+0000) Subject: fix and some enchantments for matching_to_many_images sample (#869) X-Git-Tag: accepted/tizen/6.0/unified/20201030.111113~7080 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=518106af6dd1cf74e2c2fdba36b1eaa20b7fc881;p=platform%2Fupstream%2Fopencv.git fix and some enchantments for matching_to_many_images sample (#869) --- diff --git a/samples/cpp/matching_to_many_images.cpp b/samples/cpp/matching_to_many_images.cpp index d35e90f..7c6e3b9 100644 --- a/samples/cpp/matching_to_many_images.cpp +++ b/samples/cpp/matching_to_many_images.cpp @@ -1,5 +1,6 @@ #include "opencv2/highgui/highgui.hpp" #include "opencv2/features2d/features2d.hpp" +#include "opencv2/contrib/contrib.hpp" #include #include @@ -16,15 +17,15 @@ const string defaultDirToSaveResImages = "../../opencv/samples/cpp/matching_to_m void printPrompt( const string& applName ) { - cout << "/*\n" - << " * This is a sample on matching descriptors detected on one image to descriptors detected in image set.\n" - << " * So we have one query image and several train images. For each keypoint descriptor of query image\n" - << " * the one nearest train descriptor is found the entire collection of train images. To visualize the result\n" - << " * of matching we save images, each of which combines query and train image with matches between them (if they exist).\n" - << " * Match is drawn as line between corresponding points. Count of all matches is equel to count of\n" - << " * query keypoints, so we have the same count of lines in all set of result images (but not for each result\n" - << " * (train) image).\n" - << " */\n" << endl; + cout << "/*\n" + << " * This is a sample on matching descriptors detected on one image to descriptors detected in image set.\n" + << " * So we have one query image and several train images. For each keypoint descriptor of query image\n" + << " * the one nearest train descriptor is found the entire collection of train images. To visualize the result\n" + << " * of matching we save images, each of which combines query and train image with matches between them (if they exist).\n" + << " * Match is drawn as line between corresponding points. Count of all matches is equel to count of\n" + << " * query keypoints, so we have the same count of lines in all set of result images (but not for each result\n" + << " * (train) image).\n" + << " */\n" << endl; cout << endl << "Format:\n" << endl; cout << "./" << applName << " [detectorType] [descriptorType] [matcherType] [queryImage] [fileWithTrainImages] [dirToSaveResImages]" << endl; @@ -48,16 +49,21 @@ void maskMatchesByTrainImgIdx( const vector& matches, int trainImgIdx, v void readTrainFilenames( const string& filename, string& dirName, vector& trainFilenames ) { - const char dlmtr = '/'; - trainFilenames.clear(); ifstream file( filename.c_str() ); if ( !file.is_open() ) return; - size_t pos = filename.rfind(dlmtr); + size_t pos = filename.rfind('\\'); + char dlmtr = '\\'; + if (pos == String::npos) + { + pos = filename.rfind('/'); + dlmtr = '/'; + } dirName = pos == string::npos ? "" : filename.substr(0, pos) + dlmtr; + while( !file.eof() ) { string str; getline( file, str ); @@ -142,6 +148,12 @@ void computeDescriptors( const Mat& queryImage, vector& queryKeypoints cout << "< Computing descriptors for keypoints..." << endl; descriptorExtractor->compute( queryImage, queryKeypoints, queryDescriptors ); descriptorExtractor->compute( trainImages, trainKeypoints, trainDescriptors ); + + int totalTrainDesc = 0; + for( vector::const_iterator tdIter = trainDescriptors.begin(); tdIter != trainDescriptors.end(); tdIter++ ) + totalTrainDesc += tdIter->rows; + + cout << "Query descriptors count: " << queryDescriptors.rows << "; Total train descriptors count: " << totalTrainDesc << endl; cout << ">" << endl; } @@ -149,9 +161,23 @@ void matchDescriptors( const Mat& queryDescriptors, const vector& trainDesc vector& matches, Ptr& descriptorMatcher ) { cout << "< Set train descriptors collection in the matcher and match query descriptors to them..." << endl; + TickMeter tm; + + tm.start(); descriptorMatcher->add( trainDescriptors ); + descriptorMatcher->train(); + tm.stop(); + double buildTime = tm.getTimeMilli(); + + tm.start(); descriptorMatcher->match( queryDescriptors, matches ); + tm.stop(); + double matchTime = tm.getTimeMilli(); + CV_Assert( queryDescriptors.rows == (int)matches.size() || matches.empty() ); + + cout << "Number of matches: " << matches.size() << endl; + cout << "Build time: " << buildTime << " ms; Match time: " << matchTime << " ms" << endl; cout << ">" << endl; } @@ -168,7 +194,7 @@ void saveResultImages( const Mat& queryImage, const vector& queryKeypo { maskMatchesByTrainImgIdx( matches, i, mask ); drawMatches( queryImage, queryKeypoints, trainImages[i], trainKeypoints[i], - matches, drawImg, Scalar::all(-1), Scalar::all(-1), mask ); + matches, drawImg, Scalar(255, 0, 0), Scalar(0, 255, 255), mask ); string filename = resultDir + "/res_" + trainImagesNames[i]; if( !imwrite( filename, drawImg ) ) cout << "Image " << filename << " can not be saved (may be because directory " << resultDir << " does not exist)." << endl;