#include <time.h> // for time()
// If defined, the match time and accuracy of the match results are a little different, each time the code ran.
-#define INIT_RANDOM_SEED
+//#define INIT_RANDOM_SEED
// If defined, some outlier images descriptors add() the matcher.
#define TRAIN_WITH_OUTLIER_IMAGES
const string &matchername,
const Mat& imgQuery, const vector<KeyPoint>& query_kp, const Mat& query_desc,
const vector<Mat>& imgOutliers, const vector<vector<KeyPoint> >& outliers_kp, const vector<Mat>& outliers_desc, const int totalOutlierDescCnt,
- const float t, const testparam &tp,
+ const float t, const testparam *tp,
const int testno, const bool bVerboseOutput, const bool bSaveDrawMatches)
{
TrainInfo ti;
// transform query image
Mat imgTransform;
- (tp.transfunc)(t, imgQuery, imgTransform);
+ (tp->transfunc)(t, imgQuery, imgTransform);
// extract kp and compute desc from transformed query image
vector<KeyPoint> trans_query_kp;
// draw status
sprintf(buff, "%s accuracy:%-3.2f%% %d descriptors training time:%-3.2fms matching :%-3.2fms", matchername.c_str(), ti.accuracy, ti.traindesccnt, ti.traintime, ti.matchtime);
putText(imgResult, buff, Point(0, 12), FONT_HERSHEY_PLAIN, 0.8, Scalar(0., 0., 255.));
- sprintf(buff, "%s/res%03d_%s_%s%.1f_inlier.png", resultDir, testno, matchername.c_str(), tp.transname.c_str(), t);
+ sprintf(buff, "%s/res%03d_%s_%s%.1f_inlier.png", resultDir, testno, matchername.c_str(), tp->transname.c_str(), t);
if (bSaveDrawMatches && !imwrite(buff, imgResult)) cout << "Image " << buff << " can not be saved (may be because directory " << resultDir << " does not exist)." << endl;
#if defined(TRAIN_WITH_OUTLIER_IMAGES)
drawMatches(imgQuery, query_kp, imgOutliers[i], outliers_kp[i], match, imgResult, Scalar::all(-1), Scalar::all(128), mask);// , DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
sprintf(buff, "query_num:%d train_num:%d matched:%d %d descriptors training time:%-3.2fms matching :%-3.2fms", (int)query_kp.size(), (int)outliers_kp[i].size(), matchcnt, ti.traindesccnt, ti.traintime, ti.matchtime);
putText(imgResult, buff, Point(0, 12), FONT_HERSHEY_PLAIN, 0.8, Scalar(0., 0., 255.));
- sprintf(buff, "%s/res%03d_%s_%s%.1f_outlier%02d.png", resultDir, testno, matchername.c_str(), tp.transname.c_str(), t, i);
+ sprintf(buff, "%s/res%03d_%s_%s%.1f_outlier%02d.png", resultDir, testno, matchername.c_str(), tp->transname.c_str(), t, i);
if (bSaveDrawMatches && !imwrite(buff, imgResult)) cout << "Image " << buff << " can not be saved (may be because directory " << resultDir << " does not exist)." << endl;
}
#endif
if (bVerboseOutput)
{
- cout << tp.transname <<" image matching accuracy:" << ti.accuracy << "% " << ti.traindesccnt << " train:" << ti.traintime << "ms match:" << ti.matchtime << "ms" << endl;
+ cout << tp->transname <<" image matching accuracy:" << ti.accuracy << "% " << ti.traindesccnt << " train:" << ti.traintime << "ms match:" << ti.matchtime << "ms" << endl;
}
return ti;
{
private:
- Ptr<DescriptorMatcher> bfmatcher; // brute force matcher for accuracy of reference
- Ptr<DescriptorMatcher> flmatcher; // flann matcher to test
- Ptr<Feature2D> fe; // feature detector extractor
+ DescriptorMatcher* bfmatcher; // brute force matcher for accuracy of reference
+ DescriptorMatcher* flmatcher; // flann matcher to test
+ Feature2D* fe; // feature detector extractor
Mat imgQuery; // query image
vector<Mat> imgOutliers; // outlier image
vector<KeyPoint> query_kp; // query key points detect from imgQuery
int totalOutlierDescCnt;
string flmatchername;
- testparam tp;
+ testparam *tp;
double target_accuracy_margin_from_bfmatcher;
public:
//
// constructor
//
- CV_FeatureDetectorMatcherBaseTest(testparam _tp, double _accuracy_margin, Ptr<Feature2D> _fe, DescriptorMatcher *_flmatcher, string _flmatchername, int norm_type_for_bfmatcher) :
+ CV_FeatureDetectorMatcherBaseTest(testparam* _tp, double _accuracy_margin, Feature2D* _fe, DescriptorMatcher *_flmatcher, string _flmatchername, int norm_type_for_bfmatcher) :
tp(_tp),
fe(_fe),
flmatcher(_flmatcher),
srand((unsigned int)time(0));
#endif
// create brute force matcher for accuracy of reference
- bfmatcher = makePtr<BFMatcher>(norm_type_for_bfmatcher);
+ bfmatcher = new BFMatcher(norm_type_for_bfmatcher);
}
//
double totalMatchTime = 0.;
double totalAccuracy = 0.;
int cnt = 0;
- for (float t = tp.from; t <= tp.to; t += tp.step, ++testno_for_make_filename, ++cnt)
+ for (float t = tp->from; t <= tp->to; t += tp->step, ++testno_for_make_filename, ++cnt)
{
if (SHOW_DEBUG_LOG) cout << "Test No." << testno_for_make_filename << " BFMatcher " << t;
totalMatchTime = 0.;
totalAccuracy = 0.;
cnt = 0;
- for (float t = tp.from; t <= tp.to; t += tp.step, ++testno_for_make_filename, ++cnt)
+ for (float t = tp->from; t <= tp->to; t += tp->step, ++testno_for_make_filename, ++cnt)
{
if (SHOW_DEBUG_LOG) cout << "Test No." << testno_for_make_filename << " " << flmatchername << " " << t;
// compare accuracies between the brute force matcher and the test target matcher
if (average_accuracy < target_average_accuracy)
{
- ts->printf(cvtest::TS::LOG, "Bad average accuracy %f < %f while test %s %s query\n", average_accuracy, target_average_accuracy, flmatchername.c_str(), tp.transname.c_str());
+ ts->printf(cvtest::TS::LOG, "Bad average accuracy %f < %f while test %s %s query\n", average_accuracy, target_average_accuracy, flmatchername.c_str(), tp->transname.c_str());
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
}
return;
TEST(BlurredQueryFlannBasedLshShortKeyMatcherAdditionalTrainTest, accuracy)
{
+ Ptr<Feature2D> fe = OrbCreate;
+ Ptr<FlannBasedMatcher> fl = makePtr<FlannBasedMatcher>(makePtr<flann::LshIndexParams>(1, 16, 2));
testparam tp("blurred", blur, 1.0f, 11.0f, 2.0f);
- CV_FeatureDetectorMatcherBaseTest test(tp, SHORT_LSH_KEY_ACCURACY_MARGIN, OrbCreate, new FlannBasedMatcher(makePtr<flann::LshIndexParams>(1, 16, 2)), "FlannLsh(1, 16, 2)", NORM_HAMMING);
+ CV_FeatureDetectorMatcherBaseTest test(&tp, SHORT_LSH_KEY_ACCURACY_MARGIN, fe, fl, "FlannLsh(1, 16, 2)", NORM_HAMMING);
test.safe_run();
}
TEST(BlurredQueryFlannBasedLshMiddleKeyMatcherAdditionalTrainTest, accuracy)
{
+ Ptr<Feature2D> fe = OrbCreate;
+ Ptr<FlannBasedMatcher> fl = makePtr<FlannBasedMatcher>(makePtr<flann::LshIndexParams>(1, 24, 2));
testparam tp("blurred", blur, 1.0f, 11.0f, 2.0f);
- CV_FeatureDetectorMatcherBaseTest test(tp, MIDDLE_LSH_KEY_ACCURACY_MARGIN, OrbCreate, new FlannBasedMatcher(makePtr<flann::LshIndexParams>(1, 24, 2)), "FlannLsh(1, 24, 2)", NORM_HAMMING);
+ CV_FeatureDetectorMatcherBaseTest test(&tp, MIDDLE_LSH_KEY_ACCURACY_MARGIN, fe, fl, "FlannLsh(1, 24, 2)", NORM_HAMMING);
test.safe_run();
}
TEST(BlurredQueryFlannBasedLshLongKeyMatcherAdditionalTrainTest, accuracy)
{
+ Ptr<Feature2D> fe = OrbCreate;
+ Ptr<FlannBasedMatcher> fl = makePtr<FlannBasedMatcher>(makePtr<flann::LshIndexParams>(1, 31, 2));
testparam tp("blurred", blur, 1.0f, 11.0f, 2.0f);
- CV_FeatureDetectorMatcherBaseTest test(tp, LONG_LSH_KEY_ACCURACY_MARGIN, OrbCreate, new FlannBasedMatcher(makePtr<flann::LshIndexParams>(1, 31, 2)), "FlannLsh(1, 31, 2)", NORM_HAMMING);
+ CV_FeatureDetectorMatcherBaseTest test(&tp, LONG_LSH_KEY_ACCURACY_MARGIN, fe, fl, "FlannLsh(1, 31, 2)", NORM_HAMMING);
test.safe_run();
}
TEST(ScaledQueryFlannBasedLshShortKeyMatcherAdditionalTrainTest, accuracy)
{
+ Ptr<Feature2D> fe = OrbCreate;
+ Ptr<FlannBasedMatcher> fl = makePtr<FlannBasedMatcher>(makePtr<flann::LshIndexParams>(1, 16, 2));
testparam tp("scaled", scale, 0.5f, 1.5f, 0.1f);
- CV_FeatureDetectorMatcherBaseTest test(tp, SHORT_LSH_KEY_ACCURACY_MARGIN, OrbCreate, new FlannBasedMatcher(makePtr<flann::LshIndexParams>(1, 16, 2)), "FlannLsh(1, 16, 2)", NORM_HAMMING);
+ CV_FeatureDetectorMatcherBaseTest test(&tp, SHORT_LSH_KEY_ACCURACY_MARGIN, fe, fl, "FlannLsh(1, 16, 2)", NORM_HAMMING);
test.safe_run();
}
TEST(ScaledQueryFlannBasedLshMiddleKeyMatcherAdditionalTrainTest, accuracy)
{
+ Ptr<Feature2D> fe = OrbCreate;
+ Ptr<FlannBasedMatcher> fl = makePtr<FlannBasedMatcher>(makePtr<flann::LshIndexParams>(1, 24, 2));
testparam tp("scaled", scale, 0.5f, 1.5f, 0.1f);
- CV_FeatureDetectorMatcherBaseTest test(tp, MIDDLE_LSH_KEY_ACCURACY_MARGIN, OrbCreate, new FlannBasedMatcher(makePtr<flann::LshIndexParams>(1, 24, 2)), "FlannLsh(1, 24, 2)", NORM_HAMMING);
+ CV_FeatureDetectorMatcherBaseTest test(&tp, MIDDLE_LSH_KEY_ACCURACY_MARGIN, fe, fl, "FlannLsh(1, 24, 2)", NORM_HAMMING);
test.safe_run();
}
TEST(ScaledQueryFlannBasedLshLongKeyMatcherAdditionalTrainTest, accuracy)
{
+ Ptr<Feature2D> fe = OrbCreate;
+ Ptr<FlannBasedMatcher> fl = makePtr<FlannBasedMatcher>(makePtr<flann::LshIndexParams>(1, 31, 2));
testparam tp("scaled", scale, 0.5f, 1.5f, 0.1f);
- CV_FeatureDetectorMatcherBaseTest test(tp, LONG_LSH_KEY_ACCURACY_MARGIN, OrbCreate, new FlannBasedMatcher(makePtr<flann::LshIndexParams>(1, 31, 2)), "FlannLsh(1, 31, 2)", NORM_HAMMING);
+ CV_FeatureDetectorMatcherBaseTest test(&tp, LONG_LSH_KEY_ACCURACY_MARGIN, fe, fl, "FlannLsh(1, 31, 2)", NORM_HAMMING);
test.safe_run();
}
TEST(RotatedQueryFlannBasedLshShortKeyMatcherAdditionalTrainTest, accuracy)
{
+ Ptr<Feature2D> fe = OrbCreate;
+ Ptr<FlannBasedMatcher> fl = makePtr<FlannBasedMatcher>(makePtr<flann::LshIndexParams>(1, 16, 2));
testparam tp("rotated", rotate, 0.0f, 359.0f, 30.0f);
- CV_FeatureDetectorMatcherBaseTest test(tp, SHORT_LSH_KEY_ACCURACY_MARGIN, OrbCreate, new FlannBasedMatcher(makePtr<flann::LshIndexParams>(1, 16, 2)), "FlannLsh(1, 16, 2)", NORM_HAMMING);
+ CV_FeatureDetectorMatcherBaseTest test(&tp, SHORT_LSH_KEY_ACCURACY_MARGIN, fe, fl, "FlannLsh(1, 16, 2)", NORM_HAMMING);
test.safe_run();
}
TEST(RotatedQueryFlannBasedLshMiddleKeyMatcherAdditionalTrainTest, accuracy)
{
+ Ptr<Feature2D> fe = OrbCreate;
+ Ptr<FlannBasedMatcher> fl = makePtr<FlannBasedMatcher>(makePtr<flann::LshIndexParams>(1, 24, 2));
testparam tp("rotated", rotate, 0.0f, 359.0f, 30.0f);
- CV_FeatureDetectorMatcherBaseTest test(tp, MIDDLE_LSH_KEY_ACCURACY_MARGIN, OrbCreate, new FlannBasedMatcher(makePtr<flann::LshIndexParams>(1, 24, 2)), "FlannLsh(1, 24, 2)", NORM_HAMMING);
+ CV_FeatureDetectorMatcherBaseTest test(&tp, MIDDLE_LSH_KEY_ACCURACY_MARGIN, fe, fl, "FlannLsh(1, 24, 2)", NORM_HAMMING);
test.safe_run();
}
TEST(RotatedQueryFlannBasedLshLongKeyMatcherAdditionalTrainTest, accuracy)
{
+ Ptr<Feature2D> fe = OrbCreate;
+ Ptr<FlannBasedMatcher> fl = makePtr<FlannBasedMatcher>(makePtr<flann::LshIndexParams>(1, 31, 2));
testparam tp("rotated", rotate, 0.0f, 359.0f, 30.0f);
- CV_FeatureDetectorMatcherBaseTest test(tp, LONG_LSH_KEY_ACCURACY_MARGIN, OrbCreate, new FlannBasedMatcher(makePtr<flann::LshIndexParams>(1, 31, 2)), "FlannLsh(1, 31, 2)", NORM_HAMMING);
+ CV_FeatureDetectorMatcherBaseTest test(&tp, LONG_LSH_KEY_ACCURACY_MARGIN, fe, fl, "FlannLsh(1, 31, 2)", NORM_HAMMING);
test.safe_run();
}