2013-06-04 11:32:35 +02:00
|
|
|
/*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*/
|
|
|
|
|
2013-07-24 08:27:59 +02:00
|
|
|
#ifndef __OPENCV_CUDAFEATURES2D_HPP__
|
|
|
|
#define __OPENCV_CUDAFEATURES2D_HPP__
|
2013-06-04 11:32:35 +02:00
|
|
|
|
|
|
|
#ifndef __cplusplus
|
2013-07-24 08:27:59 +02:00
|
|
|
# error cudafeatures2d.hpp header must be compiled as C++
|
2013-06-04 11:32:35 +02:00
|
|
|
#endif
|
|
|
|
|
2013-07-23 12:12:04 +02:00
|
|
|
#include "opencv2/core/cuda.hpp"
|
2015-01-12 16:11:09 +01:00
|
|
|
#include "opencv2/features2d.hpp"
|
2013-07-23 14:24:55 +02:00
|
|
|
#include "opencv2/cudafilters.hpp"
|
2013-06-04 11:32:35 +02:00
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
/**
|
|
|
|
@addtogroup cuda
|
|
|
|
@{
|
|
|
|
@defgroup cudafeatures2d Feature Detection and Description
|
|
|
|
@}
|
|
|
|
*/
|
|
|
|
|
2013-08-28 13:45:13 +02:00
|
|
|
namespace cv { namespace cuda {
|
2013-06-04 11:32:35 +02:00
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! @addtogroup cudafeatures2d
|
|
|
|
//! @{
|
|
|
|
|
|
|
|
/** @brief Brute-force descriptor matcher.
|
|
|
|
|
|
|
|
For each descriptor in the first set, this matcher finds the closest descriptor in the second set
|
|
|
|
by trying each one. This descriptor matcher supports masking permissible matches between descriptor
|
|
|
|
sets.
|
|
|
|
|
2014-11-21 09:28:14 +01:00
|
|
|
The class BFMatcher_CUDA has an interface similar to the class DescriptorMatcher. It has two groups
|
2014-11-20 14:42:06 +01:00
|
|
|
of match methods: for matching descriptors of one image with another image or with an image set.
|
|
|
|
Also, all functions have an alternative to save results either to the GPU memory or to the CPU
|
|
|
|
memory.
|
|
|
|
|
|
|
|
@sa DescriptorMatcher, BFMatcher
|
|
|
|
*/
|
2013-07-24 11:55:18 +02:00
|
|
|
class CV_EXPORTS BFMatcher_CUDA
|
2013-06-04 11:32:35 +02:00
|
|
|
{
|
|
|
|
public:
|
2013-07-24 11:55:18 +02:00
|
|
|
explicit BFMatcher_CUDA(int norm = cv::NORM_L2);
|
2013-06-04 11:32:35 +02:00
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Add descriptors to train descriptor collection
|
2013-06-04 11:32:35 +02:00
|
|
|
void add(const std::vector<GpuMat>& descCollection);
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Get train descriptors collection
|
2013-06-04 11:32:35 +02:00
|
|
|
const std::vector<GpuMat>& getTrainDescriptors() const;
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Clear train descriptors collection
|
2013-06-04 11:32:35 +02:00
|
|
|
void clear();
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Return true if there are not train descriptors in collection
|
2013-06-04 11:32:35 +02:00
|
|
|
bool empty() const;
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Return true if the matcher supports mask in match methods
|
2013-06-04 11:32:35 +02:00
|
|
|
bool isMaskSupported() const;
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find one best match for each query descriptor
|
2013-06-04 11:32:35 +02:00
|
|
|
void matchSingle(const GpuMat& query, const GpuMat& train,
|
|
|
|
GpuMat& trainIdx, GpuMat& distance,
|
|
|
|
const GpuMat& mask = GpuMat(), Stream& stream = Stream::Null());
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Download trainIdx and distance and convert it to CPU vector with DMatch
|
2013-06-04 11:32:35 +02:00
|
|
|
static void matchDownload(const GpuMat& trainIdx, const GpuMat& distance, std::vector<DMatch>& matches);
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Convert trainIdx and distance to vector with DMatch
|
2013-06-04 11:32:35 +02:00
|
|
|
static void matchConvert(const Mat& trainIdx, const Mat& distance, std::vector<DMatch>& matches);
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find one best match for each query descriptor
|
2013-06-04 11:32:35 +02:00
|
|
|
void match(const GpuMat& query, const GpuMat& train, std::vector<DMatch>& matches, const GpuMat& mask = GpuMat());
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Make gpu collection of trains and masks in suitable format for matchCollection function
|
2013-06-04 11:32:35 +02:00
|
|
|
void makeGpuCollection(GpuMat& trainCollection, GpuMat& maskCollection, const std::vector<GpuMat>& masks = std::vector<GpuMat>());
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find one best match from train collection for each query descriptor
|
2013-06-04 11:32:35 +02:00
|
|
|
void matchCollection(const GpuMat& query, const GpuMat& trainCollection,
|
|
|
|
GpuMat& trainIdx, GpuMat& imgIdx, GpuMat& distance,
|
|
|
|
const GpuMat& masks = GpuMat(), Stream& stream = Stream::Null());
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Download trainIdx, imgIdx and distance and convert it to vector with DMatch
|
2013-06-04 11:32:35 +02:00
|
|
|
static void matchDownload(const GpuMat& trainIdx, const GpuMat& imgIdx, const GpuMat& distance, std::vector<DMatch>& matches);
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Convert trainIdx, imgIdx and distance to vector with DMatch
|
2013-06-04 11:32:35 +02:00
|
|
|
static void matchConvert(const Mat& trainIdx, const Mat& imgIdx, const Mat& distance, std::vector<DMatch>& matches);
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find one best match from train collection for each query descriptor.
|
2013-06-04 11:32:35 +02:00
|
|
|
void match(const GpuMat& query, std::vector<DMatch>& matches, const std::vector<GpuMat>& masks = std::vector<GpuMat>());
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find k best matches for each query descriptor (in increasing order of distances)
|
2013-06-04 11:32:35 +02:00
|
|
|
void knnMatchSingle(const GpuMat& query, const GpuMat& train,
|
|
|
|
GpuMat& trainIdx, GpuMat& distance, GpuMat& allDist, int k,
|
|
|
|
const GpuMat& mask = GpuMat(), Stream& stream = Stream::Null());
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Download trainIdx and distance and convert it to vector with DMatch
|
|
|
|
//! compactResult is used when mask is not empty. If compactResult is false matches
|
|
|
|
//! vector will have the same size as queryDescriptors rows. If compactResult is true
|
|
|
|
//! matches vector will not contain matches for fully masked out query descriptors.
|
2013-06-04 11:32:35 +02:00
|
|
|
static void knnMatchDownload(const GpuMat& trainIdx, const GpuMat& distance,
|
|
|
|
std::vector< std::vector<DMatch> >& matches, bool compactResult = false);
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Convert trainIdx and distance to vector with DMatch
|
2013-06-04 11:32:35 +02:00
|
|
|
static void knnMatchConvert(const Mat& trainIdx, const Mat& distance,
|
|
|
|
std::vector< std::vector<DMatch> >& matches, bool compactResult = false);
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find k best matches for each query descriptor (in increasing order of distances).
|
|
|
|
//! compactResult is used when mask is not empty. If compactResult is false matches
|
|
|
|
//! vector will have the same size as queryDescriptors rows. If compactResult is true
|
|
|
|
//! matches vector will not contain matches for fully masked out query descriptors.
|
2013-06-04 11:32:35 +02:00
|
|
|
void knnMatch(const GpuMat& query, const GpuMat& train,
|
|
|
|
std::vector< std::vector<DMatch> >& matches, int k, const GpuMat& mask = GpuMat(),
|
|
|
|
bool compactResult = false);
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find k best matches from train collection for each query descriptor (in increasing order of distances)
|
2013-06-04 11:32:35 +02:00
|
|
|
void knnMatch2Collection(const GpuMat& query, const GpuMat& trainCollection,
|
|
|
|
GpuMat& trainIdx, GpuMat& imgIdx, GpuMat& distance,
|
|
|
|
const GpuMat& maskCollection = GpuMat(), Stream& stream = Stream::Null());
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Download trainIdx and distance and convert it to vector with DMatch
|
|
|
|
//! compactResult is used when mask is not empty. If compactResult is false matches
|
|
|
|
//! vector will have the same size as queryDescriptors rows. If compactResult is true
|
|
|
|
//! matches vector will not contain matches for fully masked out query descriptors.
|
|
|
|
//! @see BFMatcher_CUDA::knnMatchDownload
|
2013-06-04 11:32:35 +02:00
|
|
|
static void knnMatch2Download(const GpuMat& trainIdx, const GpuMat& imgIdx, const GpuMat& distance,
|
|
|
|
std::vector< std::vector<DMatch> >& matches, bool compactResult = false);
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Convert trainIdx and distance to vector with DMatch
|
|
|
|
//! @see BFMatcher_CUDA::knnMatchConvert
|
2013-06-04 11:32:35 +02:00
|
|
|
static void knnMatch2Convert(const Mat& trainIdx, const Mat& imgIdx, const Mat& distance,
|
|
|
|
std::vector< std::vector<DMatch> >& matches, bool compactResult = false);
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find k best matches for each query descriptor (in increasing order of distances).
|
|
|
|
//! compactResult is used when mask is not empty. If compactResult is false matches
|
|
|
|
//! vector will have the same size as queryDescriptors rows. If compactResult is true
|
|
|
|
//! matches vector will not contain matches for fully masked out query descriptors.
|
2013-06-04 11:32:35 +02:00
|
|
|
void knnMatch(const GpuMat& query, std::vector< std::vector<DMatch> >& matches, int k,
|
|
|
|
const std::vector<GpuMat>& masks = std::vector<GpuMat>(), bool compactResult = false);
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find best matches for each query descriptor which have distance less than maxDistance.
|
|
|
|
//! nMatches.at<int>(0, queryIdx) will contain matches count for queryIdx.
|
|
|
|
//! carefully nMatches can be greater than trainIdx.cols - it means that matcher didn't find all matches,
|
|
|
|
//! because it didn't have enough memory.
|
|
|
|
//! If trainIdx is empty, then trainIdx and distance will be created with size nQuery x max((nTrain / 100), 10),
|
|
|
|
//! otherwize user can pass own allocated trainIdx and distance with size nQuery x nMaxMatches
|
|
|
|
//! Matches doesn't sorted.
|
2013-06-04 11:32:35 +02:00
|
|
|
void radiusMatchSingle(const GpuMat& query, const GpuMat& train,
|
|
|
|
GpuMat& trainIdx, GpuMat& distance, GpuMat& nMatches, float maxDistance,
|
|
|
|
const GpuMat& mask = GpuMat(), Stream& stream = Stream::Null());
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Download trainIdx, nMatches and distance and convert it to vector with DMatch.
|
|
|
|
//! matches will be sorted in increasing order of distances.
|
|
|
|
//! compactResult is used when mask is not empty. If compactResult is false matches
|
|
|
|
//! vector will have the same size as queryDescriptors rows. If compactResult is true
|
|
|
|
//! matches vector will not contain matches for fully masked out query descriptors.
|
2013-06-04 11:32:35 +02:00
|
|
|
static void radiusMatchDownload(const GpuMat& trainIdx, const GpuMat& distance, const GpuMat& nMatches,
|
|
|
|
std::vector< std::vector<DMatch> >& matches, bool compactResult = false);
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Convert trainIdx, nMatches and distance to vector with DMatch.
|
2013-06-04 11:32:35 +02:00
|
|
|
static void radiusMatchConvert(const Mat& trainIdx, const Mat& distance, const Mat& nMatches,
|
|
|
|
std::vector< std::vector<DMatch> >& matches, bool compactResult = false);
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find best matches for each query descriptor which have distance less than maxDistance
|
|
|
|
//! in increasing order of distances).
|
2013-06-04 11:32:35 +02:00
|
|
|
void radiusMatch(const GpuMat& query, const GpuMat& train,
|
|
|
|
std::vector< std::vector<DMatch> >& matches, float maxDistance,
|
|
|
|
const GpuMat& mask = GpuMat(), bool compactResult = false);
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find best matches for each query descriptor which have distance less than maxDistance.
|
|
|
|
//! If trainIdx is empty, then trainIdx and distance will be created with size nQuery x max((nQuery / 100), 10),
|
|
|
|
//! otherwize user can pass own allocated trainIdx and distance with size nQuery x nMaxMatches
|
|
|
|
//! Matches doesn't sorted.
|
2013-06-04 11:32:35 +02:00
|
|
|
void radiusMatchCollection(const GpuMat& query, GpuMat& trainIdx, GpuMat& imgIdx, GpuMat& distance, GpuMat& nMatches, float maxDistance,
|
|
|
|
const std::vector<GpuMat>& masks = std::vector<GpuMat>(), Stream& stream = Stream::Null());
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Download trainIdx, imgIdx, nMatches and distance and convert it to vector with DMatch.
|
|
|
|
//! matches will be sorted in increasing order of distances.
|
|
|
|
//! compactResult is used when mask is not empty. If compactResult is false matches
|
|
|
|
//! vector will have the same size as queryDescriptors rows. If compactResult is true
|
|
|
|
//! matches vector will not contain matches for fully masked out query descriptors.
|
2013-06-04 11:32:35 +02:00
|
|
|
static void radiusMatchDownload(const GpuMat& trainIdx, const GpuMat& imgIdx, const GpuMat& distance, const GpuMat& nMatches,
|
|
|
|
std::vector< std::vector<DMatch> >& matches, bool compactResult = false);
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Convert trainIdx, nMatches and distance to vector with DMatch.
|
2013-06-04 11:32:35 +02:00
|
|
|
static void radiusMatchConvert(const Mat& trainIdx, const Mat& imgIdx, const Mat& distance, const Mat& nMatches,
|
|
|
|
std::vector< std::vector<DMatch> >& matches, bool compactResult = false);
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! Find best matches from train collection for each query descriptor which have distance less than
|
|
|
|
//! maxDistance (in increasing order of distances).
|
2013-06-04 11:32:35 +02:00
|
|
|
void radiusMatch(const GpuMat& query, std::vector< std::vector<DMatch> >& matches, float maxDistance,
|
|
|
|
const std::vector<GpuMat>& masks = std::vector<GpuMat>(), bool compactResult = false);
|
|
|
|
|
|
|
|
int norm;
|
|
|
|
|
|
|
|
private:
|
|
|
|
std::vector<GpuMat> trainDescCollection;
|
|
|
|
};
|
|
|
|
|
2015-01-12 16:11:09 +01:00
|
|
|
//
|
|
|
|
// Feature2DAsync
|
|
|
|
//
|
|
|
|
|
|
|
|
class CV_EXPORTS Feature2DAsync
|
2013-06-04 11:32:35 +02:00
|
|
|
{
|
|
|
|
public:
|
2015-01-12 16:26:41 +01:00
|
|
|
virtual ~Feature2DAsync();
|
2013-06-04 11:32:35 +02:00
|
|
|
|
2015-01-12 16:26:41 +01:00
|
|
|
virtual void detectAsync(InputArray image,
|
|
|
|
OutputArray keypoints,
|
2015-01-12 16:11:09 +01:00
|
|
|
InputArray mask = noArray(),
|
2015-01-12 16:26:41 +01:00
|
|
|
Stream& stream = Stream::Null());
|
|
|
|
|
|
|
|
virtual void computeAsync(InputArray image,
|
|
|
|
OutputArray keypoints,
|
|
|
|
OutputArray descriptors,
|
|
|
|
Stream& stream = Stream::Null());
|
|
|
|
|
|
|
|
virtual void detectAndComputeAsync(InputArray image,
|
|
|
|
InputArray mask,
|
|
|
|
OutputArray keypoints,
|
|
|
|
OutputArray descriptors,
|
|
|
|
bool useProvidedKeypoints=false,
|
|
|
|
Stream& stream = Stream::Null());
|
|
|
|
|
|
|
|
virtual void convert(InputArray gpu_keypoints,
|
|
|
|
std::vector<KeyPoint>& keypoints) = 0;
|
2015-01-12 16:11:09 +01:00
|
|
|
};
|
2014-11-20 14:42:06 +01:00
|
|
|
|
2015-01-12 16:11:09 +01:00
|
|
|
//
|
|
|
|
// FastFeatureDetector
|
|
|
|
//
|
2014-11-20 14:42:06 +01:00
|
|
|
|
2015-01-12 16:11:09 +01:00
|
|
|
class CV_EXPORTS FastFeatureDetector : public cv::FastFeatureDetector, public Feature2DAsync
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
LOCATION_ROW = 0,
|
|
|
|
RESPONSE_ROW,
|
|
|
|
ROWS_COUNT,
|
2013-06-04 11:32:35 +02:00
|
|
|
|
2015-01-12 16:11:09 +01:00
|
|
|
FEATURE_SIZE = 7
|
|
|
|
};
|
2013-06-04 11:32:35 +02:00
|
|
|
|
2015-01-12 16:11:09 +01:00
|
|
|
static Ptr<FastFeatureDetector> create(int threshold=10,
|
|
|
|
bool nonmaxSuppression=true,
|
|
|
|
int type=FastFeatureDetector::TYPE_9_16,
|
|
|
|
int max_npoints = 5000);
|
2013-06-04 11:32:35 +02:00
|
|
|
|
2015-01-12 16:11:09 +01:00
|
|
|
virtual void setMaxNumPoints(int max_npoints) = 0;
|
|
|
|
virtual int getMaxNumPoints() const = 0;
|
2013-06-04 11:32:35 +02:00
|
|
|
};
|
|
|
|
|
2015-01-13 08:40:58 +01:00
|
|
|
//
|
|
|
|
// ORB
|
|
|
|
//
|
|
|
|
|
|
|
|
class CV_EXPORTS ORB : public cv::ORB, public Feature2DAsync
|
2013-06-04 11:32:35 +02:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
X_ROW = 0,
|
|
|
|
Y_ROW,
|
|
|
|
RESPONSE_ROW,
|
|
|
|
ANGLE_ROW,
|
|
|
|
OCTAVE_ROW,
|
|
|
|
SIZE_ROW,
|
|
|
|
ROWS_COUNT
|
|
|
|
};
|
|
|
|
|
2015-01-13 08:40:58 +01:00
|
|
|
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,
|
|
|
|
bool blurForDescriptor=false);
|
2013-06-04 11:32:35 +02:00
|
|
|
|
|
|
|
//! if true, image will be blurred before descriptors calculation
|
2015-01-13 08:40:58 +01:00
|
|
|
virtual void setBlurForDescriptor(bool blurForDescriptor) = 0;
|
|
|
|
virtual bool getBlurForDescriptor() const = 0;
|
2013-06-04 11:32:35 +02:00
|
|
|
};
|
|
|
|
|
2014-11-20 14:42:06 +01:00
|
|
|
//! @}
|
|
|
|
|
2013-08-28 13:45:13 +02:00
|
|
|
}} // namespace cv { namespace cuda {
|
2013-06-04 11:32:35 +02:00
|
|
|
|
2013-07-24 08:27:59 +02:00
|
|
|
#endif /* __OPENCV_CUDAFEATURES2D_HPP__ */
|