mirror of
https://github.com/opencv/opencv.git
synced 2024-11-30 06:10:02 +08:00
127 lines
4.8 KiB
C++
127 lines
4.8 KiB
C++
/* 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), surf->descriptorSize() * CV_ELEM_SIZE(surf->descriptorType()), 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), kpt[i].angle, kpt[i].response);
|
|
cvSeqPush(*_keypoints, &pt);
|
|
}
|
|
if( _descriptors )
|
|
cvSeqPush(*_descriptors, descr.ptr((int)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;
|
|
}
|
|
|
|
|