提交 1176d4ef 编写于 作者: V Vadim Pisarevsky

fixed some more compile errors and test failures

上级 d36b546d
...@@ -16,24 +16,15 @@ The goal of this tutorial is to learn how to use *features2d* and *calib3d* modu ...@@ -16,24 +16,15 @@ The goal of this tutorial is to learn how to use *features2d* and *calib3d* modu
Mat img2 = imread(argv[2], IMREAD_GRAYSCALE); Mat img2 = imread(argv[2], IMREAD_GRAYSCALE);
#. #.
Detect keypoints in both images. :: Detect keypoints in both images and compute descriptors for each of the keypoints. ::
// detecting keypoints // detecting keypoints
FastFeatureDetector detector(15); Ptr<Feature2D> surf = SURF::create();
vector<KeyPoint> keypoints1; vector<KeyPoint> keypoints1;
detector.detect(img1, keypoints1);
... // do the same for the second image
#.
Compute descriptors for each of the keypoints. ::
// computing descriptors
SurfDescriptorExtractor extractor;
Mat descriptors1; Mat descriptors1;
extractor.compute(img1, keypoints1, descriptors1); surf->detectAndCompute(img1, Mat(), keypoints1, descriptors1);
... // process keypoints from the second image as well ... // do the same for the second image
#. #.
Now, find the closest matches between descriptors from the first image to the second: :: Now, find the closest matches between descriptors from the first image to the second: ::
......
...@@ -65,18 +65,18 @@ Let us break the code down. :: ...@@ -65,18 +65,18 @@ Let us break the code down. ::
We load two images and check if they are loaded correctly.:: We load two images and check if they are loaded correctly.::
// detecting keypoints // detecting keypoints
FastFeatureDetector detector(15); Ptr<FeatureDetector> detector = FastFeatureDetector::create(15);
vector<KeyPoint> keypoints1, keypoints2; vector<KeyPoint> keypoints1, keypoints2;
detector.detect(img1, keypoints1); detector->detect(img1, keypoints1);
detector.detect(img2, keypoints2); detector->detect(img2, keypoints2);
First, we create an instance of a keypoint detector. All detectors inherit the abstract ``FeatureDetector`` interface, but the constructors are algorithm-dependent. The first argument to each detector usually controls the balance between the amount of keypoints and their stability. The range of values is different for different detectors (For instance, *FAST* threshold has the meaning of pixel intensity difference and usually varies in the region *[0,40]*. *SURF* threshold is applied to a Hessian of an image and usually takes on values larger than *100*), so use defaults in case of doubt. :: First, we create an instance of a keypoint detector. All detectors inherit the abstract ``FeatureDetector`` interface, but the constructors are algorithm-dependent. The first argument to each detector usually controls the balance between the amount of keypoints and their stability. The range of values is different for different detectors (For instance, *FAST* threshold has the meaning of pixel intensity difference and usually varies in the region *[0,40]*. *SURF* threshold is applied to a Hessian of an image and usually takes on values larger than *100*), so use defaults in case of doubt. ::
// computing descriptors // computing descriptors
SurfDescriptorExtractor extractor; Ptr<SURF> extractor = SURF::create();
Mat descriptors1, descriptors2; Mat descriptors1, descriptors2;
extractor.compute(img1, keypoints1, descriptors1); extractor->compute(img1, keypoints1, descriptors1);
extractor.compute(img2, keypoints2, descriptors2); extractor->compute(img2, keypoints2, descriptors2);
We create an instance of descriptor extractor. The most of OpenCV descriptors inherit ``DescriptorExtractor`` abstract interface. Then we compute descriptors for each of the keypoints. The output ``Mat`` of the ``DescriptorExtractor::compute`` method contains a descriptor in a row *i* for each *i*-th keypoint. Note that the method can modify the keypoints vector by removing the keypoints such that a descriptor for them is not defined (usually these are the keypoints near image border). The method makes sure that the ouptut keypoints and descriptors are consistent with each other (so that the number of keypoints is equal to the descriptors row count). :: We create an instance of descriptor extractor. The most of OpenCV descriptors inherit ``DescriptorExtractor`` abstract interface. Then we compute descriptors for each of the keypoints. The output ``Mat`` of the ``DescriptorExtractor::compute`` method contains a descriptor in a row *i* for each *i*-th keypoint. Note that the method can modify the keypoints vector by removing the keypoints such that a descriptor for them is not defined (usually these are the keypoints near image border). The method makes sure that the ouptut keypoints and descriptors are consistent with each other (so that the number of keypoints is equal to the descriptors row count). ::
......
...@@ -185,7 +185,7 @@ CV_EXPORTS_W void drawChessboardCorners( InputOutputArray image, Size patternSiz ...@@ -185,7 +185,7 @@ CV_EXPORTS_W void drawChessboardCorners( InputOutputArray image, Size patternSiz
//! finds circles' grid pattern of the specified size in the image //! finds circles' grid pattern of the specified size in the image
CV_EXPORTS_W bool findCirclesGrid( InputArray image, Size patternSize, CV_EXPORTS_W bool findCirclesGrid( InputArray image, Size patternSize,
OutputArray centers, int flags = CALIB_CB_SYMMETRIC_GRID, OutputArray centers, int flags = CALIB_CB_SYMMETRIC_GRID,
const Ptr<FeatureDetector> &blobDetector = makePtr<SimpleBlobDetector>()); const Ptr<FeatureDetector> &blobDetector = SimpleBlobDetector::create());
//! finds intrinsic and extrinsic camera parameters from several fews of a known calibration pattern. //! finds intrinsic and extrinsic camera parameters from several fews of a known calibration pattern.
CV_EXPORTS_W double calibrateCamera( InputArrayOfArrays objectPoints, CV_EXPORTS_W double calibrateCamera( InputArrayOfArrays objectPoints,
......
...@@ -115,7 +115,10 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints, ...@@ -115,7 +115,10 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints,
cv::Mat R, rvec = _rvec.getMat(), tvec = _tvec.getMat(); cv::Mat R, rvec = _rvec.getMat(), tvec = _tvec.getMat();
double f = PnP.compute_pose(R, tvec); double f = PnP.compute_pose(R, tvec);
cv::Rodrigues(R, rvec); cv::Rodrigues(R, rvec);
cameraMatrix.at<double>(0,0) = cameraMatrix.at<double>(1,1) = f; if(cameraMatrix.type() == CV_32F)
cameraMatrix.at<float>(0,0) = cameraMatrix.at<float>(1,1) = f;
else
cameraMatrix.at<double>(0,0) = cameraMatrix.at<double>(1,1) = f;
return true; return true;
} }
else else
......
...@@ -59,100 +59,60 @@ Detects keypoints in an image (first variant) or image set (second variant). ...@@ -59,100 +59,60 @@ Detects keypoints in an image (first variant) or image set (second variant).
:param masks: Masks for each input image specifying where to look for keypoints (optional). ``masks[i]`` is a mask for ``images[i]``. :param masks: Masks for each input image specifying where to look for keypoints (optional). ``masks[i]`` is a mask for ``images[i]``.
FeatureDetector::create
-----------------------
Creates a feature detector by its name.
.. ocv:function:: Ptr<FeatureDetector> FeatureDetector::create( const String& detectorType )
.. ocv:pyfunction:: cv2.FeatureDetector_create(detectorType) -> retval
:param detectorType: Feature detector type.
The following detector types are supported:
* ``"FAST"`` -- :ocv:class:`FastFeatureDetector`
* ``"ORB"`` -- :ocv:class:`ORB`
* ``"BRISK"`` -- :ocv:class:`BRISK`
* ``"MSER"`` -- :ocv:class:`MSER`
* ``"GFTT"`` -- :ocv:class:`GoodFeaturesToTrackDetector`
* ``"HARRIS"`` -- :ocv:class:`GoodFeaturesToTrackDetector` with Harris detector enabled
* ``"SimpleBlob"`` -- :ocv:class:`SimpleBlobDetector`
FastFeatureDetector FastFeatureDetector
------------------- -------------------
.. ocv:class:: FastFeatureDetector : public FeatureDetector .. ocv:class:: FastFeatureDetector : public Feature2D
Wrapping class for feature detection using the Wrapping class for feature detection using the
:ocv:func:`FAST` method. :: :ocv:func:`FAST` method. ::
class FastFeatureDetector : public FeatureDetector class FastFeatureDetector : public Feature2D
{ {
public: public:
FastFeatureDetector( int threshold=1, bool nonmaxSuppression=true, type=FastFeatureDetector::TYPE_9_16 ); static Ptr<FastFeatureDetector> create( int threshold=1, bool nonmaxSuppression=true, type=FastFeatureDetector::TYPE_9_16 );
virtual void read( const FileNode& fn );
virtual void write( FileStorage& fs ) const;
protected:
...
}; };
GoodFeaturesToTrackDetector GFTTDetector
--------------------------- ---------------------------
.. ocv:class:: GoodFeaturesToTrackDetector : public FeatureDetector .. ocv:class:: GFTTDetector : public FeatureDetector
Wrapping class for feature detection using the Wrapping class for feature detection using the
:ocv:func:`goodFeaturesToTrack` function. :: :ocv:func:`goodFeaturesToTrack` function. ::
class GoodFeaturesToTrackDetector : public FeatureDetector class GFTTDetector : public Feature2D
{ {
public: public:
class Params enum { USE_HARRIS_DETECTOR=10000 };
{ static Ptr<GFTTDetector> create( int maxCorners=1000, double qualityLevel=0.01,
public: double minDistance=1, int blockSize=3,
Params( int maxCorners=1000, double qualityLevel=0.01, bool useHarrisDetector=false, double k=0.04 );
double minDistance=1., int blockSize=3,
bool useHarrisDetector=false, double k=0.04 );
void read( const FileNode& fn );
void write( FileStorage& fs ) const;
int maxCorners;
double qualityLevel;
double minDistance;
int blockSize;
bool useHarrisDetector;
double k;
};
GoodFeaturesToTrackDetector( const GoodFeaturesToTrackDetector::Params& params=
GoodFeaturesToTrackDetector::Params() );
GoodFeaturesToTrackDetector( int maxCorners, double qualityLevel,
double minDistance, int blockSize=3,
bool useHarrisDetector=false, double k=0.04 );
virtual void read( const FileNode& fn );
virtual void write( FileStorage& fs ) const;
protected:
...
}; };
MserFeatureDetector MSER
------------------- -------------------
.. ocv:class:: MserFeatureDetector : public FeatureDetector .. ocv:class:: MSER : public Feature2D
Wrapping class for feature detection using the Maximally stable region detector ::
:ocv:class:`MSER` class. ::
class MserFeatureDetector : public FeatureDetector class MSER : public Feature2D
{ {
public: public:
MserFeatureDetector( CvMSERParams params=cvMSERParams() ); enum
MserFeatureDetector( int delta, int minArea, int maxArea, {
double maxVariation, double minDiversity, DELTA=10000, MIN_AREA=10001, MAX_AREA=10002, PASS2_ONLY=10003,
int maxEvolution, double areaThreshold, MAX_EVOLUTION=10004, AREA_THRESHOLD=10005,
double minMargin, int edgeBlurSize ); MIN_MARGIN=10006, EDGE_BLUR_SIZE=10007
virtual void read( const FileNode& fn ); };
virtual void write( FileStorage& fs ) const;
protected: //! the full constructor
... static Ptr<MSER> create( int _delta=5, int _min_area=60, int _max_area=14400,
double _max_variation=0.25, double _min_diversity=.2,
int _max_evolution=200, double _area_threshold=1.01,
double _min_margin=0.003, int _edge_blur_size=5 );
virtual void detectRegions( InputArray image,
std::vector<std::vector<Point> >& msers,
std::vector<Rect>& bboxes ) = 0;
}; };
SimpleBlobDetector SimpleBlobDetector
...@@ -189,10 +149,8 @@ Class for extracting blobs from an image. :: ...@@ -189,10 +149,8 @@ Class for extracting blobs from an image. ::
float minConvexity, maxConvexity; float minConvexity, maxConvexity;
}; };
SimpleBlobDetector(const SimpleBlobDetector::Params &parameters = SimpleBlobDetector::Params()); static Ptr<SimpleBlobDetector> create(const SimpleBlobDetector::Params
&parameters = SimpleBlobDetector::Params());
protected:
...
}; };
The class implements a simple algorithm for extracting blobs from an image: The class implements a simple algorithm for extracting blobs from an image:
......
...@@ -14,11 +14,6 @@ Detects corners using the FAST algorithm ...@@ -14,11 +14,6 @@ Detects corners using the FAST algorithm
.. ocv:function:: void FAST( InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression=true ) .. ocv:function:: void FAST( InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression=true )
.. ocv:function:: void FAST( InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression, int type ) .. ocv:function:: void FAST( InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression, int type )
.. ocv:pyfunction:: cv2.FastFeatureDetector([, threshold[, nonmaxSuppression]]) -> <FastFeatureDetector object>
.. ocv:pyfunction:: cv2.FastFeatureDetector(threshold, nonmaxSuppression, type) -> <FastFeatureDetector object>
.. ocv:pyfunction:: cv2.FastFeatureDetector.detect(image[, mask]) -> keypoints
:param image: grayscale image where keypoints (corners) are detected. :param image: grayscale image where keypoints (corners) are detected.
:param keypoints: keypoints detected on the image. :param keypoints: keypoints detected on the image.
...@@ -55,7 +50,7 @@ Maximally stable extremal region extractor. :: ...@@ -55,7 +50,7 @@ Maximally stable extremal region extractor. ::
// runs the extractor on the specified image; returns the MSERs, // runs the extractor on the specified image; returns the MSERs,
// each encoded as a contour (vector<Point>, see findContours) // each encoded as a contour (vector<Point>, see findContours)
// the optional mask marks the area where MSERs are searched for // the optional mask marks the area where MSERs are searched for
void operator()( const Mat& image, vector<vector<Point> >& msers, const Mat& mask ) const; void detectRegions( InputArray image, vector<vector<Point> >& msers, vector<Rect>& bboxes ) const;
}; };
The class encapsulates all the parameters of the MSER extraction algorithm (see The class encapsulates all the parameters of the MSER extraction algorithm (see
......
...@@ -164,7 +164,13 @@ class CV_EXPORTS_W ORB : public Feature2D ...@@ -164,7 +164,13 @@ class CV_EXPORTS_W ORB : public Feature2D
{ {
public: public:
// the size of the signature in bytes // the size of the signature in bytes
enum { kBytes = 32, HARRIS_SCORE=0, FAST_SCORE=1 }; enum
{
kBytes = 32, HARRIS_SCORE=0, FAST_SCORE=1,
NFEATURES=10000, SCALE_FACTOR=10001, NLEVELS=10002,
EDGE_THRESHOLD=10003, FIRST_LEVEL=10004, WTA_K=10005,
SCORE_TYPE=10006, PATCH_SIZE=10007, FAST_THRESHOLD=10008
};
CV_WRAP static Ptr<ORB> create(int nfeatures = 500, float scaleFactor = 1.2f, int nlevels = 8, int edgeThreshold = 31, CV_WRAP static Ptr<ORB> create(int nfeatures = 500, float scaleFactor = 1.2f, int nlevels = 8, int edgeThreshold = 31,
int firstLevel = 0, int WTA_K=2, int scoreType=ORB::HARRIS_SCORE, int patchSize=31, int fastThreshold = 20); int firstLevel = 0, int WTA_K=2, int scoreType=ORB::HARRIS_SCORE, int patchSize=31, int fastThreshold = 20);
......
...@@ -55,6 +55,24 @@ public: ...@@ -55,6 +55,24 @@ public:
{ {
} }
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 ) void detect( InputArray _image, std::vector<KeyPoint>& keypoints, InputArray _mask )
{ {
std::vector<Point2f> corners; std::vector<Point2f> corners;
......
...@@ -100,12 +100,12 @@ ocl_ICAngles(const UMat& imgbuf, const UMat& layerinfo, ...@@ -100,12 +100,12 @@ ocl_ICAngles(const UMat& imgbuf, const UMat& layerinfo,
static bool static bool
ocl_computeOrbDescriptors(const UMat& imgbuf, const UMat& layerInfo, ocl_computeOrbDescriptors(const UMat& imgbuf, const UMat& layerInfo,
const UMat& keypoints, UMat& desc, const UMat& pattern, const UMat& keypoints, UMat& desc, const UMat& pattern,
int nkeypoints, int dsize, int WTA_K) int nkeypoints, int dsize, int wta_k)
{ {
size_t globalSize[] = {nkeypoints}; size_t globalSize[] = {nkeypoints};
ocl::Kernel desc_ker("ORB_computeDescriptor", ocl::features2d::orb_oclsrc, ocl::Kernel desc_ker("ORB_computeDescriptor", ocl::features2d::orb_oclsrc,
format("-D ORB_DESCRIPTORS -D WTA_K=%d", WTA_K)); format("-D ORB_DESCRIPTORS -D wta_k=%d", wta_k));
if( desc_ker.empty() ) if( desc_ker.empty() )
return false; return false;
...@@ -209,7 +209,7 @@ static void ICAngles(const Mat& img, const std::vector<Rect>& layerinfo, ...@@ -209,7 +209,7 @@ static void ICAngles(const Mat& img, const std::vector<Rect>& layerinfo,
static void static void
computeOrbDescriptors( const Mat& imagePyramid, const std::vector<Rect>& layerInfo, computeOrbDescriptors( const Mat& imagePyramid, const std::vector<Rect>& layerInfo,
const std::vector<float>& layerScale, std::vector<KeyPoint>& keypoints, const std::vector<float>& layerScale, std::vector<KeyPoint>& keypoints,
Mat& descriptors, const std::vector<Point>& _pattern, int dsize, int WTA_K ) Mat& descriptors, const std::vector<Point>& _pattern, int dsize, int wta_k )
{ {
int step = (int)imagePyramid.step; int step = (int)imagePyramid.step;
int j, i, nkeypoints = (int)keypoints.size(); int j, i, nkeypoints = (int)keypoints.size();
...@@ -248,7 +248,7 @@ computeOrbDescriptors( const Mat& imagePyramid, const std::vector<Rect>& layerIn ...@@ -248,7 +248,7 @@ computeOrbDescriptors( const Mat& imagePyramid, const std::vector<Rect>& layerIn
center[iy*step + ix+1]*x*(1-y) + center[(iy+1)*step + ix+1]*x*y)) center[iy*step + ix+1]*x*(1-y) + center[(iy+1)*step + ix+1]*x*y))
#endif #endif
if( WTA_K == 2 ) if( wta_k == 2 )
{ {
for (i = 0; i < dsize; ++i, pattern += 16) for (i = 0; i < dsize; ++i, pattern += 16)
{ {
...@@ -273,7 +273,7 @@ computeOrbDescriptors( const Mat& imagePyramid, const std::vector<Rect>& layerIn ...@@ -273,7 +273,7 @@ computeOrbDescriptors( const Mat& imagePyramid, const std::vector<Rect>& layerIn
desc[i] = (uchar)val; desc[i] = (uchar)val;
} }
} }
else if( WTA_K == 3 ) else if( wta_k == 3 )
{ {
for (i = 0; i < dsize; ++i, pattern += 12) for (i = 0; i < dsize; ++i, pattern += 12)
{ {
...@@ -293,7 +293,7 @@ computeOrbDescriptors( const Mat& imagePyramid, const std::vector<Rect>& layerIn ...@@ -293,7 +293,7 @@ computeOrbDescriptors( const Mat& imagePyramid, const std::vector<Rect>& layerIn
desc[i] = (uchar)val; desc[i] = (uchar)val;
} }
} }
else if( WTA_K == 4 ) else if( wta_k == 4 )
{ {
for (i = 0; i < dsize; ++i, pattern += 16) for (i = 0; i < dsize; ++i, pattern += 16)
{ {
...@@ -334,7 +334,7 @@ computeOrbDescriptors( const Mat& imagePyramid, const std::vector<Rect>& layerIn ...@@ -334,7 +334,7 @@ computeOrbDescriptors( const Mat& imagePyramid, const std::vector<Rect>& layerIn
} }
} }
else else
CV_Error( Error::StsBadSize, "Wrong WTA_K. It can be only 2, 3 or 4." ); CV_Error( Error::StsBadSize, "Wrong wta_k. It can be only 2, 3 or 4." );
#undef GET_VALUE #undef GET_VALUE
} }
} }
...@@ -652,10 +652,60 @@ public: ...@@ -652,10 +652,60 @@ public:
explicit ORB_Impl(int _nfeatures, float _scaleFactor, int _nlevels, int _edgeThreshold, explicit ORB_Impl(int _nfeatures, float _scaleFactor, int _nlevels, int _edgeThreshold,
int _firstLevel, int _WTA_K, int _scoreType, int _patchSize, int _fastThreshold) : int _firstLevel, int _WTA_K, int _scoreType, int _patchSize, int _fastThreshold) :
nfeatures(_nfeatures), scaleFactor(_scaleFactor), nlevels(_nlevels), nfeatures(_nfeatures), scaleFactor(_scaleFactor), nlevels(_nlevels),
edgeThreshold(_edgeThreshold), firstLevel(_firstLevel), WTA_K(_WTA_K), edgeThreshold(_edgeThreshold), firstLevel(_firstLevel), wta_k(_WTA_K),
scoreType(_scoreType), patchSize(_patchSize), fastThreshold(_fastThreshold) scoreType(_scoreType), patchSize(_patchSize), fastThreshold(_fastThreshold)
{} {}
void set(int prop, double value)
{
if( prop == NFEATURES )
nfeatures = cvRound(value);
else if( prop == SCALE_FACTOR )
scaleFactor = value;
else if( prop == NLEVELS )
nlevels = cvRound(value);
else if( prop == EDGE_THRESHOLD )
edgeThreshold = cvRound(value);
else if( prop == FIRST_LEVEL )
firstLevel = cvRound(value);
else if( prop == WTA_K )
wta_k = cvRound(value);
else if( prop == SCORE_TYPE )
scoreType = cvRound(value);
else if( prop == PATCH_SIZE )
patchSize = cvRound(value);
else if( prop == FAST_THRESHOLD )
fastThreshold = cvRound(value);
else
CV_Error(Error::StsBadArg, "");
}
double get(int prop) const
{
double value = 0;
if( prop == NFEATURES )
value = nfeatures;
else if( prop == SCALE_FACTOR )
value = scaleFactor;
else if( prop == NLEVELS )
value = nlevels;
else if( prop == EDGE_THRESHOLD )
value = edgeThreshold;
else if( prop == FIRST_LEVEL )
value = firstLevel;
else if( prop == WTA_K )
value = wta_k;
else if( prop == SCORE_TYPE )
value = scoreType;
else if( prop == PATCH_SIZE )
value = patchSize;
else if( prop == FAST_THRESHOLD )
value = fastThreshold;
else
CV_Error(Error::StsBadArg, "");
return value;
}
// returns the descriptor size in bytes // returns the descriptor size in bytes
int descriptorSize() const; int descriptorSize() const;
// returns the descriptor type // returns the descriptor type
...@@ -674,7 +724,7 @@ protected: ...@@ -674,7 +724,7 @@ protected:
int nlevels; int nlevels;
int edgeThreshold; int edgeThreshold;
int firstLevel; int firstLevel;
int WTA_K; int wta_k;
int scoreType; int scoreType;
int patchSize; int patchSize;
int fastThreshold; int fastThreshold;
...@@ -1097,14 +1147,14 @@ void ORB_Impl::detectAndCompute( InputArray _image, InputArray _mask, ...@@ -1097,14 +1147,14 @@ void ORB_Impl::detectAndCompute( InputArray _image, InputArray _mask,
makeRandomPattern(patchSize, patternbuf, npoints); makeRandomPattern(patchSize, patternbuf, npoints);
} }
CV_Assert( WTA_K == 2 || WTA_K == 3 || WTA_K == 4 ); CV_Assert( wta_k == 2 || wta_k == 3 || wta_k == 4 );
if( WTA_K == 2 ) if( wta_k == 2 )
std::copy(pattern0, pattern0 + npoints, std::back_inserter(pattern)); std::copy(pattern0, pattern0 + npoints, std::back_inserter(pattern));
else else
{ {
int ntuples = descriptorSize()*4; int ntuples = descriptorSize()*4;
initializeOrbPattern(pattern0, pattern, ntuples, WTA_K, npoints); initializeOrbPattern(pattern0, pattern, ntuples, wta_k, npoints);
} }
for( level = 0; level < nLevels; level++ ) for( level = 0; level < nLevels; level++ )
...@@ -1127,7 +1177,7 @@ void ORB_Impl::detectAndCompute( InputArray _image, InputArray _mask, ...@@ -1127,7 +1177,7 @@ void ORB_Impl::detectAndCompute( InputArray _image, InputArray _mask,
UMat udescriptors = _descriptors.getUMat(); UMat udescriptors = _descriptors.getUMat();
useOCL = ocl_computeOrbDescriptors(uimagePyramid, ulayerInfo, useOCL = ocl_computeOrbDescriptors(uimagePyramid, ulayerInfo,
ukeypoints, udescriptors, upattern, ukeypoints, udescriptors, upattern,
nkeypoints, dsize, WTA_K); nkeypoints, dsize, wta_k);
if(useOCL) if(useOCL)
{ {
CV_IMPL_ADD(CV_IMPL_OCL); CV_IMPL_ADD(CV_IMPL_OCL);
...@@ -1138,16 +1188,16 @@ void ORB_Impl::detectAndCompute( InputArray _image, InputArray _mask, ...@@ -1138,16 +1188,16 @@ void ORB_Impl::detectAndCompute( InputArray _image, InputArray _mask,
{ {
Mat descriptors = _descriptors.getMat(); Mat descriptors = _descriptors.getMat();
computeOrbDescriptors(imagePyramid, layerInfo, layerScale, computeOrbDescriptors(imagePyramid, layerInfo, layerScale,
keypoints, descriptors, pattern, dsize, WTA_K); keypoints, descriptors, pattern, dsize, wta_k);
} }
} }
} }
Ptr<ORB> ORB::create(int nfeatures, float scaleFactor, int nlevels, int edgeThreshold, Ptr<ORB> ORB::create(int nfeatures, float scaleFactor, int nlevels, int edgeThreshold,
int firstLevel, int WTA_K, int scoreType, int patchSize, int fastThreshold) int firstLevel, int wta_k, int scoreType, int patchSize, int fastThreshold)
{ {
return makePtr<ORB_Impl>(nfeatures, scaleFactor, nlevels, edgeThreshold, return makePtr<ORB_Impl>(nfeatures, scaleFactor, nlevels, edgeThreshold,
firstLevel, WTA_K, scoreType, patchSize, fastThreshold); firstLevel, wta_k, scoreType, patchSize, fastThreshold);
} }
} }
...@@ -267,7 +267,9 @@ TEST( Features2d_Detector_GFTT, regression ) ...@@ -267,7 +267,9 @@ TEST( Features2d_Detector_GFTT, regression )
TEST( Features2d_Detector_Harris, regression ) TEST( Features2d_Detector_Harris, regression )
{ {
CV_FeatureDetectorTest test( "detector-harris", GFTTDetector::create(1000, 0.01, 1, 3, true, 0.04)); Ptr<FeatureDetector> gftt = GFTTDetector::create();
gftt->set(GFTTDetector::USE_HARRIS_DETECTOR, 1);
CV_FeatureDetectorTest test( "detector-harris", gftt);
test.safe_run(); test.safe_run();
} }
......
...@@ -133,13 +133,16 @@ TEST(Features2d_Detector_Keypoints_FAST, validation) ...@@ -133,13 +133,16 @@ TEST(Features2d_Detector_Keypoints_FAST, validation)
TEST(Features2d_Detector_Keypoints_HARRIS, validation) TEST(Features2d_Detector_Keypoints_HARRIS, validation)
{ {
CV_FeatureDetectorKeypointsTest test(GFTTDetector::create(1000, 0.01, 1, 3, true, 0.04)); CV_FeatureDetectorKeypointsTest test(GFTTDetector::create(1000, 0.01, 1, 3, true, 0.04));
test.safe_run(); test.safe_run();
} }
TEST(Features2d_Detector_Keypoints_GFTT, validation) TEST(Features2d_Detector_Keypoints_GFTT, validation)
{ {
CV_FeatureDetectorKeypointsTest test(GFTTDetector::create()); Ptr<FeatureDetector> gftt = GFTTDetector::create();
gftt->set(GFTTDetector::USE_HARRIS_DETECTOR, 1);
CV_FeatureDetectorKeypointsTest test(gftt);
test.safe_run(); test.safe_run();
} }
......
...@@ -133,6 +133,7 @@ public: ...@@ -133,6 +133,7 @@ public:
break; break;
case HARRIS: case HARRIS:
fd = GFTTDetector::create(); fd = GFTTDetector::create();
fd->set(GFTTDetector::USE_HARRIS_DETECTOR, 1);
break; break;
case SIMPLEBLOB: case SIMPLEBLOB:
fd = SimpleBlobDetector::create(); fd = SimpleBlobDetector::create();
......
...@@ -91,7 +91,7 @@ class Hackathon244Tests(NewOpenCVTests): ...@@ -91,7 +91,7 @@ class Hackathon244Tests(NewOpenCVTests):
self.assertEqual(cv2.countNonZero(inliers), pattern_size[0]*pattern_size[1]) self.assertEqual(cv2.countNonZero(inliers), pattern_size[0]*pattern_size[1])
def test_fast(self): def test_fast(self):
fd = cv2.FastFeatureDetector(30, True) fd = cv2.FastFeatureDetector_create(30, True)
img = self.get_sample("samples/cpp/right02.jpg", 0) img = self.get_sample("samples/cpp/right02.jpg", 0)
img = cv2.medianBlur(img, 3) img = cv2.medianBlur(img, 3)
imgc = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) imgc = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
......
...@@ -50,6 +50,8 @@ using namespace cv::cuda; ...@@ -50,6 +50,8 @@ using namespace cv::cuda;
#include "opencv2/xfeatures2d.hpp" #include "opencv2/xfeatures2d.hpp"
#endif #endif
using xfeatures2d::SURF;
namespace { namespace {
struct DistIdxPair struct DistIdxPair
...@@ -321,27 +323,27 @@ SurfFeaturesFinder::SurfFeaturesFinder(double hess_thresh, int num_octaves, int ...@@ -321,27 +323,27 @@ SurfFeaturesFinder::SurfFeaturesFinder(double hess_thresh, int num_octaves, int
{ {
if (num_octaves_descr == num_octaves && num_layers_descr == num_layers) if (num_octaves_descr == num_octaves && num_layers_descr == num_layers)
{ {
surf = xfeatures2d::SURF::create(); surf = SURF::create();
if( !surf ) if( !surf )
CV_Error( Error::StsNotImplemented, "OpenCV was built without SURF support" ); CV_Error( Error::StsNotImplemented, "OpenCV was built without SURF support" );
surf->set("hessianThreshold", hess_thresh); surf->set(SURF::HESSIAN_THRESHOLD, hess_thresh);
surf->set("nOctaves", num_octaves); surf->set(SURF::NOCTAVES, num_octaves);
surf->set("nOctaveLayers", num_layers); surf->set(SURF::NOCTAVE_LAYERS, num_layers);
} }
else else
{ {
detector_ = xfeatures2d::SURF::create(); detector_ = SURF::create();
extractor_ = xfeatures2d::SURF::create(); extractor_ = SURF::create();
if( !detector_ || !extractor_ ) if( !detector_ || !extractor_ )
CV_Error( Error::StsNotImplemented, "OpenCV was built without SURF support" ); CV_Error( Error::StsNotImplemented, "OpenCV was built without SURF support" );
detector_->set("hessianThreshold", hess_thresh); detector_->set(SURF::HESSIAN_THRESHOLD, hess_thresh);
detector_->set("nOctaves", num_octaves); detector_->set(SURF::NOCTAVES, num_octaves);
detector_->set("nOctaveLayers", num_layers); detector_->set(SURF::NOCTAVE_LAYERS, num_layers);
extractor_->set("nOctaves", num_octaves_descr); extractor_->set(SURF::NOCTAVES, num_octaves_descr);
extractor_->set("nOctaveLayers", num_layers_descr); extractor_->set(SURF::NOCTAVE_LAYERS, num_layers_descr);
} }
} }
......
...@@ -16,8 +16,8 @@ JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_FindF ...@@ -16,8 +16,8 @@ JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_FindF
Mat& mRgb = *(Mat*)addrRgba; Mat& mRgb = *(Mat*)addrRgba;
vector<KeyPoint> v; vector<KeyPoint> v;
FastFeatureDetector detector(50); Ptr<FeatureDetector> detector = FastFeatureDetector::create(50);
detector.detect(mGr, v); detector->detect(mGr, v);
for( unsigned int i = 0; i < v.size(); i++ ) for( unsigned int i = 0; i < v.size(); i++ )
{ {
const KeyPoint& kp = v[i]; const KeyPoint& kp = v[i];
......
...@@ -129,12 +129,12 @@ cv::Mat OcvImageProcessing::MainPage::ApplyFindFeaturesFilter(const cv::Mat& ima ...@@ -129,12 +129,12 @@ cv::Mat OcvImageProcessing::MainPage::ApplyFindFeaturesFilter(const cv::Mat& ima
{ {
cv::Mat result; cv::Mat result;
cv::Mat intermediateMat; cv::Mat intermediateMat;
cv::FastFeatureDetector detector(50); cv::Ptr<cv::FeatureDetector> detector = cv::FastFeatureDetector::create(50);
std::vector<cv::KeyPoint> features; std::vector<cv::KeyPoint> features;
image.copyTo(result); image.copyTo(result);
cv::cvtColor(image, intermediateMat, CV_RGBA2GRAY); cv::cvtColor(image, intermediateMat, CV_RGBA2GRAY);
detector.detect(intermediateMat, features); detector->detect(intermediateMat, features);
for( unsigned int i = 0; i < std::min(features.size(), (size_t)50); i++ ) for( unsigned int i = 0; i < std::min(features.size(), (size_t)50); i++ )
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册