Update PR after mdim review.

pull/1290/head
Mathieu Barnachon 12 years ago
parent 43c9818895
commit 464985205c
  1. 7
      modules/features2d/doc/object_categorization.rst
  2. 38
      modules/features2d/include/opencv2/features2d.hpp
  3. 85
      modules/features2d/src/bagofwords.cpp

@ -118,6 +118,7 @@ The class declaration is the following: ::
public: public:
BOWImgDescriptorExtractor( const Ptr<DescriptorExtractor>& dextractor, BOWImgDescriptorExtractor( const Ptr<DescriptorExtractor>& dextractor,
const Ptr<DescriptorMatcher>& dmatcher ); const Ptr<DescriptorMatcher>& dmatcher );
BOWImgDescriptorExtractor( const Ptr<DescriptorMatcher>& dmatcher );
virtual ~BOWImgDescriptorExtractor(){} virtual ~BOWImgDescriptorExtractor(){}
void setVocabulary( const Mat& vocabulary ); void setVocabulary( const Mat& vocabulary );
@ -126,6 +127,8 @@ The class declaration is the following: ::
Mat& imgDescriptor, Mat& imgDescriptor,
vector<vector<int> >* pointIdxsOfClusters=0, vector<vector<int> >* pointIdxsOfClusters=0,
Mat* descriptors=0 ); Mat* descriptors=0 );
void compute( const Mat& descriptors, Mat& imgDescriptor,
std::vector<std::vector<int> >* pointIdxsOfClusters=0 );
int descriptorSize() const; int descriptorSize() const;
int descriptorType() const; int descriptorType() const;
@ -141,6 +144,7 @@ BOWImgDescriptorExtractor::BOWImgDescriptorExtractor
The constructor. The constructor.
.. ocv:function:: BOWImgDescriptorExtractor::BOWImgDescriptorExtractor( const Ptr<DescriptorExtractor>& dextractor, const Ptr<DescriptorMatcher>& dmatcher ) .. ocv:function:: BOWImgDescriptorExtractor::BOWImgDescriptorExtractor( const Ptr<DescriptorExtractor>& dextractor, const Ptr<DescriptorMatcher>& dmatcher )
.. ocv:function:: BOWImgDescriptorExtractor::BOWImgDescriptorExtractor( const Ptr<DescriptorMatcher>& dmatcher )
:param dextractor: Descriptor extractor that is used to compute descriptors for an input image and its keypoints. :param dextractor: Descriptor extractor that is used to compute descriptors for an input image and its keypoints.
@ -171,11 +175,14 @@ BOWImgDescriptorExtractor::compute
Computes an image descriptor using the set visual vocabulary. Computes an image descriptor using the set visual vocabulary.
.. ocv:function:: void BOWImgDescriptorExtractor::compute( const Mat& image, vector<KeyPoint>& keypoints, Mat& imgDescriptor, vector<vector<int> >* pointIdxsOfClusters=0, Mat* descriptors=0 ) .. ocv:function:: void BOWImgDescriptorExtractor::compute( const Mat& image, vector<KeyPoint>& keypoints, Mat& imgDescriptor, vector<vector<int> >* pointIdxsOfClusters=0, Mat* descriptors=0 )
.. ocv:function:: void BOWImgDescriptorExtractor::compute( const Mat& descriptors, Mat& imgDescriptor, std::vector<std::vector<int> >* pointIdxsOfClusters )
:param image: Image, for which the descriptor is computed. :param image: Image, for which the descriptor is computed.
:param keypoints: Keypoints detected in the input image. :param keypoints: Keypoints detected in the input image.
:param descriptors: Computed descriptors to match with vocabulary.
:param imgDescriptor: Computed output image descriptor. :param imgDescriptor: Computed output image descriptor.
:param pointIdxsOfClusters: Indices of keypoints that belong to the cluster. This means that ``pointIdxsOfClusters[i]`` are keypoint indices that belong to the ``i`` -th cluster (word of vocabulary) returned if it is non-zero. :param pointIdxsOfClusters: Indices of keypoints that belong to the cluster. This means that ``pointIdxsOfClusters[i]`` are keypoint indices that belong to the ``i`` -th cluster (word of vocabulary) returned if it is non-zero.

@ -1502,12 +1502,15 @@ class CV_EXPORTS BOWImgDescriptorExtractor
public: public:
BOWImgDescriptorExtractor( const Ptr<DescriptorExtractor>& dextractor, BOWImgDescriptorExtractor( const Ptr<DescriptorExtractor>& dextractor,
const Ptr<DescriptorMatcher>& dmatcher ); const Ptr<DescriptorMatcher>& dmatcher );
BOWImgDescriptorExtractor( const Ptr<DescriptorMatcher>& dmatcher );
virtual ~BOWImgDescriptorExtractor(); virtual ~BOWImgDescriptorExtractor();
void setVocabulary( const Mat& vocabulary ); void setVocabulary( const Mat& vocabulary );
const Mat& getVocabulary() const; const Mat& getVocabulary() const;
void compute( const Mat& image, std::vector<KeyPoint>& keypoints, Mat& imgDescriptor, void compute( const Mat& image, std::vector<KeyPoint>& keypoints, Mat& imgDescriptor,
std::vector<std::vector<int> >* pointIdxsOfClusters=0, Mat* descriptors=0 ); std::vector<std::vector<int> >* pointIdxsOfClusters=0, Mat* descriptors=0 );
void compute( const Mat& keypointDescriptors, Mat& imgDescriptor,
std::vector<std::vector<int> >* pointIdxsOfClusters=0 );
// compute() is not constant because DescriptorMatcher::match is not constant // compute() is not constant because DescriptorMatcher::match is not constant
int descriptorSize() const; int descriptorSize() const;
@ -1519,41 +1522,6 @@ protected:
Ptr<DescriptorMatcher> dmatcher; Ptr<DescriptorMatcher> dmatcher;
}; };
/*
* Class to match image descriptors using bag of visual words.
*/
class CV_EXPORTS BOWImgDescriptorMatcher
{
public:
BOWImgDescriptorMatcher( const Ptr<DescriptorMatcher>& _dmatcher );
virtual ~BOWImgDescriptorMatcher();
/*
* Compute the matching of the current descriptor according to the vocabulary.
*
* vocDescriptor the descriptors to match
* pointIdxsOfClusters vector of matching
*/
void compute( const Mat & descriptors, Mat& vocDescriptor, std::vector< std::vector< int > > * pointIdxsOfClusters = 0 );
/*
* Set the vocabulary
*/
void setVocabulary( const Mat& vocabulary );
const Mat& getVocabulary() const;
int descriptorSize() const;
int descriptorType() const;
protected:
Mat vocabulary;
Ptr<DescriptorMatcher> dmatcher;
private:
int _type;
};
} /* namespace cv */ } /* namespace cv */
#endif #endif

@ -121,6 +121,10 @@ BOWImgDescriptorExtractor::BOWImgDescriptorExtractor( const Ptr<DescriptorExtrac
dextractor(_dextractor), dmatcher(_dmatcher) dextractor(_dextractor), dmatcher(_dmatcher)
{} {}
BOWImgDescriptorExtractor::BOWImgDescriptorExtractor( const Ptr<DescriptorMatcher>& _dmatcher ) :
dmatcher(_dmatcher)
{}
BOWImgDescriptorExtractor::~BOWImgDescriptorExtractor() BOWImgDescriptorExtractor::~BOWImgDescriptorExtractor()
{} {}
@ -144,38 +148,11 @@ void BOWImgDescriptorExtractor::compute( const Mat& image, std::vector<KeyPoint>
if( keypoints.empty() ) if( keypoints.empty() )
return; return;
int clusterCount = descriptorSize(); // = vocabulary.rows
// Compute descriptors for the image. // Compute descriptors for the image.
Mat descriptors; Mat descriptors;
dextractor->compute( image, keypoints, descriptors ); dextractor->compute( image, keypoints, descriptors );
// Match keypoint descriptors to cluster center (to vocabulary) compute( descriptors, imgDescriptor, pointIdxsOfClusters );
std::vector<DMatch> matches;
dmatcher->match( descriptors, matches );
// Compute image descriptor
if( pointIdxsOfClusters )
{
pointIdxsOfClusters->clear();
pointIdxsOfClusters->resize(clusterCount);
}
imgDescriptor = Mat( 1, clusterCount, descriptorType(), Scalar::all(0.0) );
float *dptr = (float*)imgDescriptor.data;
for( size_t i = 0; i < matches.size(); i++ )
{
int queryIdx = matches[i].queryIdx;
int trainIdx = matches[i].trainIdx; // cluster index
CV_Assert( queryIdx == (int)i );
dptr[trainIdx] = dptr[trainIdx] + 1.f;
if( pointIdxsOfClusters )
(*pointIdxsOfClusters)[trainIdx].push_back( queryIdx );
}
// Normalize image descriptor.
imgDescriptor /= descriptors.rows;
// Add the descriptors of image keypoints // Add the descriptors of image keypoints
if (_descriptors) { if (_descriptors) {
@ -193,44 +170,16 @@ int BOWImgDescriptorExtractor::descriptorType() const
return CV_32FC1; return CV_32FC1;
} }
BOWImgDescriptorMatcher::BOWImgDescriptorMatcher( const Ptr<DescriptorMatcher>& _dmatcher ) : void BOWImgDescriptorExtractor::compute( const Mat& descriptors, Mat& imgDescriptor, std::vector<std::vector<int> >* pointIdxsOfClusters )
dmatcher(_dmatcher),
_type( -1 )
{}
BOWImgDescriptorMatcher::~BOWImgDescriptorMatcher()
{}
void BOWImgDescriptorMatcher::setVocabulary( const Mat& _vocabulary )
{
dmatcher->clear();
CV_Assert( _vocabulary.type() == CV_32F );
vocabulary = _vocabulary;
dmatcher->add( std::vector<Mat>(1, vocabulary) );
}
const Mat& BOWImgDescriptorMatcher::getVocabulary() const
{ {
return vocabulary; CV_Assert( vocabulary.empty() != false );
}
void BOWImgDescriptorMatcher::compute( const Mat & descriptors, Mat& vocDescriptor, std::vector<std::vector<int> > * pointIdxsOfClusters )
{
vocDescriptor.release();
int clusterCount = descriptorSize(); // = vocabulary.rows int clusterCount = descriptorSize(); // = vocabulary.rows
_type = descriptors.type();
Mat _descriptors;
if( _type != CV_32F )
descriptors.convertTo( _descriptors, CV_32F );
else
descriptors.copyTo( _descriptors );
// Match keypoint descriptors to cluster center (to vocabulary) // Match keypoint descriptors to cluster center (to vocabulary)
std::vector<DMatch> matches; std::vector<DMatch> matches;
dmatcher->match( _descriptors, matches ); dmatcher->match( descriptors, matches );
// Compute image descriptor // Compute image descriptor
if( pointIdxsOfClusters ) if( pointIdxsOfClusters )
{ {
@ -238,8 +187,8 @@ void BOWImgDescriptorMatcher::compute( const Mat & descriptors, Mat& vocDescript
pointIdxsOfClusters->resize(clusterCount); pointIdxsOfClusters->resize(clusterCount);
} }
vocDescriptor = Mat::zeros( 1, clusterCount, descriptorType() ); imgDescriptor = Mat( 1, clusterCount, descriptorType(), Scalar::all(0.0) );
float *dptr = (float*)vocDescriptor.data; float *dptr = (float*)imgDescriptor.data;
for( size_t i = 0; i < matches.size(); i++ ) for( size_t i = 0; i < matches.size(); i++ )
{ {
int queryIdx = matches[i].queryIdx; int queryIdx = matches[i].queryIdx;
@ -252,17 +201,7 @@ void BOWImgDescriptorMatcher::compute( const Mat & descriptors, Mat& vocDescript
} }
// Normalize image descriptor. // Normalize image descriptor.
vocDescriptor /= descriptors.rows; imgDescriptor /= descriptors.rows;
}
int BOWImgDescriptorMatcher::descriptorSize() const
{
return vocabulary.empty() ? 0 : vocabulary.rows;
}
int BOWImgDescriptorMatcher::descriptorType() const
{
return _type;
} }
} }

Loading…
Cancel
Save