From 0043fe6fcddf69a95fa231d1fe2699ef7faa1e7e Mon Sep 17 00:00:00 2001 From: Maria Dimashova Date: Mon, 17 May 2010 17:36:58 +0000 Subject: [PATCH] fixed wrapper of sift descriptor --- .../include/opencv2/features2d/features2d.hpp | 48 ++++++------------- modules/features2d/src/sift.cpp | 14 +++--- 2 files changed, 21 insertions(+), 41 deletions(-) diff --git a/modules/features2d/include/opencv2/features2d/features2d.hpp b/modules/features2d/include/opencv2/features2d/features2d.hpp index a530621adb..aa83845c34 100644 --- a/modules/features2d/include/opencv2/features2d/features2d.hpp +++ b/modules/features2d/include/opencv2/features2d/features2d.hpp @@ -171,18 +171,18 @@ CVAPI(CvSeq*) cvGetStarKeypoints( const CvArr* img, CvMemStorage* storage, #ifdef __cplusplus } -// CvAffinePose: defines a parameterized affine transformation of an image patch. -// An image patch is rotated on angle phi (in degrees), then scaled lambda1 times -// along horizontal and lambda2 times along vertical direction, and then rotated again -// on angle (theta - phi). -class CV_EXPORTS CvAffinePose -{ -public: - float phi; - float theta; - float lambda1; - float lambda2; -}; +// CvAffinePose: defines a parameterized affine transformation of an image patch. +// An image patch is rotated on angle phi (in degrees), then scaled lambda1 times +// along horizontal and lambda2 times along vertical direction, and then rotated again +// on angle (theta - phi). +class CV_EXPORTS CvAffinePose +{ +public: + float phi; + float theta; + float lambda1; + float lambda2; +}; namespace cv @@ -249,7 +249,7 @@ public: { static double GET_DEFAULT_MAGNIFICATION() { return 3.0; } static const bool DEFAULT_IS_NORMALIZE = true; - static const int DESCRIPTOR_SIZE = -1; + static const int DESCRIPTOR_SIZE = 128; DescriptorParams() : magnification(GET_DEFAULT_MAGNIFICATION()), isNormalize(DEFAULT_IS_NORMALIZE) {} DescriptorParams( double _magnification, bool _isNormalize ) : magnification(_magnification), isNormalize(_isNormalize) {} @@ -1534,6 +1534,7 @@ void BruteForceMatcher::matchImpl( const Mat& descriptors_1, const Mat assert( mask.empty() || (mask.rows == descriptors_1.rows && mask.cols == descriptors_2.rows) ); + assert( !descriptors_1.empty() && !descriptors_2.empty() ); assert( descriptors_1.cols == descriptors_2.cols ); assert( DataType::type == descriptors_1.type() ); assert( DataType::type == descriptors_2.type() ); @@ -1862,27 +1863,6 @@ protected: vector classIds; }; -// A factory function for creating an arbitrary descriptor matcher at runtime -/*inline GenericDescriptorMatch* createDescriptorMatcher(std::string extractor = "SURF", std::string matcher = "BruteForce") -{ - GenericDescriptorMatch* descriptors = NULL; - - if(matcher.compare("BruteForce") != 0) - { - // only one matcher exists now - return 0; - } - - if(extractor.compare("SURF")) - { - descriptors = new DescriptorMatchVector > >(); - } - else if(extractor.compare("OneWay")) - { - descriptors = new DescriptorMatchOneWay(); - } -}*/ - } #endif /* __cplusplus */ diff --git a/modules/features2d/src/sift.cpp b/modules/features2d/src/sift.cpp index cd45932660..c5c09e96e5 100644 --- a/modules/features2d/src/sift.cpp +++ b/modules/features2d/src/sift.cpp @@ -50,7 +50,7 @@ #include #include -#define log2(a) log((a)) /CV_LOG2 +#define log2(a) (log((a))/CV_LOG2) /* * from sift.hpp of original code @@ -2006,16 +2006,16 @@ SIFT::SIFT( const CommonParams& _commParams, inline KeyPoint vlKeypointToOcv( const VL::Sift::Keypoint& vlKeypoint, float angle ) { - return KeyPoint(vlKeypoint.x, vlKeypoint.y, vlKeypoint.sigma/*??????? or s */, angle, 0, vlKeypoint.o, 0 ); + return KeyPoint(vlKeypoint.x, vlKeypoint.y, vlKeypoint.sigma, angle, 0, vlKeypoint.o, 0 ); } inline void ocvKeypointToVl( const KeyPoint& ocvKeypoint, const VL::Sift& vlSift, - VL::Sift::Keypoint& vlKeypoint, float& angle ) + VL::Sift::Keypoint& vlKeypoint ) { vlKeypoint = vlSift.getKeypoint(ocvKeypoint.pt.x, ocvKeypoint.pt.y, ocvKeypoint.size); - angle = ocvKeypoint.angle; } +// detectors void SIFT::operator()(const Mat& img, const Mat& mask, vector& keypoints) const { @@ -2063,6 +2063,7 @@ void SIFT::operator()(const Mat& img, const Mat& mask, } } +// descriptors void SIFT::operator()(const Mat& img, const Mat& mask, vector& keypoints, Mat& descriptors, @@ -2091,8 +2092,7 @@ void SIFT::operator()(const Mat& img, const Mat& mask, for( int pi = 0 ; iter != keypoints.end(); ++iter, pi++ ) { VL::Sift::Keypoint vlkpt; - float angle; - ocvKeypointToVl( *iter, vlsift, vlkpt, angle); - vlsift.computeKeypointDescriptor((VL::float_t*)descriptors.ptr(pi), vlkpt, angle); + ocvKeypointToVl( *iter, vlsift, vlkpt ); + vlsift.computeKeypointDescriptor((VL::float_t*)descriptors.ptr(pi), vlkpt, iter->angle); } }