Merge pull request #3339 from vpisarev:refactor_features2d_take4
commit
22ff1e8826
57 changed files with 2716 additions and 3311 deletions
@ -1,110 +0,0 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// Intel License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000, Intel Corporation, all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of Intel Corporation may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp" |
||||
#include <limits> |
||||
|
||||
namespace cv |
||||
{ |
||||
|
||||
/****************************************************************************************\
|
||||
* DescriptorExtractor * |
||||
\****************************************************************************************/ |
||||
/*
|
||||
* DescriptorExtractor |
||||
*/ |
||||
DescriptorExtractor::~DescriptorExtractor() |
||||
{} |
||||
|
||||
void DescriptorExtractor::compute( InputArray image, std::vector<KeyPoint>& keypoints, OutputArray descriptors ) const |
||||
{ |
||||
if( image.empty() || keypoints.empty() ) |
||||
{ |
||||
descriptors.release(); |
||||
return; |
||||
} |
||||
|
||||
KeyPointsFilter::runByImageBorder( keypoints, image.size(), 0 ); |
||||
KeyPointsFilter::runByKeypointSize( keypoints, std::numeric_limits<float>::epsilon() ); |
||||
|
||||
computeImpl( image, keypoints, descriptors ); |
||||
} |
||||
|
||||
void DescriptorExtractor::compute( InputArrayOfArrays _imageCollection, std::vector<std::vector<KeyPoint> >& pointCollection, OutputArrayOfArrays _descCollection ) const |
||||
{ |
||||
std::vector<Mat> imageCollection, descCollection; |
||||
_imageCollection.getMatVector(imageCollection); |
||||
_descCollection.getMatVector(descCollection); |
||||
CV_Assert( imageCollection.size() == pointCollection.size() ); |
||||
descCollection.resize( imageCollection.size() ); |
||||
for( size_t i = 0; i < imageCollection.size(); i++ ) |
||||
compute( imageCollection[i], pointCollection[i], descCollection[i] ); |
||||
} |
||||
|
||||
/*void DescriptorExtractor::read( const FileNode& )
|
||||
{} |
||||
|
||||
void DescriptorExtractor::write( FileStorage& ) const |
||||
{}*/ |
||||
|
||||
bool DescriptorExtractor::empty() const |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
void DescriptorExtractor::removeBorderKeypoints( std::vector<KeyPoint>& keypoints, |
||||
Size imageSize, int borderSize ) |
||||
{ |
||||
KeyPointsFilter::runByImageBorder( keypoints, imageSize, borderSize ); |
||||
} |
||||
|
||||
Ptr<DescriptorExtractor> DescriptorExtractor::create(const String& descriptorExtractorType) |
||||
{ |
||||
return Algorithm::create<DescriptorExtractor>("Feature2D." + descriptorExtractorType); |
||||
} |
||||
|
||||
|
||||
CV_WRAP void Feature2D::compute( InputArray image, CV_OUT CV_IN_OUT std::vector<KeyPoint>& keypoints, OutputArray descriptors ) const |
||||
{ |
||||
DescriptorExtractor::compute(image, keypoints, descriptors); |
||||
} |
||||
|
||||
} |
@ -1,161 +0,0 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// Intel License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000, Intel Corporation, all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of Intel Corporation may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp" |
||||
|
||||
namespace cv |
||||
{ |
||||
|
||||
/*
|
||||
* FeatureDetector |
||||
*/ |
||||
|
||||
FeatureDetector::~FeatureDetector() |
||||
{} |
||||
|
||||
void FeatureDetector::detect( InputArray image, std::vector<KeyPoint>& keypoints, InputArray mask ) const |
||||
{ |
||||
keypoints.clear(); |
||||
|
||||
if( image.empty() ) |
||||
return; |
||||
|
||||
CV_Assert( mask.empty() || (mask.type() == CV_8UC1 && mask.size() == image.size()) ); |
||||
|
||||
detectImpl( image, keypoints, mask ); |
||||
} |
||||
|
||||
void FeatureDetector::detect(InputArrayOfArrays _imageCollection, std::vector<std::vector<KeyPoint> >& pointCollection, |
||||
InputArrayOfArrays _masks ) const |
||||
{ |
||||
if (_imageCollection.isUMatVector()) |
||||
{ |
||||
std::vector<UMat> uimageCollection, umasks; |
||||
_imageCollection.getUMatVector(uimageCollection); |
||||
_masks.getUMatVector(umasks); |
||||
|
||||
pointCollection.resize( uimageCollection.size() ); |
||||
for( size_t i = 0; i < uimageCollection.size(); i++ ) |
||||
detect( uimageCollection[i], pointCollection[i], umasks.empty() ? noArray() : umasks[i] ); |
||||
|
||||
return; |
||||
} |
||||
|
||||
std::vector<Mat> imageCollection, masks; |
||||
_imageCollection.getMatVector(imageCollection); |
||||
_masks.getMatVector(masks); |
||||
|
||||
pointCollection.resize( imageCollection.size() ); |
||||
for( size_t i = 0; i < imageCollection.size(); i++ ) |
||||
detect( imageCollection[i], pointCollection[i], masks.empty() ? noArray() : masks[i] ); |
||||
} |
||||
|
||||
/*void FeatureDetector::read( const FileNode& )
|
||||
{} |
||||
|
||||
void FeatureDetector::write( FileStorage& ) const |
||||
{}*/ |
||||
|
||||
bool FeatureDetector::empty() const |
||||
{ |
||||
return false; |
||||
} |
||||
|
||||
void FeatureDetector::removeInvalidPoints( const Mat& mask, std::vector<KeyPoint>& keypoints ) |
||||
{ |
||||
KeyPointsFilter::runByPixelsMask( keypoints, mask ); |
||||
} |
||||
|
||||
Ptr<FeatureDetector> FeatureDetector::create( const String& detectorType ) |
||||
{ |
||||
if( detectorType.compare( "HARRIS" ) == 0 ) |
||||
{ |
||||
Ptr<FeatureDetector> fd = FeatureDetector::create("GFTT"); |
||||
fd->set("useHarrisDetector", true); |
||||
return fd; |
||||
} |
||||
|
||||
return Algorithm::create<FeatureDetector>("Feature2D." + detectorType); |
||||
} |
||||
|
||||
|
||||
GFTTDetector::GFTTDetector( int _nfeatures, double _qualityLevel, |
||||
double _minDistance, int _blockSize, |
||||
bool _useHarrisDetector, double _k ) |
||||
: nfeatures(_nfeatures), qualityLevel(_qualityLevel), minDistance(_minDistance), |
||||
blockSize(_blockSize), useHarrisDetector(_useHarrisDetector), k(_k) |
||||
{ |
||||
} |
||||
|
||||
void GFTTDetector::detectImpl( InputArray _image, std::vector<KeyPoint>& keypoints, InputArray _mask) const |
||||
{ |
||||
std::vector<Point2f> corners; |
||||
|
||||
if (_image.isUMat()) |
||||
{ |
||||
UMat ugrayImage; |
||||
if( _image.type() != CV_8U ) |
||||
cvtColor( _image, ugrayImage, COLOR_BGR2GRAY ); |
||||
else |
||||
ugrayImage = _image.getUMat(); |
||||
|
||||
goodFeaturesToTrack( ugrayImage, corners, nfeatures, qualityLevel, minDistance, _mask, |
||||
blockSize, useHarrisDetector, k ); |
||||
} |
||||
else |
||||
{ |
||||
Mat image = _image.getMat(), grayImage = image; |
||||
if( image.type() != CV_8U ) |
||||
cvtColor( image, grayImage, COLOR_BGR2GRAY ); |
||||
|
||||
goodFeaturesToTrack( grayImage, corners, nfeatures, qualityLevel, minDistance, _mask, |
||||
blockSize, useHarrisDetector, k ); |
||||
} |
||||
|
||||
keypoints.resize(corners.size()); |
||||
std::vector<Point2f>::const_iterator corner_it = corners.begin(); |
||||
std::vector<KeyPoint>::iterator keypoint_it = keypoints.begin(); |
||||
for( ; corner_it != corners.end(); ++corner_it, ++keypoint_it ) |
||||
*keypoint_it = KeyPoint( *corner_it, (float)blockSize ); |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,169 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp" |
||||
|
||||
namespace cv |
||||
{ |
||||
|
||||
using std::vector; |
||||
|
||||
Feature2D::~Feature2D() {} |
||||
|
||||
/*
|
||||
* Detect keypoints in an image. |
||||
* image The image. |
||||
* keypoints The detected keypoints. |
||||
* mask Mask specifying where to look for keypoints (optional). Must be a char |
||||
* matrix with non-zero values in the region of interest. |
||||
*/ |
||||
void Feature2D::detect( InputArray image, |
||||
std::vector<KeyPoint>& keypoints, |
||||
InputArray mask ) |
||||
{ |
||||
if( image.empty() ) |
||||
{ |
||||
keypoints.clear(); |
||||
return; |
||||
} |
||||
detectAndCompute(image, mask, keypoints, noArray(), false); |
||||
} |
||||
|
||||
|
||||
void Feature2D::detect( InputArrayOfArrays _images, |
||||
std::vector<std::vector<KeyPoint> >& keypoints, |
||||
InputArrayOfArrays _masks ) |
||||
{ |
||||
vector<Mat> images, masks; |
||||
|
||||
_images.getMatVector(images); |
||||
size_t i, nimages = images.size(); |
||||
|
||||
if( !_masks.empty() ) |
||||
{ |
||||
_masks.getMatVector(masks); |
||||
CV_Assert(masks.size() == nimages); |
||||
} |
||||
|
||||
keypoints.resize(nimages); |
||||
|
||||
for( i = 0; i < nimages; i++ ) |
||||
{ |
||||
detect(images[i], keypoints[i], masks.empty() ? Mat() : masks[i] ); |
||||
} |
||||
} |
||||
|
||||
/*
|
||||
* Compute the descriptors for a set of keypoints in an image. |
||||
* image The image. |
||||
* keypoints The input keypoints. Keypoints for which a descriptor cannot be computed are removed. |
||||
* descriptors Copmputed descriptors. Row i is the descriptor for keypoint i. |
||||
*/ |
||||
void Feature2D::compute( InputArray image, |
||||
std::vector<KeyPoint>& keypoints, |
||||
OutputArray descriptors ) |
||||
{ |
||||
if( image.empty() ) |
||||
{ |
||||
descriptors.release(); |
||||
return; |
||||
} |
||||
detectAndCompute(image, noArray(), keypoints, descriptors, true); |
||||
} |
||||
|
||||
void Feature2D::compute( InputArrayOfArrays _images, |
||||
std::vector<std::vector<KeyPoint> >& keypoints, |
||||
OutputArrayOfArrays _descriptors ) |
||||
{ |
||||
if( !_descriptors.needed() ) |
||||
return; |
||||
|
||||
vector<Mat> images; |
||||
|
||||
_images.getMatVector(images); |
||||
size_t i, nimages = images.size(); |
||||
|
||||
CV_Assert( keypoints.size() == nimages ); |
||||
CV_Assert( _descriptors.kind() == _InputArray::STD_VECTOR_MAT ); |
||||
|
||||
vector<Mat>& descriptors = *(vector<Mat>*)_descriptors.getObj(); |
||||
descriptors.resize(nimages); |
||||
|
||||
for( i = 0; i < nimages; i++ ) |
||||
{ |
||||
compute(images[i], keypoints[i], descriptors[i]); |
||||
} |
||||
} |
||||
|
||||
|
||||
/* Detects keypoints and computes the descriptors */ |
||||
void Feature2D::detectAndCompute( InputArray, InputArray, |
||||
std::vector<KeyPoint>&, |
||||
OutputArray, |
||||
bool ) |
||||
{ |
||||
CV_Error(Error::StsNotImplemented, ""); |
||||
} |
||||
|
||||
int Feature2D::descriptorSize() const |
||||
{ |
||||
return 0; |
||||
} |
||||
|
||||
int Feature2D::descriptorType() const |
||||
{ |
||||
return CV_32F; |
||||
} |
||||
|
||||
int Feature2D::defaultNorm() const |
||||
{ |
||||
int tp = descriptorType(); |
||||
return tp == CV_8U ? NORM_HAMMING : NORM_L2; |
||||
} |
||||
|
||||
// Return true if detector object is empty
|
||||
bool Feature2D::empty() const |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
} |
@ -1,195 +0,0 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp" |
||||
|
||||
using namespace cv; |
||||
|
||||
Ptr<Feature2D> Feature2D::create( const String& feature2DType ) |
||||
{ |
||||
return Algorithm::create<Feature2D>("Feature2D." + feature2DType); |
||||
} |
||||
|
||||
/////////////////////// AlgorithmInfo for various detector & descriptors ////////////////////////////
|
||||
|
||||
/* NOTE!!!
|
||||
All the AlgorithmInfo-related stuff should be in the same file as initModule_features2d(). |
||||
Otherwise, linker may throw away some seemingly unused stuff. |
||||
*/ |
||||
|
||||
CV_INIT_ALGORITHM(BRISK, "Feature2D.BRISK", |
||||
obj.info()->addParam(obj, "thres", obj.threshold); |
||||
obj.info()->addParam(obj, "octaves", obj.octaves)) |
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CV_INIT_ALGORITHM(FastFeatureDetector, "Feature2D.FAST", |
||||
obj.info()->addParam(obj, "threshold", obj.threshold); |
||||
obj.info()->addParam(obj, "nonmaxSuppression", obj.nonmaxSuppression); |
||||
obj.info()->addParam(obj, "type", obj.type)) |
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CV_INIT_ALGORITHM(MSER, "Feature2D.MSER", |
||||
obj.info()->addParam(obj, "delta", obj.delta); |
||||
obj.info()->addParam(obj, "minArea", obj.minArea); |
||||
obj.info()->addParam(obj, "maxArea", obj.maxArea); |
||||
obj.info()->addParam(obj, "maxVariation", obj.maxVariation); |
||||
obj.info()->addParam(obj, "minDiversity", obj.minDiversity); |
||||
obj.info()->addParam(obj, "maxEvolution", obj.maxEvolution); |
||||
obj.info()->addParam(obj, "areaThreshold", obj.areaThreshold); |
||||
obj.info()->addParam(obj, "minMargin", obj.minMargin); |
||||
obj.info()->addParam(obj, "edgeBlurSize", obj.edgeBlurSize)) |
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CV_INIT_ALGORITHM(ORB, "Feature2D.ORB", |
||||
obj.info()->addParam(obj, "nFeatures", obj.nfeatures); |
||||
obj.info()->addParam(obj, "scaleFactor", obj.scaleFactor); |
||||
obj.info()->addParam(obj, "nLevels", obj.nlevels); |
||||
obj.info()->addParam(obj, "firstLevel", obj.firstLevel); |
||||
obj.info()->addParam(obj, "edgeThreshold", obj.edgeThreshold); |
||||
obj.info()->addParam(obj, "patchSize", obj.patchSize); |
||||
obj.info()->addParam(obj, "WTA_K", obj.WTA_K); |
||||
obj.info()->addParam(obj, "scoreType", obj.scoreType); |
||||
obj.info()->addParam(obj, "fastThreshold", obj.fastThreshold)) |
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CV_INIT_ALGORITHM(GFTTDetector, "Feature2D.GFTT", |
||||
obj.info()->addParam(obj, "nfeatures", obj.nfeatures); |
||||
obj.info()->addParam(obj, "qualityLevel", obj.qualityLevel); |
||||
obj.info()->addParam(obj, "minDistance", obj.minDistance); |
||||
obj.info()->addParam(obj, "useHarrisDetector", obj.useHarrisDetector); |
||||
obj.info()->addParam(obj, "k", obj.k)) |
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CV_INIT_ALGORITHM(KAZE, "Feature2D.KAZE", |
||||
obj.info()->addParam(obj, "upright", obj.upright); |
||||
obj.info()->addParam(obj, "extended", obj.extended); |
||||
obj.info()->addParam(obj, "threshold", obj.threshold); |
||||
obj.info()->addParam(obj, "octaves", obj.octaves); |
||||
obj.info()->addParam(obj, "sublevels", obj.sublevels); |
||||
obj.info()->addParam(obj, "diffusivity", obj.diffusivity)) |
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CV_INIT_ALGORITHM(AKAZE, "Feature2D.AKAZE", |
||||
obj.info()->addParam(obj, "descriptor", obj.descriptor); |
||||
obj.info()->addParam(obj, "descriptor_channels", obj.descriptor_channels); |
||||
obj.info()->addParam(obj, "descriptor_size", obj.descriptor_size); |
||||
obj.info()->addParam(obj, "threshold", obj.threshold); |
||||
obj.info()->addParam(obj, "octaves", obj.octaves); |
||||
obj.info()->addParam(obj, "sublevels", obj.sublevels); |
||||
obj.info()->addParam(obj, "diffusivity", obj.diffusivity)) |
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
CV_INIT_ALGORITHM(SimpleBlobDetector, "Feature2D.SimpleBlob", |
||||
obj.info()->addParam(obj, "thresholdStep", obj.params.thresholdStep); |
||||
obj.info()->addParam(obj, "minThreshold", obj.params.minThreshold); |
||||
obj.info()->addParam(obj, "maxThreshold", obj.params.maxThreshold); |
||||
obj.info()->addParam_(obj, "minRepeatability", (sizeof(size_t) == sizeof(uint64))?Param::UINT64 : Param::UNSIGNED_INT, &obj.params.minRepeatability, false, 0, 0); |
||||
obj.info()->addParam(obj, "minDistBetweenBlobs", obj.params.minDistBetweenBlobs); |
||||
obj.info()->addParam(obj, "filterByColor", obj.params.filterByColor); |
||||
obj.info()->addParam(obj, "blobColor", obj.params.blobColor); |
||||
obj.info()->addParam(obj, "filterByArea", obj.params.filterByArea); |
||||
obj.info()->addParam(obj, "maxArea", obj.params.maxArea); |
||||
obj.info()->addParam(obj, "filterByCircularity", obj.params.filterByCircularity); |
||||
obj.info()->addParam(obj, "maxCircularity", obj.params.maxCircularity); |
||||
obj.info()->addParam(obj, "filterByInertia", obj.params.filterByInertia); |
||||
obj.info()->addParam(obj, "maxInertiaRatio", obj.params.maxInertiaRatio); |
||||
obj.info()->addParam(obj, "filterByConvexity", obj.params.filterByConvexity); |
||||
obj.info()->addParam(obj, "maxConvexity", obj.params.maxConvexity); |
||||
) |
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class CV_EXPORTS HarrisDetector : public GFTTDetector |
||||
{ |
||||
public: |
||||
HarrisDetector( int maxCorners=1000, double qualityLevel=0.01, double minDistance=1, |
||||
int blockSize=3, bool useHarrisDetector=true, double k=0.04 ); |
||||
AlgorithmInfo* info() const; |
||||
}; |
||||
|
||||
inline HarrisDetector::HarrisDetector( int _maxCorners, double _qualityLevel, double _minDistance, |
||||
int _blockSize, bool _useHarrisDetector, double _k ) |
||||
: GFTTDetector( _maxCorners, _qualityLevel, _minDistance, _blockSize, _useHarrisDetector, _k ) {} |
||||
|
||||
CV_INIT_ALGORITHM(HarrisDetector, "Feature2D.HARRIS", |
||||
obj.info()->addParam(obj, "nfeatures", obj.nfeatures); |
||||
obj.info()->addParam(obj, "qualityLevel", obj.qualityLevel); |
||||
obj.info()->addParam(obj, "minDistance", obj.minDistance); |
||||
obj.info()->addParam(obj, "useHarrisDetector", obj.useHarrisDetector); |
||||
obj.info()->addParam(obj, "k", obj.k)) |
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CV_INIT_ALGORITHM(BFMatcher, "DescriptorMatcher.BFMatcher", |
||||
obj.info()->addParam(obj, "normType", obj.normType); |
||||
obj.info()->addParam(obj, "crossCheck", obj.crossCheck)) |
||||
|
||||
CV_INIT_ALGORITHM(FlannBasedMatcher, "DescriptorMatcher.FlannBasedMatcher",) |
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool cv::initModule_features2d(void) |
||||
{ |
||||
bool all = true; |
||||
all &= !BRISK_info_auto.name().empty(); |
||||
all &= !FastFeatureDetector_info_auto.name().empty(); |
||||
all &= !MSER_info_auto.name().empty(); |
||||
all &= !ORB_info_auto.name().empty(); |
||||
all &= !GFTTDetector_info_auto.name().empty(); |
||||
all &= !KAZE_info_auto.name().empty(); |
||||
all &= !AKAZE_info_auto.name().empty(); |
||||
all &= !HarrisDetector_info_auto.name().empty(); |
||||
all &= !BFMatcher_info_auto.name().empty(); |
||||
all &= !FlannBasedMatcher_info_auto.name().empty(); |
||||
|
||||
return all; |
||||
} |
@ -0,0 +1,126 @@ |
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// Intel License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000, Intel Corporation, all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of Intel Corporation may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp" |
||||
|
||||
namespace cv |
||||
{ |
||||
|
||||
class GFTTDetector_Impl : public GFTTDetector |
||||
{ |
||||
public: |
||||
GFTTDetector_Impl( int _nfeatures, double _qualityLevel, |
||||
double _minDistance, int _blockSize, |
||||
bool _useHarrisDetector, double _k ) |
||||
: nfeatures(_nfeatures), qualityLevel(_qualityLevel), minDistance(_minDistance), |
||||
blockSize(_blockSize), useHarrisDetector(_useHarrisDetector), k(_k) |
||||
{ |
||||
} |
||||
|
||||
void set(int prop, double value) |
||||
{ |
||||
if( prop == USE_HARRIS_DETECTOR ) |
||||
useHarrisDetector = value != 0; |
||||
else |
||||
CV_Error(Error::StsBadArg, ""); |
||||
} |
||||
|
||||
double get(int prop) const |
||||
{ |
||||
double value = 0; |
||||
if( prop == USE_HARRIS_DETECTOR ) |
||||
value = useHarrisDetector; |
||||
else |
||||
CV_Error(Error::StsBadArg, ""); |
||||
return value; |
||||
} |
||||
|
||||
void detect( InputArray _image, std::vector<KeyPoint>& keypoints, InputArray _mask ) |
||||
{ |
||||
std::vector<Point2f> corners; |
||||
|
||||
if (_image.isUMat()) |
||||
{ |
||||
UMat ugrayImage; |
||||
if( _image.type() != CV_8U ) |
||||
cvtColor( _image, ugrayImage, COLOR_BGR2GRAY ); |
||||
else |
||||
ugrayImage = _image.getUMat(); |
||||
|
||||
goodFeaturesToTrack( ugrayImage, corners, nfeatures, qualityLevel, minDistance, _mask, |
||||
blockSize, useHarrisDetector, k ); |
||||
} |
||||
else |
||||
{ |
||||
Mat image = _image.getMat(), grayImage = image; |
||||
if( image.type() != CV_8U ) |
||||
cvtColor( image, grayImage, COLOR_BGR2GRAY ); |
||||
|
||||
goodFeaturesToTrack( grayImage, corners, nfeatures, qualityLevel, minDistance, _mask, |
||||
blockSize, useHarrisDetector, k ); |
||||
} |
||||
|
||||
keypoints.resize(corners.size()); |
||||
std::vector<Point2f>::const_iterator corner_it = corners.begin(); |
||||
std::vector<KeyPoint>::iterator keypoint_it = keypoints.begin(); |
||||
for( ; corner_it != corners.end(); ++corner_it, ++keypoint_it ) |
||||
*keypoint_it = KeyPoint( *corner_it, (float)blockSize ); |
||||
|
||||
} |
||||
|
||||
int nfeatures; |
||||
double qualityLevel; |
||||
double minDistance; |
||||
int blockSize; |
||||
bool useHarrisDetector; |
||||
double k; |
||||
}; |
||||
|
||||
|
||||
Ptr<GFTTDetector> GFTTDetector::create( int _nfeatures, double _qualityLevel, |
||||
double _minDistance, int _blockSize, |
||||
bool _useHarrisDetector, double _k ) |
||||
{ |
||||
return makePtr<GFTTDetector_Impl>(_nfeatures, _qualityLevel, |
||||
_minDistance, _blockSize, _useHarrisDetector, _k); |
||||
} |
||||
|
||||
} |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue