mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-20 21:40:49 +08:00
Merge pull request #229 from cbalint13/daisy
Add DAISY descriptor for wide-baseline / keypoints.
This commit is contained in:
@@ -53,3 +53,14 @@
|
||||
year={2012}
|
||||
publisher={NIPS}
|
||||
}
|
||||
|
||||
@article{Tola10,
|
||||
author = "E. Tola and V. Lepetit and P. Fua",
|
||||
title = {{DAISY: An Efficient Dense Descriptor Applied to Wide Baseline Stereo}},
|
||||
journal = "IEEE Transactions on Pattern Analysis and Machine Intelligence",
|
||||
year = 2010,
|
||||
month = "May",
|
||||
pages = "815--830",
|
||||
volume = "32",
|
||||
number = "5"
|
||||
}
|
||||
|
@@ -172,6 +172,88 @@ public:
|
||||
static Ptr<LATCH> create(int bytes = 32, bool rotationInvariance = true, int half_ssd_size=3);
|
||||
};
|
||||
|
||||
/** @brief Class implementing DAISY descriptor, described in @cite Tola10
|
||||
|
||||
@param radius radius of the descriptor at the initial scale
|
||||
@param q_radius amount of radial range division quantity
|
||||
@param q_theta amount of angular range division quantity
|
||||
@param q_hist amount of gradient orientations range division quantity
|
||||
@param norm choose descriptors normalization type, where
|
||||
DAISY::NRM_NONE will not do any normalization (default),
|
||||
DAISY::NRM_PARTIAL mean that histograms are normalized independently for L2 norm equal to 1.0,
|
||||
DAISY::NRM_FULL mean that descriptors are normalized for L2 norm equal to 1.0,
|
||||
DAISY::NRM_SIFT mean that descriptors are normalized for L2 norm equal to 1.0 but no individual one is bigger than 0.154 as in SIFT
|
||||
@param H optional 3x3 homography matrix used to warp the grid of daisy but sampling keypoints remains unwarped on image
|
||||
@param interpolation switch to disable interpolation for speed improvement at minor quality loss
|
||||
@param use_orientation sample patterns using keypoints orientation, disabled by default.
|
||||
|
||||
*/
|
||||
class CV_EXPORTS DAISY : public DescriptorExtractor
|
||||
{
|
||||
public:
|
||||
enum
|
||||
{
|
||||
NRM_NONE = 100, NRM_PARTIAL = 101, NRM_FULL = 102, NRM_SIFT = 103,
|
||||
};
|
||||
static Ptr<DAISY> create( float radius = 15, int q_radius = 3, int q_theta = 8,
|
||||
int q_hist = 8, int norm = DAISY::NRM_NONE, InputArray H = noArray(),
|
||||
bool interpolation = true, bool use_orientation = false );
|
||||
|
||||
/** @overload
|
||||
* @param image image to extract descriptors
|
||||
* @param keypoints of interest within image
|
||||
* @param descriptors resulted descriptors array
|
||||
*/
|
||||
virtual void compute( InputArray image, std::vector<KeyPoint>& keypoints, OutputArray descriptors ) = 0;
|
||||
|
||||
/** @overload
|
||||
* @param image image to extract descriptors
|
||||
* @param roi region of interest within image
|
||||
* @param descriptors resulted descriptors array for roi image pixels
|
||||
*/
|
||||
virtual void compute( InputArray image, Rect roi, OutputArray descriptors ) = 0;
|
||||
|
||||
/**@overload
|
||||
* @param image image to extract descriptors
|
||||
* @param descriptors resulted descriptors array for all image pixels
|
||||
*/
|
||||
virtual void compute( InputArray image, OutputArray descriptors ) = 0;
|
||||
|
||||
/**
|
||||
* @param y position y on image
|
||||
* @param x position x on image
|
||||
* @param orientation orientation on image (0->360)
|
||||
* @param descriptor supplied array for descriptor storage
|
||||
*/
|
||||
virtual void GetDescriptor( double y, double x, int orientation, float* descriptor ) const = 0;
|
||||
|
||||
/**
|
||||
* @param y position y on image
|
||||
* @param x position x on image
|
||||
* @param orientation orientation on image (0->360)
|
||||
* @param descriptor supplied array for descriptor storage
|
||||
* @param H homography matrix for warped grid
|
||||
*/
|
||||
virtual bool GetDescriptor( double y, double x, int orientation, float* descriptor, double* H ) const = 0;
|
||||
|
||||
/**
|
||||
* @param y position y on image
|
||||
* @param x position x on image
|
||||
* @param orientation orientation on image (0->360)
|
||||
* @param descriptor supplied array for descriptor storage
|
||||
*/
|
||||
virtual void GetUnnormalizedDescriptor( double y, double x, int orientation, float* descriptor ) const = 0;
|
||||
|
||||
/**
|
||||
* @param y position y on image
|
||||
* @param x position x on image
|
||||
* @param orientation orientation on image (0->360)
|
||||
* @param descriptor supplied array for descriptor storage
|
||||
* @param H homography matrix for warped grid
|
||||
*/
|
||||
virtual bool GetUnnormalizedDescriptor( double y, double x, int orientation, float* descriptor , double *H ) const = 0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
//! @}
|
||||
|
33
modules/xfeatures2d/perf/perf_daisy.cpp
Normal file
33
modules/xfeatures2d/perf/perf_daisy.cpp
Normal file
@@ -0,0 +1,33 @@
|
||||
#include "perf_precomp.hpp"
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace cv::xfeatures2d;
|
||||
using namespace perf;
|
||||
using std::tr1::make_tuple;
|
||||
using std::tr1::get;
|
||||
|
||||
typedef perf::TestBaseWithParam<std::string> daisy;
|
||||
|
||||
#define DAISY_IMAGES \
|
||||
"cv/detectors_descriptors_evaluation/images_datasets/leuven/img1.png",\
|
||||
"stitching/a3.png"
|
||||
|
||||
PERF_TEST_P(daisy, extract, testing::Values(DAISY_IMAGES))
|
||||
{
|
||||
string filename = getDataPath(GetParam());
|
||||
Mat frame = imread(filename, IMREAD_GRAYSCALE);
|
||||
ASSERT_FALSE(frame.empty()) << "Unable to load source image " << filename;
|
||||
|
||||
Mat mask;
|
||||
declare.in(frame).time(90);
|
||||
|
||||
Ptr<DAISY> descriptor = DAISY::create();
|
||||
|
||||
vector<KeyPoint> points;
|
||||
vector<float> descriptors;
|
||||
// compute all daisies in image
|
||||
TEST_CYCLE() descriptor->compute(frame, descriptors);
|
||||
|
||||
SANITY_CHECK(descriptors, 1e-4);
|
||||
}
|
1600
modules/xfeatures2d/src/daisy.cpp
Normal file
1600
modules/xfeatures2d/src/daisy.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1010,6 +1010,13 @@ TEST( Features2d_DescriptorExtractor_SURF, regression )
|
||||
test.safe_run();
|
||||
}
|
||||
|
||||
TEST( Features2d_DescriptorExtractor_DAISY, regression )
|
||||
{
|
||||
CV_DescriptorExtractorTest<L2<float> > test( "descriptor-daisy", 0.05f,
|
||||
DAISY::create() );
|
||||
test.safe_run();
|
||||
}
|
||||
|
||||
TEST( Features2d_DescriptorExtractor_FREAK, regression )
|
||||
{
|
||||
// TODO adjust the parameters below
|
||||
|
@@ -660,6 +660,15 @@ TEST(Features2d_RotationInvariance_Descriptor_LATCH, regression)
|
||||
test.safe_run();
|
||||
}
|
||||
|
||||
TEST(Features2d_RotationInvariance_Descriptor_DAISY, regression)
|
||||
{
|
||||
DescriptorRotationInvarianceTest test(BRISK::create(),
|
||||
DAISY::create(15, 3, 8, 8, DAISY::NRM_NONE, noArray(), true, true),
|
||||
NORM_L1,
|
||||
0.79f);
|
||||
test.safe_run();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Detector's scale invariance check
|
||||
@@ -718,3 +727,12 @@ TEST(Features2d_RotationInvariance2_Detector_SURF, regression)
|
||||
ASSERT_LT( fabs(keypoints[1].response - keypoints[3].response), 1e-6);
|
||||
ASSERT_LT( fabs(keypoints[1].response - keypoints[4].response), 1e-6);
|
||||
}
|
||||
|
||||
TEST(Features2d_ScaleInvariance_Descriptor_DAISY, regression)
|
||||
{
|
||||
DescriptorScaleInvarianceTest test(BRISK::create(),
|
||||
DAISY::create(15, 3, 8, 8, DAISY::NRM_NONE, noArray(), true, true),
|
||||
NORM_L1,
|
||||
0.075f);
|
||||
test.safe_run();
|
||||
}
|
||||
|
Reference in New Issue
Block a user