490 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			490 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*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*/
 | |
| 
 | |
| #ifndef __OPENCV_CUDAFEATURES2D_HPP__
 | |
| #define __OPENCV_CUDAFEATURES2D_HPP__
 | |
| 
 | |
| #ifndef __cplusplus
 | |
| #  error cudafeatures2d.hpp header must be compiled as C++
 | |
| #endif
 | |
| 
 | |
| #include "opencv2/core/cuda.hpp"
 | |
| #include "opencv2/features2d.hpp"
 | |
| #include "opencv2/cudafilters.hpp"
 | |
| 
 | |
| /**
 | |
|   @addtogroup cuda
 | |
|   @{
 | |
|     @defgroup cudafeatures2d Feature Detection and Description
 | |
|   @}
 | |
|  */
 | |
| 
 | |
| namespace cv { namespace cuda {
 | |
| 
 | |
| //! @addtogroup cudafeatures2d
 | |
| //! @{
 | |
| 
 | |
| //
 | |
| // DescriptorMatcher
 | |
| //
 | |
| 
 | |
| /** @brief Abstract base class for matching keypoint descriptors.
 | |
| 
 | |
| It has two groups of match methods: for matching descriptors of an image with another image or with
 | |
| an image set.
 | |
|  */
 | |
| class CV_EXPORTS DescriptorMatcher : public cv::Algorithm
 | |
| {
 | |
| public:
 | |
|     //
 | |
|     // Factories
 | |
|     //
 | |
| 
 | |
|     /** @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 of descriptor
 | |
|     sets.
 | |
| 
 | |
|     @param normType One of NORM_L1, NORM_L2, NORM_HAMMING. L1 and L2 norms are
 | |
|     preferable choices for SIFT and SURF descriptors, NORM_HAMMING should be used with ORB, BRISK and
 | |
|     BRIEF).
 | |
|      */
 | |
|     static Ptr<DescriptorMatcher> createBFMatcher(int normType = cv::NORM_L2);
 | |
| 
 | |
|     //
 | |
|     // Utility
 | |
|     //
 | |
| 
 | |
|     /** @brief Returns true if the descriptor matcher supports masking permissible matches.
 | |
|      */
 | |
|     virtual bool isMaskSupported() const = 0;
 | |
| 
 | |
|     //
 | |
|     // Descriptor collection
 | |
|     //
 | |
| 
 | |
|     /** @brief Adds descriptors to train a descriptor collection.
 | |
| 
 | |
|     If the collection is not empty, the new descriptors are added to existing train descriptors.
 | |
| 
 | |
|     @param descriptors Descriptors to add. Each descriptors[i] is a set of descriptors from the same
 | |
|     train image.
 | |
|      */
 | |
|     virtual void add(const std::vector<GpuMat>& descriptors) = 0;
 | |
| 
 | |
|     /** @brief Returns a constant link to the train descriptor collection.
 | |
|      */
 | |
|     virtual const std::vector<GpuMat>& getTrainDescriptors() const = 0;
 | |
| 
 | |
|     /** @brief Clears the train descriptor collection.
 | |
|      */
 | |
|     virtual void clear() = 0;
 | |
| 
 | |
|     /** @brief Returns true if there are no train descriptors in the collection.
 | |
|      */
 | |
|     virtual bool empty() const = 0;
 | |
| 
 | |
|     /** @brief Trains a descriptor matcher.
 | |
| 
 | |
|     Trains a descriptor matcher (for example, the flann index). In all methods to match, the method
 | |
|     train() is run every time before matching.
 | |
|      */
 | |
|     virtual void train() = 0;
 | |
| 
 | |
|     //
 | |
|     // 1 to 1 match
 | |
|     //
 | |
| 
 | |
|     /** @brief Finds the best match for each descriptor from a query set (blocking version).
 | |
| 
 | |
|     @param queryDescriptors Query set of descriptors.
 | |
|     @param trainDescriptors Train set of descriptors. This set is not added to the train descriptors
 | |
|     collection stored in the class object.
 | |
|     @param matches Matches. If a query descriptor is masked out in mask , no match is added for this
 | |
|     descriptor. So, matches size may be smaller than the query descriptors count.
 | |
|     @param mask Mask specifying permissible matches between an input query and train matrices of
 | |
|     descriptors.
 | |
| 
 | |
|     In the first variant of this method, the train descriptors are passed as an input argument. In the
 | |
|     second variant of the method, train descriptors collection that was set by DescriptorMatcher::add is
 | |
|     used. Optional mask (or masks) can be passed to specify which query and training descriptors can be
 | |
|     matched. Namely, queryDescriptors[i] can be matched with trainDescriptors[j] only if
 | |
|     mask.at\<uchar\>(i,j) is non-zero.
 | |
|      */
 | |
|     virtual void match(InputArray queryDescriptors, InputArray trainDescriptors,
 | |
|                        std::vector<DMatch>& matches,
 | |
|                        InputArray mask = noArray()) = 0;
 | |
| 
 | |
|     /** @overload
 | |
|      */
 | |
|     virtual void match(InputArray queryDescriptors,
 | |
|                        std::vector<DMatch>& matches,
 | |
|                        const std::vector<GpuMat>& masks = std::vector<GpuMat>()) = 0;
 | |
| 
 | |
|     /** @brief Finds the best match for each descriptor from a query set (asynchronous version).
 | |
| 
 | |
|     @param queryDescriptors Query set of descriptors.
 | |
|     @param trainDescriptors Train set of descriptors. This set is not added to the train descriptors
 | |
|     collection stored in the class object.
 | |
|     @param matches Matches array stored in GPU memory. Internal representation is not defined.
 | |
|     Use DescriptorMatcher::matchConvert method to retrieve results in standard representation.
 | |
|     @param mask Mask specifying permissible matches between an input query and train matrices of
 | |
|     descriptors.
 | |
|     @param stream CUDA stream.
 | |
| 
 | |
|     In the first variant of this method, the train descriptors are passed as an input argument. In the
 | |
|     second variant of the method, train descriptors collection that was set by DescriptorMatcher::add is
 | |
|     used. Optional mask (or masks) can be passed to specify which query and training descriptors can be
 | |
|     matched. Namely, queryDescriptors[i] can be matched with trainDescriptors[j] only if
 | |
|     mask.at\<uchar\>(i,j) is non-zero.
 | |
|      */
 | |
|     virtual void matchAsync(InputArray queryDescriptors, InputArray trainDescriptors,
 | |
|                             OutputArray matches,
 | |
|                             InputArray mask = noArray(),
 | |
|                             Stream& stream = Stream::Null()) = 0;
 | |
| 
 | |
|     /** @overload
 | |
|      */
 | |
|     virtual void matchAsync(InputArray queryDescriptors,
 | |
|                             OutputArray matches,
 | |
|                             const std::vector<GpuMat>& masks = std::vector<GpuMat>(),
 | |
|                             Stream& stream = Stream::Null()) = 0;
 | |
| 
 | |
|     /** @brief Converts matches array from internal representation to standard matches vector.
 | |
| 
 | |
|     The method is supposed to be used with DescriptorMatcher::matchAsync to get final result.
 | |
|     Call this method only after DescriptorMatcher::matchAsync is completed (ie. after synchronization).
 | |
| 
 | |
|     @param gpu_matches Matches, returned from DescriptorMatcher::matchAsync.
 | |
|     @param matches Vector of DMatch objects.
 | |
|      */
 | |
|     virtual void matchConvert(InputArray gpu_matches,
 | |
|                               std::vector<DMatch>& matches) = 0;
 | |
| 
 | |
|     //
 | |
|     // knn match
 | |
|     //
 | |
| 
 | |
|     /** @brief Finds the k best matches for each descriptor from a query set (blocking version).
 | |
| 
 | |
|     @param queryDescriptors Query set of descriptors.
 | |
|     @param trainDescriptors Train set of descriptors. This set is not added to the train descriptors
 | |
|     collection stored in the class object.
 | |
|     @param matches Matches. Each matches[i] is k or less matches for the same query descriptor.
 | |
|     @param k Count of best matches found per each query descriptor or less if a query descriptor has
 | |
|     less than k possible matches in total.
 | |
|     @param mask Mask specifying permissible matches between an input query and train matrices of
 | |
|     descriptors.
 | |
|     @param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is
 | |
|     false, the matches vector has the same size as queryDescriptors rows. If compactResult is true,
 | |
|     the matches vector does not contain matches for fully masked-out query descriptors.
 | |
| 
 | |
|     These extended variants of DescriptorMatcher::match methods find several best matches for each query
 | |
|     descriptor. The matches are returned in the distance increasing order. See DescriptorMatcher::match
 | |
|     for the details about query and train descriptors.
 | |
|      */
 | |
|     virtual void knnMatch(InputArray queryDescriptors, InputArray trainDescriptors,
 | |
|                           std::vector<std::vector<DMatch> >& matches,
 | |
|                           int k,
 | |
|                           InputArray mask = noArray(),
 | |
|                           bool compactResult = false) = 0;
 | |
| 
 | |
|     /** @overload
 | |
|      */
 | |
|     virtual void knnMatch(InputArray queryDescriptors,
 | |
|                           std::vector<std::vector<DMatch> >& matches,
 | |
|                           int k,
 | |
|                           const std::vector<GpuMat>& masks = std::vector<GpuMat>(),
 | |
|                           bool compactResult = false) = 0;
 | |
| 
 | |
|     /** @brief Finds the k best matches for each descriptor from a query set (asynchronous version).
 | |
| 
 | |
|     @param queryDescriptors Query set of descriptors.
 | |
|     @param trainDescriptors Train set of descriptors. This set is not added to the train descriptors
 | |
|     collection stored in the class object.
 | |
|     @param matches Matches array stored in GPU memory. Internal representation is not defined.
 | |
|     Use DescriptorMatcher::knnMatchConvert method to retrieve results in standard representation.
 | |
|     @param k Count of best matches found per each query descriptor or less if a query descriptor has
 | |
|     less than k possible matches in total.
 | |
|     @param mask Mask specifying permissible matches between an input query and train matrices of
 | |
|     descriptors.
 | |
|     @param stream CUDA stream.
 | |
| 
 | |
|     These extended variants of DescriptorMatcher::matchAsync methods find several best matches for each query
 | |
|     descriptor. The matches are returned in the distance increasing order. See DescriptorMatcher::matchAsync
 | |
|     for the details about query and train descriptors.
 | |
|      */
 | |
|     virtual void knnMatchAsync(InputArray queryDescriptors, InputArray trainDescriptors,
 | |
|                                OutputArray matches,
 | |
|                                int k,
 | |
|                                InputArray mask = noArray(),
 | |
|                                Stream& stream = Stream::Null()) = 0;
 | |
| 
 | |
|     /** @overload
 | |
|      */
 | |
|     virtual void knnMatchAsync(InputArray queryDescriptors,
 | |
|                                OutputArray matches,
 | |
|                                int k,
 | |
|                                const std::vector<GpuMat>& masks = std::vector<GpuMat>(),
 | |
|                                Stream& stream = Stream::Null()) = 0;
 | |
| 
 | |
|     /** @brief Converts matches array from internal representation to standard matches vector.
 | |
| 
 | |
|     The method is supposed to be used with DescriptorMatcher::knnMatchAsync to get final result.
 | |
|     Call this method only after DescriptorMatcher::knnMatchAsync is completed (ie. after synchronization).
 | |
| 
 | |
|     @param gpu_matches Matches, returned from DescriptorMatcher::knnMatchAsync.
 | |
|     @param matches Vector of DMatch objects.
 | |
|     @param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is
 | |
|     false, the matches vector has the same size as queryDescriptors rows. If compactResult is true,
 | |
|     the matches vector does not contain matches for fully masked-out query descriptors.
 | |
|      */
 | |
|     virtual void knnMatchConvert(InputArray gpu_matches,
 | |
|                                  std::vector< std::vector<DMatch> >& matches,
 | |
|                                  bool compactResult = false) = 0;
 | |
| 
 | |
|     //
 | |
|     // radius match
 | |
|     //
 | |
| 
 | |
|     /** @brief For each query descriptor, finds the training descriptors not farther than the specified distance (blocking version).
 | |
| 
 | |
|     @param queryDescriptors Query set of descriptors.
 | |
|     @param trainDescriptors Train set of descriptors. This set is not added to the train descriptors
 | |
|     collection stored in the class object.
 | |
|     @param matches Found matches.
 | |
|     @param maxDistance Threshold for the distance between matched descriptors. Distance means here
 | |
|     metric distance (e.g. Hamming distance), not the distance between coordinates (which is measured
 | |
|     in Pixels)!
 | |
|     @param mask Mask specifying permissible matches between an input query and train matrices of
 | |
|     descriptors.
 | |
|     @param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is
 | |
|     false, the matches vector has the same size as queryDescriptors rows. If compactResult is true,
 | |
|     the matches vector does not contain matches for fully masked-out query descriptors.
 | |
| 
 | |
|     For each query descriptor, the methods find such training descriptors that the distance between the
 | |
|     query descriptor and the training descriptor is equal or smaller than maxDistance. Found matches are
 | |
|     returned in the distance increasing order.
 | |
|      */
 | |
|     virtual void radiusMatch(InputArray queryDescriptors, InputArray trainDescriptors,
 | |
|                              std::vector<std::vector<DMatch> >& matches,
 | |
|                              float maxDistance,
 | |
|                              InputArray mask = noArray(),
 | |
|                              bool compactResult = false) = 0;
 | |
| 
 | |
|     /** @overload
 | |
|      */
 | |
|     virtual void radiusMatch(InputArray queryDescriptors,
 | |
|                              std::vector<std::vector<DMatch> >& matches,
 | |
|                              float maxDistance,
 | |
|                              const std::vector<GpuMat>& masks = std::vector<GpuMat>(),
 | |
|                              bool compactResult = false) = 0;
 | |
| 
 | |
|     /** @brief For each query descriptor, finds the training descriptors not farther than the specified distance (asynchronous version).
 | |
| 
 | |
|     @param queryDescriptors Query set of descriptors.
 | |
|     @param trainDescriptors Train set of descriptors. This set is not added to the train descriptors
 | |
|     collection stored in the class object.
 | |
|     @param matches Matches array stored in GPU memory. Internal representation is not defined.
 | |
|     Use DescriptorMatcher::radiusMatchConvert method to retrieve results in standard representation.
 | |
|     @param maxDistance Threshold for the distance between matched descriptors. Distance means here
 | |
|     metric distance (e.g. Hamming distance), not the distance between coordinates (which is measured
 | |
|     in Pixels)!
 | |
|     @param mask Mask specifying permissible matches between an input query and train matrices of
 | |
|     descriptors.
 | |
|     @param stream CUDA stream.
 | |
| 
 | |
|     For each query descriptor, the methods find such training descriptors that the distance between the
 | |
|     query descriptor and the training descriptor is equal or smaller than maxDistance. Found matches are
 | |
|     returned in the distance increasing order.
 | |
|      */
 | |
|     virtual void radiusMatchAsync(InputArray queryDescriptors, InputArray trainDescriptors,
 | |
|                                   OutputArray matches,
 | |
|                                   float maxDistance,
 | |
|                                   InputArray mask = noArray(),
 | |
|                                   Stream& stream = Stream::Null()) = 0;
 | |
| 
 | |
|     /** @overload
 | |
|      */
 | |
|     virtual void radiusMatchAsync(InputArray queryDescriptors,
 | |
|                                   OutputArray matches,
 | |
|                                   float maxDistance,
 | |
|                                   const std::vector<GpuMat>& masks = std::vector<GpuMat>(),
 | |
|                                   Stream& stream = Stream::Null()) = 0;
 | |
| 
 | |
|     /** @brief Converts matches array from internal representation to standard matches vector.
 | |
| 
 | |
|     The method is supposed to be used with DescriptorMatcher::radiusMatchAsync to get final result.
 | |
|     Call this method only after DescriptorMatcher::radiusMatchAsync is completed (ie. after synchronization).
 | |
| 
 | |
|     @param gpu_matches Matches, returned from DescriptorMatcher::radiusMatchAsync.
 | |
|     @param matches Vector of DMatch objects.
 | |
|     @param compactResult Parameter used when the mask (or masks) is not empty. If compactResult is
 | |
|     false, the matches vector has the same size as queryDescriptors rows. If compactResult is true,
 | |
|     the matches vector does not contain matches for fully masked-out query descriptors.
 | |
|      */
 | |
|     virtual void radiusMatchConvert(InputArray gpu_matches,
 | |
|                                     std::vector< std::vector<DMatch> >& matches,
 | |
|                                     bool compactResult = false) = 0;
 | |
| };
 | |
| 
 | |
| //
 | |
| // Feature2DAsync
 | |
| //
 | |
| 
 | |
| /** @brief Abstract base class for CUDA asynchronous 2D image feature detectors and descriptor extractors.
 | |
|  */
 | |
| class CV_EXPORTS Feature2DAsync
 | |
| {
 | |
| public:
 | |
|     virtual ~Feature2DAsync();
 | |
| 
 | |
|     /** @brief Detects keypoints in an image.
 | |
| 
 | |
|     @param image Image.
 | |
|     @param keypoints The detected keypoints.
 | |
|     @param mask Mask specifying where to look for keypoints (optional). It must be a 8-bit integer
 | |
|     matrix with non-zero values in the region of interest.
 | |
|     @param stream CUDA stream.
 | |
|      */
 | |
|     virtual void detectAsync(InputArray image,
 | |
|                              OutputArray keypoints,
 | |
|                              InputArray mask = noArray(),
 | |
|                              Stream& stream = Stream::Null());
 | |
| 
 | |
|     /** @brief Computes the descriptors for a set of keypoints detected in an image.
 | |
| 
 | |
|     @param image Image.
 | |
|     @param keypoints Input collection of keypoints.
 | |
|     @param descriptors Computed descriptors. Row j is the descriptor for j-th keypoint.
 | |
|     @param stream CUDA stream.
 | |
|      */
 | |
|     virtual void computeAsync(InputArray image,
 | |
|                               OutputArray keypoints,
 | |
|                               OutputArray descriptors,
 | |
|                               Stream& stream = Stream::Null());
 | |
| 
 | |
|     /** Detects keypoints and computes the descriptors. */
 | |
|     virtual void detectAndComputeAsync(InputArray image,
 | |
|                                        InputArray mask,
 | |
|                                        OutputArray keypoints,
 | |
|                                        OutputArray descriptors,
 | |
|                                        bool useProvidedKeypoints = false,
 | |
|                                        Stream& stream = Stream::Null());
 | |
| 
 | |
|     /** Converts keypoints array from internal representation to standard vector. */
 | |
|     virtual void convert(InputArray gpu_keypoints,
 | |
|                          std::vector<KeyPoint>& keypoints) = 0;
 | |
| };
 | |
| 
 | |
| //
 | |
| // FastFeatureDetector
 | |
| //
 | |
| 
 | |
| /** @brief Wrapping class for feature detection using the FAST method.
 | |
|  */
 | |
| class CV_EXPORTS FastFeatureDetector : public cv::FastFeatureDetector, public Feature2DAsync
 | |
| {
 | |
| public:
 | |
|     enum
 | |
|     {
 | |
|         LOCATION_ROW = 0,
 | |
|         RESPONSE_ROW,
 | |
|         ROWS_COUNT,
 | |
| 
 | |
|         FEATURE_SIZE = 7
 | |
|     };
 | |
| 
 | |
|     static Ptr<FastFeatureDetector> create(int threshold=10,
 | |
|                                            bool nonmaxSuppression=true,
 | |
|                                            int type=FastFeatureDetector::TYPE_9_16,
 | |
|                                            int max_npoints = 5000);
 | |
| 
 | |
|     virtual void setMaxNumPoints(int max_npoints) = 0;
 | |
|     virtual int getMaxNumPoints() const = 0;
 | |
| };
 | |
| 
 | |
| //
 | |
| // ORB
 | |
| //
 | |
| 
 | |
| /** @brief Class implementing the ORB (*oriented BRIEF*) keypoint detector and descriptor extractor
 | |
|  *
 | |
|  * @sa cv::ORB
 | |
|  */
 | |
| class CV_EXPORTS ORB : public cv::ORB, public Feature2DAsync
 | |
| {
 | |
| public:
 | |
|     enum
 | |
|     {
 | |
|         X_ROW = 0,
 | |
|         Y_ROW,
 | |
|         RESPONSE_ROW,
 | |
|         ANGLE_ROW,
 | |
|         OCTAVE_ROW,
 | |
|         SIZE_ROW,
 | |
|         ROWS_COUNT
 | |
|     };
 | |
| 
 | |
|     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);
 | |
| 
 | |
|     //! if true, image will be blurred before descriptors calculation
 | |
|     virtual void setBlurForDescriptor(bool blurForDescriptor) = 0;
 | |
|     virtual bool getBlurForDescriptor() const = 0;
 | |
| };
 | |
| 
 | |
| //! @}
 | |
| 
 | |
| }} // namespace cv { namespace cuda {
 | |
| 
 | |
| #endif /* __OPENCV_CUDAFEATURES2D_HPP__ */
 | 
