Update PR after mdim review.
This commit is contained in:
parent
43c9818895
commit
464985205c
@ -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,12 +148,34 @@ 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 );
|
||||||
|
|
||||||
|
compute( descriptors, imgDescriptor, pointIdxsOfClusters );
|
||||||
|
|
||||||
|
// Add the descriptors of image keypoints
|
||||||
|
if (_descriptors) {
|
||||||
|
*_descriptors = descriptors.clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int BOWImgDescriptorExtractor::descriptorSize() const
|
||||||
|
{
|
||||||
|
return vocabulary.empty() ? 0 : vocabulary.rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
int BOWImgDescriptorExtractor::descriptorType() const
|
||||||
|
{
|
||||||
|
return CV_32FC1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BOWImgDescriptorExtractor::compute( const Mat& descriptors, Mat& imgDescriptor, std::vector<std::vector<int> >* pointIdxsOfClusters )
|
||||||
|
{
|
||||||
|
CV_Assert( vocabulary.empty() != false );
|
||||||
|
|
||||||
|
int clusterCount = descriptorSize(); // = vocabulary.rows
|
||||||
|
|
||||||
// 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 );
|
||||||
@ -176,93 +202,6 @@ void BOWImgDescriptorExtractor::compute( const Mat& image, std::vector<KeyPoint>
|
|||||||
|
|
||||||
// Normalize image descriptor.
|
// Normalize image descriptor.
|
||||||
imgDescriptor /= descriptors.rows;
|
imgDescriptor /= descriptors.rows;
|
||||||
|
|
||||||
// Add the descriptors of image keypoints
|
|
||||||
if (_descriptors) {
|
|
||||||
*_descriptors = descriptors.clone();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int BOWImgDescriptorExtractor::descriptorSize() const
|
|
||||||
{
|
|
||||||
return vocabulary.empty() ? 0 : vocabulary.rows;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BOWImgDescriptorExtractor::descriptorType() const
|
|
||||||
{
|
|
||||||
return CV_32FC1;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOWImgDescriptorMatcher::BOWImgDescriptorMatcher( const Ptr<DescriptorMatcher>& _dmatcher ) :
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BOWImgDescriptorMatcher::compute( const Mat & descriptors, Mat& vocDescriptor, std::vector<std::vector<int> > * pointIdxsOfClusters )
|
|
||||||
{
|
|
||||||
vocDescriptor.release();
|
|
||||||
|
|
||||||
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)
|
|
||||||
std::vector<DMatch> matches;
|
|
||||||
dmatcher->match( _descriptors, matches );
|
|
||||||
|
|
||||||
// Compute image descriptor
|
|
||||||
if( pointIdxsOfClusters )
|
|
||||||
{
|
|
||||||
pointIdxsOfClusters->clear();
|
|
||||||
pointIdxsOfClusters->resize(clusterCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
vocDescriptor = Mat::zeros( 1, clusterCount, descriptorType() );
|
|
||||||
float *dptr = (float*)vocDescriptor.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.
|
|
||||||
vocDescriptor /= descriptors.rows;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BOWImgDescriptorMatcher::descriptorSize() const
|
|
||||||
{
|
|
||||||
return vocabulary.empty() ? 0 : vocabulary.rows;
|
|
||||||
}
|
|
||||||
|
|
||||||
int BOWImgDescriptorMatcher::descriptorType() const
|
|
||||||
{
|
|
||||||
return _type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user