16 #include <mrpt/3rdparty/do_opencv_includes.h>    17 #ifdef HAVE_OPENCV_NONFREE  // MRPT_HAS_OPENCV_NONFREE    18 #include <opencv2/nonfree/nonfree.hpp>    20 #ifdef HAVE_OPENCV_FEATURES2D    21 #include <opencv2/features2d/features2d.hpp>    23 #ifdef HAVE_OPENCV_XFEATURES2D    24 #include <opencv2/xfeatures2d.hpp>    40     unsigned int nDesiredFeatures, 
const TImageROI& ROI)
    44     bool usingROI = 
false;
    64         img_grayscale.
swap(auximg);
    67     switch (options.SIFTOptions.implementation)
    72                 "CSBinary SIFT not available since MRPT 1.9.9: "    73                 "Use `OpenCV` version");
    79                 "Vedaldi SIFT not available since MRPT 1.9.9: "    80                 "Use `OpenCV` version");
    86                 "LoweBinary not available since MRPT 1.9.9: "    87                 "Use `OpenCV` version");
    93                 "Hess SIFT not available since MRPT 1.9.9: "    94                 "Use `OpenCV` version");
   102 #if defined(HAVE_OPENCV_NONFREE) || defined(HAVE_OPENCV_XFEATURES2D)   104 #if MRPT_OPENCV_VERSION_NUM < 0x300   105             SiftFeatureDetector SIFTDetector(
   106                 options.SIFTOptions.threshold,
   107                 options.SIFTOptions.edgeThreshold);
   109             SiftDescriptorExtractor SIFTDescriptor;
   110             vector<KeyPoint> cv_feats;  
   111             const Mat& theImg = img_grayscale.
asCvMatRef();
   112             SIFTDetector.detect(theImg, cv_feats);
   114             SIFTDescriptor.compute(theImg, cv_feats, desc);
   118             vector<KeyPoint> cv_feats;
   120             auto sift = cv::xfeatures2d::SIFT::create(
   121                 nDesiredFeatures, options.SIFTOptions.octaveLayers,
   122                 options.SIFTOptions.threshold,
   123                 options.SIFTOptions.edgeThreshold, 1.6);
   124             const Mat& theImg = img_grayscale.
asCvMatRef();
   126             sift->detectAndCompute(theImg, noArray() , cv_feats, desc);
   128             const size_t N = cv_feats.size();
   130             unsigned int nMax = nDesiredFeatures != 0 && N > nDesiredFeatures
   133             const int offset = (int)this->options.patchSize / 2 + 1;
   134             const size_t size_2 = options.patchSize / 2;
   138             unsigned int cont = 0;
   142             while (cont != nMax && i != N)
   144                 const int xBorderInf = (int)floor(cv_feats[i].pt.x - size_2);
   145                 const int xBorderSup = (int)floor(cv_feats[i].pt.x + size_2);
   146                 const int yBorderInf = (int)floor(cv_feats[i].pt.y - size_2);
   147                 const int yBorderSup = (int)floor(cv_feats[i].pt.y + size_2);
   149                 if (options.patchSize == 0 ||
   150                     ((xBorderSup < (
int)imgW) && (xBorderInf > 0) &&
   151                      (yBorderSup < (int)imgH) && (yBorderInf > 0)))
   167                     out_desc.resize(128);
   169                         &out_desc[0], &desc.data[128 * i],
   170                         128 * 
sizeof(out_desc[0]));
   172                     if (options.patchSize > 0)
   179                         ft.
patch = std::move(p);
   189                 "This method requires OpenCV >= 2.1.1 with nonfree module");
   206         profiler, 
"internal_computeSiftDescriptors");
   211         "SIFT Extraction method not supported for features with already known "   212         "image coordinates");
 
uint64_t TFeatureID
Definition of a feature ID. 
 
#define THROW_EXCEPTION(msg)
 
A safe way to call enter() and leave() of a mrpt::system::CTimeLogger upon construction and destructi...
 
size_t size(const MATRIXLIKE &m, const int dim)
 
TKeyPointMethod type
Keypoint method used to detect this feature. 
 
cv::Mat & asCvMatRef()
Get a reference to the internal cv::Mat, which can be resized, etc. 
 
size_t getHeight() const override
Returns the height of the image in pixels. 
 
Scale Invariant Feature Transform [LOWE'04]. 
 
TFeatureID ID
ID of the feature. 
 
void swap(CImage &o)
Efficiently swap of two images. 
 
A structure for defining a ROI within an image. 
 
size_t yMin
Y coordinate limits [0,imageHeight) 
 
#define ASSERT_(f)
Defines an assertion mechanism. 
 
void push_back(const CFeature &f)
 
This base provides a set of functions for maths stuff. 
 
size_t getWidth() const override
Returns the width of the image in pixels. 
 
std::optional< mrpt::img::CImage > patch
A patch of the image surrounding the feature. 
 
Classes for computer vision, detectors, features, etc. 
 
A generic 2D feature from an image, extracted with CFeatureExtraction Each feature may have one or mo...
 
A list of visual features, to be used as output by detectors, as input/output by trackers, etc. 
 
size_t xMin
X coordinate limits [0,imageWidth) 
 
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries. 
 
std::optional< std::vector< uint8_t > > SIFT
SIFT feature descriptor. 
 
uint8_t octave
The image octave the image was found in: 0=original image, 1=1/2 image, 2=1/4 image, etc. 
 
void extract_patch(CImage &patch, const unsigned int col=0, const unsigned int row=0, const unsigned int width=1, const unsigned int height=1) const
Extract a patch from this image, saveing it into "patch" (its previous contents will be overwritten)...
 
float orientation
Main orientation of the feature. 
 
float response
A measure of the "goodness" of the feature (typically, the KLT_response value) 
 
uint16_t patchSize
Size of the patch (patchSize x patchSize) (it must be an odd number) 
 
pixel_coords_t pt
Coordinates in the image. 
 
A class for storing images as grayscale or RGB bitmaps. 
 
void memcpy(void *dest, size_t destSize, const void *src, size_t copyCount) noexcept
An OS and compiler independent version of "memcpy". 
 
int round(const T value)
Returns the closer integer (int) to x.