lot's of changes; nonfree & photo modules added; SIFT & SURF -> nonfree module; Inpainting -> photo; refactored features2d (ORB is still failing tests), optimized brute-force matcher and made it non-template.
This commit is contained in:
126
modules/legacy/src/features2d.cpp
Normal file
126
modules/legacy/src/features2d.cpp
Normal file
@@ -0,0 +1,126 @@
|
||||
/* Original code has been submitted by Liu Liu. Here is the copyright.
|
||||
----------------------------------------------------------------------------------
|
||||
* An OpenCV Implementation of SURF
|
||||
* Further Information Refer to "SURF: Speed-Up Robust Feature"
|
||||
* Author: Liu Liu
|
||||
* liuliu.1987+opencv@gmail.com
|
||||
*
|
||||
* There are still serveral lacks for this experimental implementation:
|
||||
* 1.The interpolation of sub-pixel mentioned in article was not implemented yet;
|
||||
* 2.A comparision with original libSurf.so shows that the hessian detector is not a 100% match to their implementation;
|
||||
* 3.Due to above reasons, I recommanded the original one for study and reuse;
|
||||
*
|
||||
* However, the speed of this implementation is something comparable to original one.
|
||||
*
|
||||
* Copyright© 2008, Liu Liu All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
* Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
* Redistributions 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 Contributor 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 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.
|
||||
*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
using namespace cv;
|
||||
|
||||
|
||||
|
||||
CV_IMPL CvSURFParams cvSURFParams(double threshold, int extended)
|
||||
{
|
||||
CvSURFParams params;
|
||||
params.hessianThreshold = threshold;
|
||||
params.extended = extended;
|
||||
params.upright = 0;
|
||||
params.nOctaves = 4;
|
||||
params.nOctaveLayers = 2;
|
||||
return params;
|
||||
}
|
||||
|
||||
CV_IMPL void
|
||||
cvExtractSURF( const CvArr* _img, const CvArr* _mask,
|
||||
CvSeq** _keypoints, CvSeq** _descriptors,
|
||||
CvMemStorage* storage, CvSURFParams params,
|
||||
int useProvidedKeyPts)
|
||||
{
|
||||
Mat img = cvarrToMat(_img), mask;
|
||||
if(_mask)
|
||||
mask = cvarrToMat(_mask);
|
||||
vector<KeyPoint> kpt;
|
||||
Mat descr;
|
||||
|
||||
Ptr<Feature2D> surf = Algorithm::create<Feature2D>("Feature2D.SURF");
|
||||
if( surf.empty() )
|
||||
CV_Error(CV_StsNotImplemented, "OpenCV was built without SURF support");
|
||||
|
||||
surf->set("hessianThreshold", params.hessianThreshold);
|
||||
surf->set("nOctaves", params.nOctaves);
|
||||
surf->set("nOctaveLayers", params.nOctaveLayers);
|
||||
surf->set("upright", params.upright != 0);
|
||||
surf->set("extended", params.extended != 0);
|
||||
|
||||
surf->operator()(img, mask, kpt, _descriptors ? _OutputArray(descr) : noArray(),
|
||||
useProvidedKeyPts != 0);
|
||||
|
||||
if( _keypoints )
|
||||
*_keypoints = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvSURFPoint), storage);
|
||||
|
||||
if( _descriptors )
|
||||
*_descriptors = cvCreateSeq( 0, sizeof(CvSeq), descr.cols*descr.elemSize(), storage );
|
||||
|
||||
for( size_t i = 0; i < kpt.size(); i++ )
|
||||
{
|
||||
if( _keypoints )
|
||||
{
|
||||
CvSURFPoint pt = cvSURFPoint(kpt[i].pt, kpt[i].class_id, cvRound(kpt[i].size));
|
||||
cvSeqPush(*_keypoints, &pt);
|
||||
}
|
||||
if( _descriptors )
|
||||
cvSeqPush(*_descriptors, descr.ptr(i));
|
||||
}
|
||||
}
|
||||
|
||||
CV_IMPL CvSeq*
|
||||
cvGetStarKeypoints( const CvArr* _img, CvMemStorage* storage,
|
||||
CvStarDetectorParams params )
|
||||
{
|
||||
Ptr<StarDetector> star = new StarDetector(params.maxSize, params.responseThreshold,
|
||||
params.lineThresholdProjected,
|
||||
params.lineThresholdBinarized,
|
||||
params.suppressNonmaxSize);
|
||||
vector<KeyPoint> kpts;
|
||||
star->detect(cvarrToMat(_img), kpts, Mat());
|
||||
|
||||
CvSeq* seq = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvStarKeypoint), storage);
|
||||
for( size_t i = 0; i < kpts.size(); i++ )
|
||||
{
|
||||
CvStarKeypoint kpt = cvStarKeypoint(kpts[i].pt, cvRound(kpts[i].size), kpts[i].response);
|
||||
cvSeqPush(seq, &kpt);
|
||||
}
|
||||
return seq;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user