Merge pull request #1881 from pentschev:defaultNorm_master

pull/1934/merge
Roman Donchenko 11 years ago committed by OpenCV Buildbot
commit e49b8dee40
  1. 3
      modules/features2d/doc/common_interfaces_of_descriptor_extractors.rst
  2. 10
      modules/features2d/include/opencv2/features2d.hpp
  3. 5
      modules/features2d/src/brief.cpp
  4. 6
      modules/features2d/src/brisk.cpp
  5. 5
      modules/features2d/src/descriptors.cpp
  6. 5
      modules/features2d/src/freak.cpp
  7. 5
      modules/features2d/src/orb.cpp
  8. 12
      modules/features2d/test/test_rotation_and_scale_invariance.cpp
  9. 1
      modules/legacy/doc/common_interfaces_of_descriptor_extractors.rst
  10. 1
      modules/legacy/include/opencv2/legacy.hpp
  11. 2
      modules/nonfree/include/opencv2/nonfree/cuda.hpp
  12. 6
      modules/nonfree/include/opencv2/nonfree/features2d.hpp
  13. 2
      modules/nonfree/include/opencv2/nonfree/ocl.hpp
  14. 5
      modules/nonfree/src/sift.cpp
  15. 1
      modules/nonfree/src/surf.cpp
  16. 5
      modules/nonfree/src/surf.cuda.cpp
  17. 5
      modules/nonfree/src/surf.ocl.cpp
  18. 2
      modules/nonfree/test/test_features2d.cpp
  19. 2
      modules/nonfree/test/test_surf.cuda.cpp
  20. 2
      modules/nonfree/test/test_surf.ocl.cpp
  21. 2
      samples/c/find_obj_calonder.cpp
  22. 2
      samples/cpp/brief_match_test.cpp
  23. 5
      samples/cpp/detector_descriptor_evaluation.cpp
  24. 2
      samples/cpp/freak_demo.cpp
  25. 2
      samples/cpp/matcher_simple.cpp
  26. 2
      samples/cpp/shape_transformation.cpp
  27. 2
      samples/cpp/tutorial_code/features2D/SURF_descriptor.cpp
  28. 2
      samples/cpp/video_homography.cpp
  29. 2
      samples/gpu/surf_keypoint_matcher.cpp

@ -35,6 +35,7 @@ Abstract base class for computing descriptors for image keypoints. ::
virtual int descriptorSize() const = 0; virtual int descriptorSize() const = 0;
virtual int descriptorType() const = 0; virtual int descriptorType() const = 0;
virtual int defaultNorm() const = 0;
static Ptr<DescriptorExtractor> create( const String& descriptorExtractorType ); static Ptr<DescriptorExtractor> create( const String& descriptorExtractorType );
@ -114,6 +115,7 @@ them into a single color descriptor. ::
virtual void write( FileStorage& ) const; virtual void write( FileStorage& ) const;
virtual int descriptorSize() const; virtual int descriptorSize() const;
virtual int descriptorType() const; virtual int descriptorType() const;
virtual int defaultNorm() const;
protected: protected:
... ...
}; };
@ -141,6 +143,7 @@ Strecha C., Fua P. *BRIEF: Binary Robust Independent Elementary Features* ,
virtual void write( FileStorage& ) const; virtual void write( FileStorage& ) const;
virtual int descriptorSize() const; virtual int descriptorSize() const;
virtual int descriptorType() const; virtual int descriptorType() const;
virtual int defaultNorm() const;
protected: protected:
... ...
}; };

@ -169,6 +169,7 @@ public:
CV_WRAP virtual int descriptorSize() const = 0; CV_WRAP virtual int descriptorSize() const = 0;
CV_WRAP virtual int descriptorType() const = 0; CV_WRAP virtual int descriptorType() const = 0;
CV_WRAP virtual int defaultNorm() const = 0;
CV_WRAP virtual bool empty() const; CV_WRAP virtual bool empty() const;
@ -226,6 +227,8 @@ public:
int descriptorSize() const; int descriptorSize() const;
// returns the descriptor type // returns the descriptor type
int descriptorType() const; int descriptorType() const;
// returns the default norm type
int defaultNorm() const;
// Compute the BRISK features on an image // Compute the BRISK features on an image
void operator()(InputArray image, InputArray mask, std::vector<KeyPoint>& keypoints) const; void operator()(InputArray image, InputArray mask, std::vector<KeyPoint>& keypoints) const;
@ -320,6 +323,8 @@ public:
int descriptorSize() const; int descriptorSize() const;
// returns the descriptor type // returns the descriptor type
int descriptorType() const; int descriptorType() const;
// returns the default norm type
int defaultNorm() const;
// Compute the ORB features and descriptors on an image // Compute the ORB features and descriptors on an image
void operator()(InputArray image, InputArray mask, std::vector<KeyPoint>& keypoints) const; void operator()(InputArray image, InputArray mask, std::vector<KeyPoint>& keypoints) const;
@ -377,6 +382,9 @@ public:
/** returns the descriptor type */ /** returns the descriptor type */
virtual int descriptorType() const; virtual int descriptorType() const;
/** returns the default norm type */
virtual int defaultNorm() const;
/** select the 512 "best description pairs" /** select the 512 "best description pairs"
* @param images grayscale images set * @param images grayscale images set
* @param keypoints set of detected keypoints * @param keypoints set of detected keypoints
@ -837,6 +845,7 @@ public:
virtual int descriptorSize() const; virtual int descriptorSize() const;
virtual int descriptorType() const; virtual int descriptorType() const;
virtual int defaultNorm() const;
virtual bool empty() const; virtual bool empty() const;
@ -863,6 +872,7 @@ public:
virtual int descriptorSize() const; virtual int descriptorSize() const;
virtual int descriptorType() const; virtual int descriptorType() const;
virtual int defaultNorm() const;
/// @todo read and write for brief /// @todo read and write for brief

@ -125,6 +125,11 @@ int BriefDescriptorExtractor::descriptorType() const
return CV_8UC1; return CV_8UC1;
} }
int BriefDescriptorExtractor::defaultNorm() const
{
return NORM_HAMMING;
}
void BriefDescriptorExtractor::read( const FileNode& fn) void BriefDescriptorExtractor::read( const FileNode& fn)
{ {
int dSize = fn["descriptorSize"]; int dSize = fn["descriptorSize"];

@ -712,6 +712,12 @@ BRISK::descriptorType() const
return CV_8U; return CV_8U;
} }
int
BRISK::defaultNorm() const
{
return NORM_HAMMING;
}
BRISK::~BRISK() BRISK::~BRISK()
{ {
delete[] patternPoints_; delete[] patternPoints_;

@ -247,6 +247,11 @@ int OpponentColorDescriptorExtractor::descriptorType() const
return descriptorExtractor->descriptorType(); return descriptorExtractor->descriptorType();
} }
int OpponentColorDescriptorExtractor::defaultNorm() const
{
return descriptorExtractor->defaultNorm();
}
bool OpponentColorDescriptorExtractor::empty() const bool OpponentColorDescriptorExtractor::empty() const
{ {
return !descriptorExtractor || descriptorExtractor->empty(); return !descriptorExtractor || descriptorExtractor->empty();

@ -676,4 +676,9 @@ int FREAK::descriptorType() const
return CV_8U; return CV_8U;
} }
int FREAK::defaultNorm() const
{
return NORM_HAMMING;
}
} // END NAMESPACE CV } // END NAMESPACE CV

@ -575,6 +575,11 @@ int ORB::descriptorType() const
return CV_8U; return CV_8U;
} }
int ORB::defaultNorm() const
{
return NORM_HAMMING;
}
/** Compute the ORB features and descriptors on an image /** Compute the ORB features and descriptors on an image
* @param img the image to compute the features and descriptors on * @param img the image to compute the features and descriptors on
* @param mask the mask to apply * @param mask the mask to apply

@ -617,7 +617,7 @@ TEST(Features2d_RotationInvariance_Descriptor_BRISK, regression)
{ {
DescriptorRotationInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.BRISK"), DescriptorRotationInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.BRISK"),
Algorithm::create<DescriptorExtractor>("Feature2D.BRISK"), Algorithm::create<DescriptorExtractor>("Feature2D.BRISK"),
NORM_HAMMING, Algorithm::create<DescriptorExtractor>("Feature2D.BRISK")->defaultNorm(),
0.99f); 0.99f);
test.safe_run(); test.safe_run();
} }
@ -626,7 +626,7 @@ TEST(Features2d_RotationInvariance_Descriptor_ORB, regression)
{ {
DescriptorRotationInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.ORB"), DescriptorRotationInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.ORB"),
Algorithm::create<DescriptorExtractor>("Feature2D.ORB"), Algorithm::create<DescriptorExtractor>("Feature2D.ORB"),
NORM_HAMMING, Algorithm::create<DescriptorExtractor>("Feature2D.ORB")->defaultNorm(),
0.99f); 0.99f);
test.safe_run(); test.safe_run();
} }
@ -635,7 +635,7 @@ TEST(Features2d_RotationInvariance_Descriptor_ORB, regression)
//{ //{
// DescriptorRotationInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.ORB"), // DescriptorRotationInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.ORB"),
// Algorithm::create<DescriptorExtractor>("Feature2D.FREAK"), // Algorithm::create<DescriptorExtractor>("Feature2D.FREAK"),
// NORM_HAMMING, // Algorithm::create<DescriptorExtractor>("Feature2D.FREAK")->defaultNorm(),
// 0.f); // 0.f);
// test.safe_run(); // test.safe_run();
//} //}
@ -668,7 +668,7 @@ TEST(Features2d_ScaleInvariance_Detector_BRISK, regression)
//{ //{
// DescriptorScaleInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.BRISK"), // DescriptorScaleInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.BRISK"),
// Algorithm::create<DescriptorExtractor>("Feature2D.BRISK"), // Algorithm::create<DescriptorExtractor>("Feature2D.BRISK"),
// NORM_HAMMING, // Algorithm::create<DescriptorExtractor>("Feature2D.BRISK")->defaultNorm(),
// 0.99f); // 0.99f);
// test.safe_run(); // test.safe_run();
//} //}
@ -677,7 +677,7 @@ TEST(Features2d_ScaleInvariance_Detector_BRISK, regression)
//{ //{
// DescriptorScaleInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.ORB"), // DescriptorScaleInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.ORB"),
// Algorithm::create<DescriptorExtractor>("Feature2D.ORB"), // Algorithm::create<DescriptorExtractor>("Feature2D.ORB"),
// NORM_HAMMING, // Algorithm::create<DescriptorExtractor>("Feature2D.ORB")->defaultNorm(),
// 0.01f); // 0.01f);
// test.safe_run(); // test.safe_run();
//} //}
@ -686,7 +686,7 @@ TEST(Features2d_ScaleInvariance_Detector_BRISK, regression)
//{ //{
// DescriptorScaleInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.ORB"), // DescriptorScaleInvarianceTest test(Algorithm::create<FeatureDetector>("Feature2D.ORB"),
// Algorithm::create<DescriptorExtractor>("Feature2D.FREAK"), // Algorithm::create<DescriptorExtractor>("Feature2D.FREAK"),
// NORM_HAMMING, // Algorithm::create<DescriptorExtractor>("Feature2D.FREAK")->defaultNorm(),
// 0.01f); // 0.01f);
// test.safe_run(); // test.safe_run();
//} //}

@ -28,6 +28,7 @@ Wrapping class for computing descriptors by using the
virtual void write( FileStorage &fs ) const; virtual void write( FileStorage &fs ) const;
virtual int descriptorSize() const; virtual int descriptorSize() const;
virtual int descriptorType() const; virtual int descriptorType() const;
virtual int defaultNorm() const;
protected: protected:
... ...
} }

@ -2765,6 +2765,7 @@ public:
virtual int descriptorSize() const { return classifier_.classes(); } virtual int descriptorSize() const { return classifier_.classes(); }
virtual int descriptorType() const { return DataType<T>::type; } virtual int descriptorType() const { return DataType<T>::type; }
virtual int defaultNorm() const { return NORM_L1; }
virtual bool empty() const; virtual bool empty() const;

@ -70,6 +70,8 @@ public:
//! returns the descriptor size in float's (64 or 128) //! returns the descriptor size in float's (64 or 128)
int descriptorSize() const; int descriptorSize() const;
//! returns the default norm type
int defaultNorm() const;
//! upload host keypoints to device memory //! upload host keypoints to device memory
void uploadKeypoints(const std::vector<KeyPoint>& keypoints, GpuMat& keypointsGPU); void uploadKeypoints(const std::vector<KeyPoint>& keypoints, GpuMat& keypointsGPU);

@ -66,6 +66,9 @@ public:
//! returns the descriptor type //! returns the descriptor type
CV_WRAP int descriptorType() const; CV_WRAP int descriptorType() const;
//! returns the default norm type
CV_WRAP int defaultNorm() const;
//! finds the keypoints using SIFT algorithm //! finds the keypoints using SIFT algorithm
void operator()(InputArray img, InputArray mask, void operator()(InputArray img, InputArray mask,
std::vector<KeyPoint>& keypoints) const; std::vector<KeyPoint>& keypoints) const;
@ -118,6 +121,9 @@ public:
//! returns the descriptor type //! returns the descriptor type
CV_WRAP int descriptorType() const; CV_WRAP int descriptorType() const;
//! returns the descriptor type
CV_WRAP int defaultNorm() const;
//! finds the keypoints using fast hessian detector used in SURF //! finds the keypoints using fast hessian detector used in SURF
void operator()(InputArray img, InputArray mask, void operator()(InputArray img, InputArray mask,
CV_OUT std::vector<KeyPoint>& keypoints) const; CV_OUT std::vector<KeyPoint>& keypoints) const;

@ -76,6 +76,8 @@ namespace cv
//! returns the descriptor size in float's (64 or 128) //! returns the descriptor size in float's (64 or 128)
int descriptorSize() const; int descriptorSize() const;
//! returns the default norm type
int defaultNorm() const;
//! upload host keypoints to device memory //! upload host keypoints to device memory
void uploadKeypoints(const std::vector<cv::KeyPoint> &keypoints, oclMat &keypointsocl); void uploadKeypoints(const std::vector<cv::KeyPoint> &keypoints, oclMat &keypointsocl);
//! download keypoints from device to host memory //! download keypoints from device to host memory

@ -717,6 +717,11 @@ int SIFT::descriptorType() const
return CV_32F; return CV_32F;
} }
int SIFT::defaultNorm() const
{
return NORM_L2;
}
void SIFT::operator()(InputArray _image, InputArray _mask, void SIFT::operator()(InputArray _image, InputArray _mask,
std::vector<KeyPoint>& keypoints) const std::vector<KeyPoint>& keypoints) const

@ -884,6 +884,7 @@ SURF::SURF(double _threshold, int _nOctaves, int _nOctaveLayers, bool _extended,
int SURF::descriptorSize() const { return extended ? 128 : 64; } int SURF::descriptorSize() const { return extended ? 128 : 64; }
int SURF::descriptorType() const { return CV_32F; } int SURF::descriptorType() const { return CV_32F; }
int SURF::defaultNorm() const { return NORM_L2; }
void SURF::operator()(InputArray imgarg, InputArray maskarg, void SURF::operator()(InputArray imgarg, InputArray maskarg,
CV_OUT std::vector<KeyPoint>& keypoints) const CV_OUT std::vector<KeyPoint>& keypoints) const

@ -265,6 +265,11 @@ int cv::cuda::SURF_CUDA::descriptorSize() const
return extended ? 128 : 64; return extended ? 128 : 64;
} }
int cv::cuda::SURF_CUDA::defaultNorm() const
{
return NORM_L2;
}
void cv::cuda::SURF_CUDA::uploadKeypoints(const std::vector<KeyPoint>& keypoints, GpuMat& keypointsGPU) void cv::cuda::SURF_CUDA::uploadKeypoints(const std::vector<KeyPoint>& keypoints, GpuMat& keypointsGPU)
{ {
if (keypoints.empty()) if (keypoints.empty())

@ -299,6 +299,11 @@ int cv::ocl::SURF_OCL::descriptorSize() const
return extended ? 128 : 64; return extended ? 128 : 64;
} }
int cv::ocl::SURF_OCL::defaultNorm() const
{
return NORM_L2;
}
void cv::ocl::SURF_OCL::uploadKeypoints(const std::vector<KeyPoint> &keypoints, oclMat &keypointsGPU) void cv::ocl::SURF_OCL::uploadKeypoints(const std::vector<KeyPoint> &keypoints, oclMat &keypointsGPU)
{ {
if (keypoints.empty()) if (keypoints.empty())

@ -1124,7 +1124,7 @@ protected:
CV_Assert(kpt2[i].response > 0 ); CV_Assert(kpt2[i].response > 0 );
vector<DMatch> matches; vector<DMatch> matches;
BFMatcher(NORM_L2, true).match(d1, d2, matches); BFMatcher(f->defaultNorm(), true).match(d1, d2, matches);
vector<Point2f> pt1, pt2; vector<Point2f> pt1, pt2;
for( size_t i = 0; i < matches.size(); i++ ) { for( size_t i = 0; i < matches.size(); i++ ) {

@ -176,7 +176,7 @@ CUDA_TEST_P(SURF, Descriptor)
cv::Mat descriptors_gold; cv::Mat descriptors_gold;
surf_gold(image, cv::noArray(), keypoints, descriptors_gold, true); surf_gold(image, cv::noArray(), keypoints, descriptors_gold, true);
cv::BFMatcher matcher(cv::NORM_L2); cv::BFMatcher matcher(surf.defaultNorm());
std::vector<cv::DMatch> matches; std::vector<cv::DMatch> matches;
matcher.match(descriptors_gold, cv::Mat(descriptors), matches); matcher.match(descriptors_gold, cv::Mat(descriptors), matches);

@ -195,7 +195,7 @@ TEST_P(SURF, DISABLED_Descriptor)
cv::Mat descriptors_gold; cv::Mat descriptors_gold;
surf_gold(image, cv::noArray(), keypoints, descriptors_gold, true); surf_gold(image, cv::noArray(), keypoints, descriptors_gold, true);
cv::BFMatcher matcher(cv::NORM_L2); cv::BFMatcher matcher(surf.defaultNorm());
std::vector<cv::DMatch> matches; std::vector<cv::DMatch> matches;
matcher.match(descriptors_gold, cv::Mat(descriptors), matches); matcher.match(descriptors_gold, cv::Mat(descriptors), matches);

@ -125,7 +125,7 @@ static void testCalonderClassifier( const string& classifierFilename, const stri
Mat descriptors2; de.compute( img2, keypoints2, descriptors2 ); Mat descriptors2; de.compute( img2, keypoints2, descriptors2 );
// Match descriptors // Match descriptors
BFMatcher matcher(NORM_L1); BFMatcher matcher(de.defaultNorm());
vector<DMatch> matches; vector<DMatch> matches;
matcher.match( descriptors1, descriptors2, matches ); matcher.match( descriptors1, descriptors2, matches );

@ -106,7 +106,7 @@ int main(int argc, const char ** argv)
//Do matching using features2d //Do matching using features2d
cout << "matching with BruteForceMatcher<Hamming>" << endl; cout << "matching with BruteForceMatcher<Hamming>" << endl;
BFMatcher matcher_popcount(NORM_HAMMING); BFMatcher matcher_popcount(extractor.defaultNorm());
vector<DMatch> matches_popcount; vector<DMatch> matches_popcount;
double pop_time = match(kpts_1, kpts_2, matcher_popcount, desc_1, desc_2, matches_popcount); double pop_time = match(kpts_1, kpts_2, matcher_popcount, desc_1, desc_2, matches_popcount);
cout << "done BruteForceMatcher<Hamming> matching. took " << pop_time << " seconds" << endl; cout << "done BruteForceMatcher<Hamming> matching. took " << pop_time << " seconds" << endl;

@ -881,9 +881,10 @@ public:
virtual void readAlgorithm( ) virtual void readAlgorithm( )
{ {
string classifierFile = data_path + "/features2d/calonder_classifier.rtc"; string classifierFile = data_path + "/features2d/calonder_classifier.rtc";
Ptr<DescriptorExtractor> extractor = makePtr<CalonderDescriptorExtractor<float> >( classifierFile );
defaultDescMatcher = makePtr<VectorDescriptorMatch>( defaultDescMatcher = makePtr<VectorDescriptorMatch>(
makePtr<CalonderDescriptorExtractor<float> >( classifierFile ), extractor,
makePtr<BFMatcher>(int(NORM_L2))); makePtr<BFMatcher>(extractor->defaultNorm()));
specificDescMatcher = defaultDescMatcher; specificDescMatcher = defaultDescMatcher;
} }
}; };

@ -96,7 +96,7 @@ int main( int argc, char** argv ) {
// The standard Hamming distance can be used such as // The standard Hamming distance can be used such as
// BFMatcher matcher(NORM_HAMMING); // BFMatcher matcher(NORM_HAMMING);
// or the proposed cascade of hamming distance using SSSE3 // or the proposed cascade of hamming distance using SSSE3
BFMatcher matcher(NORM_HAMMING); BFMatcher matcher(extractor.defaultNorm());
// detect // detect
double t = (double)getTickCount(); double t = (double)getTickCount();

@ -44,7 +44,7 @@ int main(int argc, char** argv)
extractor.compute(img2, keypoints2, descriptors2); extractor.compute(img2, keypoints2, descriptors2);
// matching descriptors // matching descriptors
BFMatcher matcher(NORM_L2); BFMatcher matcher(extractor.defaultNorm());
vector<DMatch> matches; vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches); matcher.match(descriptors1, descriptors2, matches);

@ -45,7 +45,7 @@ int main(int argc, char** argv)
extractor.compute(img2, keypoints2, descriptors2); extractor.compute(img2, keypoints2, descriptors2);
// matching descriptors // matching descriptors
BFMatcher matcher(NORM_L2); BFMatcher matcher(extractor.defaultNorm());
vector<DMatch> matches; vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches); matcher.match(descriptors1, descriptors2, matches);

@ -49,7 +49,7 @@ int main( int argc, char** argv )
extractor.compute( img_2, keypoints_2, descriptors_2 ); extractor.compute( img_2, keypoints_2, descriptors_2 );
//-- Step 3: Matching descriptor vectors with a brute force matcher //-- Step 3: Matching descriptor vectors with a brute force matcher
BFMatcher matcher(NORM_L2); BFMatcher matcher(extractor.defaultNorm());
std::vector< DMatch > matches; std::vector< DMatch > matches;
matcher.match( descriptors_1, descriptors_2, matches ); matcher.match( descriptors_1, descriptors_2, matches );

@ -140,7 +140,7 @@ int main(int ac, char ** av)
vector<DMatch> matches; vector<DMatch> matches;
BFMatcher desc_matcher(NORM_HAMMING); BFMatcher desc_matcher(brief.defaultNorm());
vector<Point2f> train_pts, query_pts; vector<Point2f> train_pts, query_pts;
vector<KeyPoint> train_kpts, query_kpts; vector<KeyPoint> train_kpts, query_kpts;

@ -62,7 +62,7 @@ int main(int argc, char* argv[])
cout << "FOUND " << keypoints2GPU.cols << " keypoints on second image" << endl; cout << "FOUND " << keypoints2GPU.cols << " keypoints on second image" << endl;
// matching descriptors // matching descriptors
BFMatcher_CUDA matcher(NORM_L2); BFMatcher_CUDA matcher(surf.defaultNorm());
GpuMat trainIdx, distance; GpuMat trainIdx, distance;
matcher.matchSingle(descriptors1GPU, descriptors2GPU, trainIdx, distance); matcher.matchSingle(descriptors1GPU, descriptors2GPU, trainIdx, distance);

Loading…
Cancel
Save