Commit e37b9469 authored by Daniil Osokin's avatar Daniil Osokin

Added perf tests

parent c3ae08a1
This diff is collapsed.
This diff is collapsed.
#include "perf_precomp.hpp" #include "perf_precomp.hpp"
#include "opencv2/highgui/highgui.hpp" #include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/internal.hpp" #include "opencv2/core/internal.hpp"
#include "opencv2/flann/flann.hpp" #include "opencv2/flann/flann.hpp"
#include "opencv2/opencv_modules.hpp" #include "opencv2/opencv_modules.hpp"
using namespace std; using namespace std;
using namespace cv; using namespace cv;
using namespace perf; using namespace perf;
using std::tr1::make_tuple; using std::tr1::make_tuple;
using std::tr1::get; using std::tr1::get;
#define SURF_MATCH_CONFIDENCE 0.65f #define SURF_MATCH_CONFIDENCE 0.65f
#define ORB_MATCH_CONFIDENCE 0.3f #define ORB_MATCH_CONFIDENCE 0.3f
#define WORK_MEGAPIX 0.6 #define WORK_MEGAPIX 0.6
typedef TestBaseWithParam<String> stitch; typedef TestBaseWithParam<String> stitch;
typedef TestBaseWithParam<String> match; typedef TestBaseWithParam<String> match;
#ifdef HAVE_OPENCV_NONFREE #ifdef HAVE_OPENCV_NONFREE
#define TEST_DETECTORS testing::Values("surf", "orb") #define TEST_DETECTORS testing::Values("surf", "orb")
#else #else
#define TEST_DETECTORS testing::Values<String>("orb") #define TEST_DETECTORS testing::Values<String>("orb")
#endif #endif
PERF_TEST_P(stitch, a123, TEST_DETECTORS) PERF_TEST_P(stitch, a123, TEST_DETECTORS)
{ {
Mat pano; Mat pano;
vector<Mat> imgs; vector<Mat> imgs;
imgs.push_back( imread( getDataPath("stitching/a1.jpg") ) ); imgs.push_back( imread( getDataPath("stitching/a1.jpg") ) );
imgs.push_back( imread( getDataPath("stitching/a2.jpg") ) ); imgs.push_back( imread( getDataPath("stitching/a2.jpg") ) );
imgs.push_back( imread( getDataPath("stitching/a3.jpg") ) ); imgs.push_back( imread( getDataPath("stitching/a3.jpg") ) );
Ptr<detail::FeaturesFinder> featuresFinder = GetParam() == "orb" Ptr<detail::FeaturesFinder> featuresFinder = GetParam() == "orb"
? (detail::FeaturesFinder*)new detail::OrbFeaturesFinder() ? (detail::FeaturesFinder*)new detail::OrbFeaturesFinder()
: (detail::FeaturesFinder*)new detail::SurfFeaturesFinder(); : (detail::FeaturesFinder*)new detail::SurfFeaturesFinder();
Ptr<detail::FeaturesMatcher> featuresMatcher = GetParam() == "orb" Ptr<detail::FeaturesMatcher> featuresMatcher = GetParam() == "orb"
? new detail::BestOf2NearestMatcher(false, ORB_MATCH_CONFIDENCE) ? new detail::BestOf2NearestMatcher(false, ORB_MATCH_CONFIDENCE)
: new detail::BestOf2NearestMatcher(false, SURF_MATCH_CONFIDENCE); : new detail::BestOf2NearestMatcher(false, SURF_MATCH_CONFIDENCE);
declare.time(30 * 20).iterations(20); declare.time(30 * 20).iterations(20);
while(next()) while(next())
{ {
Stitcher stitcher = Stitcher::createDefault(); Stitcher stitcher = Stitcher::createDefault();
stitcher.setFeaturesFinder(featuresFinder); stitcher.setFeaturesFinder(featuresFinder);
stitcher.setFeaturesMatcher(featuresMatcher); stitcher.setFeaturesMatcher(featuresMatcher);
stitcher.setWarper(new SphericalWarper()); stitcher.setWarper(new SphericalWarper());
stitcher.setRegistrationResol(WORK_MEGAPIX); stitcher.setRegistrationResol(WORK_MEGAPIX);
startTimer(); startTimer();
stitcher.stitch(imgs, pano); stitcher.stitch(imgs, pano);
stopTimer(); stopTimer();
} }
} }
PERF_TEST_P(stitch, b12, TEST_DETECTORS) PERF_TEST_P(stitch, b12, TEST_DETECTORS)
{ {
Mat pano; Mat pano;
vector<Mat> imgs; vector<Mat> imgs;
imgs.push_back( imread( getDataPath("stitching/b1.jpg") ) ); imgs.push_back( imread( getDataPath("stitching/b1.jpg") ) );
imgs.push_back( imread( getDataPath("stitching/b2.jpg") ) ); imgs.push_back( imread( getDataPath("stitching/b2.jpg") ) );
Ptr<detail::FeaturesFinder> featuresFinder = GetParam() == "orb" Ptr<detail::FeaturesFinder> featuresFinder = GetParam() == "orb"
? (detail::FeaturesFinder*)new detail::OrbFeaturesFinder() ? (detail::FeaturesFinder*)new detail::OrbFeaturesFinder()
: (detail::FeaturesFinder*)new detail::SurfFeaturesFinder(); : (detail::FeaturesFinder*)new detail::SurfFeaturesFinder();
Ptr<detail::FeaturesMatcher> featuresMatcher = GetParam() == "orb" Ptr<detail::FeaturesMatcher> featuresMatcher = GetParam() == "orb"
? new detail::BestOf2NearestMatcher(false, ORB_MATCH_CONFIDENCE) ? new detail::BestOf2NearestMatcher(false, ORB_MATCH_CONFIDENCE)
: new detail::BestOf2NearestMatcher(false, SURF_MATCH_CONFIDENCE); : new detail::BestOf2NearestMatcher(false, SURF_MATCH_CONFIDENCE);
declare.time(30 * 20).iterations(20); declare.time(30 * 20).iterations(20);
while(next()) while(next())
{ {
Stitcher stitcher = Stitcher::createDefault(); Stitcher stitcher = Stitcher::createDefault();
stitcher.setFeaturesFinder(featuresFinder); stitcher.setFeaturesFinder(featuresFinder);
stitcher.setFeaturesMatcher(featuresMatcher); stitcher.setFeaturesMatcher(featuresMatcher);
stitcher.setWarper(new SphericalWarper()); stitcher.setWarper(new SphericalWarper());
stitcher.setRegistrationResol(WORK_MEGAPIX); stitcher.setRegistrationResol(WORK_MEGAPIX);
startTimer(); startTimer();
stitcher.stitch(imgs, pano); stitcher.stitch(imgs, pano);
stopTimer(); stopTimer();
} }
} }
PERF_TEST_P( match, bestOf2Nearest, TEST_DETECTORS) PERF_TEST_P( match, bestOf2Nearest, TEST_DETECTORS)
{ {
Mat img1, img1_full = imread( getDataPath("stitching/b1.jpg") ); Mat img1, img1_full = imread( getDataPath("stitching/b1.jpg") );
Mat img2, img2_full = imread( getDataPath("stitching/b2.jpg") ); Mat img2, img2_full = imread( getDataPath("stitching/b2.jpg") );
float scale1 = (float)std::min(1.0, sqrt(WORK_MEGAPIX * 1e6 / img1_full.total())); float scale1 = (float)std::min(1.0, sqrt(WORK_MEGAPIX * 1e6 / img1_full.total()));
float scale2 = (float)std::min(1.0, sqrt(WORK_MEGAPIX * 1e6 / img2_full.total())); float scale2 = (float)std::min(1.0, sqrt(WORK_MEGAPIX * 1e6 / img2_full.total()));
resize(img1_full, img1, Size(), scale1, scale1); resize(img1_full, img1, Size(), scale1, scale1);
resize(img2_full, img2, Size(), scale2, scale2); resize(img2_full, img2, Size(), scale2, scale2);
Ptr<detail::FeaturesFinder> finder; Ptr<detail::FeaturesFinder> finder;
Ptr<detail::FeaturesMatcher> matcher; Ptr<detail::FeaturesMatcher> matcher;
if (GetParam() == "surf") if (GetParam() == "surf")
{ {
finder = new detail::SurfFeaturesFinder(); finder = new detail::SurfFeaturesFinder();
matcher = new detail::BestOf2NearestMatcher(false, SURF_MATCH_CONFIDENCE); matcher = new detail::BestOf2NearestMatcher(false, SURF_MATCH_CONFIDENCE);
} }
else if (GetParam() == "orb") else if (GetParam() == "orb")
{ {
finder = new detail::OrbFeaturesFinder(); finder = new detail::OrbFeaturesFinder();
matcher = new detail::BestOf2NearestMatcher(false, ORB_MATCH_CONFIDENCE); matcher = new detail::BestOf2NearestMatcher(false, ORB_MATCH_CONFIDENCE);
} }
else else
{ {
FAIL() << "Unknown 2D features type: " << GetParam(); FAIL() << "Unknown 2D features type: " << GetParam();
} }
detail::ImageFeatures features1, features2; detail::ImageFeatures features1, features2;
(*finder)(img1, features1); (*finder)(img1, features1);
(*finder)(img2, features2); (*finder)(img2, features2);
detail::MatchesInfo pairwise_matches; detail::MatchesInfo pairwise_matches;
declare.in(features1.descriptors, features2.descriptors) declare.in(features1.descriptors, features2.descriptors)
.iterations(100); .iterations(100);
while(next()) while(next())
{ {
cvflann::seed_random(42);//for predictive FlannBasedMatcher cvflann::seed_random(42);//for predictive FlannBasedMatcher
startTimer(); startTimer();
(*matcher)(features1, features2, pairwise_matches); (*matcher)(features1, features2, pairwise_matches);
stopTimer(); stopTimer();
matcher->collectGarbage(); matcher->collectGarbage();
} }
} }
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment