43 #ifndef __OPENCV_FEATURES_2D_HPP__
44 #define __OPENCV_FEATURES_2D_HPP__
47 #include "opencv2/flann/flann.hpp"
123 int max_area CV_DEFAULT(14400),
float max_variation CV_DEFAULT(.25f),
124 float min_diversity CV_DEFAULT(.2f),
int max_evolution CV_DEFAULT(200),
125 double area_threshold CV_DEFAULT(1.01),
126 double min_margin CV_DEFAULT(.003),
127 int edge_blur_size CV_DEFAULT(5) );
223 CV_WRAP KeyPoint() : pt(0,0), size(0), angle(-1), response(0), octave(0), class_id(-1) {}
226 float _response=0,
int _octave=0,
int _class_id=-1)
227 : pt(_pt), size(_size), angle(_angle),
228 response(_response), octave(_octave), class_id(_class_id) {}
231 float _response=0,
int _octave=0,
int _class_id=-1)
232 : pt(x, y), size(_size), angle(_angle),
233 response(_response), octave(_octave), class_id(_class_id) {}
235 static void convert(
const std::vector<KeyPoint>& keypoints,
236 CV_OUT std::vector<Point2f>& points2f,
237 const std::vector<int>& keypointIndexes=std::vector<int>());
239 static void convert(
const std::vector<Point2f>& points2f,
240 CV_OUT std::vector<KeyPoint>& keypoints,
241 float size=1,
float response=1,
int octave=0,
int class_id=-1);
271 static const int DEFAULT_NOCTAVES = 4;
272 static const int DEFAULT_NOCTAVE_LAYERS = 3;
273 static const int DEFAULT_FIRST_OCTAVE = -1;
274 enum{ FIRST_ANGLE = 0, AVERAGE_ANGLE = 1 };
277 CommonParams(
int _nOctaves,
int _nOctaveLayers,
int _firstOctave,
int _angleMode );
295 static const bool DEFAULT_IS_NORMALIZE =
true;
296 static const int DESCRIPTOR_SIZE = 128;
299 DescriptorParams(
double _magnification,
bool _isNormalize,
bool _recalculateAngles );
307 SIFT(
double _threshold,
double _edgeThreshold,
308 int _nOctaves=CommonParams::DEFAULT_NOCTAVES,
309 int _nOctaveLayers=CommonParams::DEFAULT_NOCTAVE_LAYERS,
310 int _firstOctave=CommonParams::DEFAULT_FIRST_OCTAVE,
311 int _angleMode=CommonParams::FIRST_ANGLE );
313 SIFT(
double _magnification,
bool _isNormalize=
true,
314 bool _recalculateAngles =
true,
315 int _nOctaves=CommonParams::DEFAULT_NOCTAVES,
316 int _nOctaveLayers=CommonParams::DEFAULT_NOCTAVE_LAYERS,
317 int _firstOctave=CommonParams::DEFAULT_FIRST_OCTAVE,
318 int _angleMode=CommonParams::FIRST_ANGLE );
326 void operator()(
const Mat& img,
const Mat&
mask,
327 vector<KeyPoint>& keypoints)
const;
330 void operator()(
const Mat& img,
const Mat&
mask,
331 vector<KeyPoint>& keypoints,
333 bool useProvidedKeypoints=
false)
const;
356 CV_WRAP SURF(
double _hessianThreshold,
int _nOctaves=4,
357 int _nOctaveLayers=2,
bool _extended=
false);
360 CV_WRAP int descriptorSize()
const;
367 CV_OUT vector<
float>& descriptors,
368 bool useProvidedKeypoints=false) const;
386 CV_WRAP MSER(
int _delta,
int _min_area,
int _max_area,
387 double _max_variation,
double _min_diversity,
388 int _max_evolution,
double _area_threshold,
389 double _min_margin,
int _edge_blur_size );
392 CV_OUT vector<vector<Point> >& msers,
const Mat& mask )
const;
406 CV_WRAP StarDetector(
int _maxSize,
int _responseThreshold,
407 int _lineThresholdProjected,
408 int _lineThresholdBinarized,
409 int _suppressNonmaxSize);
412 CV_OUT vector<KeyPoint>& keypoints)
const;
417 int threshold,
bool nonmaxSupression=
true );
427 double _noiseRange,
bool _randomBlur=
true,
428 double _lambdaMin=0.6,
double _lambdaMax=1.5,
429 double _thetaMin=-
CV_PI,
double _thetaMax=
CV_PI,
430 double _phiMin=-
CV_PI,
double _phiMax=
CV_PI );
433 Size patchSize,
RNG& rng)
const;
434 void warpWholeImage(
const Mat& image,
Mat& matT,
Mat& buf,
436 void generateRandomTransform(
Point2f srcCenter,
Point2f dstCenter,
438 bool inverse=
false)
const;
439 void setAffineParam(
double lambda,
double theta,
double phi);
454 LDetector(
int _radius,
int _threshold,
int _nOctaves,
455 int _nViews,
double _baseFeatureSize,
double _clusteringDistance);
456 void operator()(
const Mat& image,
457 CV_OUT vector<KeyPoint>& keypoints,
458 int maxCount=0,
bool scaleCoords=
true)
const;
459 void operator()(
const vector<Mat>& pyr,
460 CV_OUT vector<KeyPoint>& keypoints,
461 int maxCount=0,
bool scaleCoords=
true)
const;
462 void getMostStable2D(
const Mat& image,
CV_OUT vector<KeyPoint>& keypoints,
464 void setVerbose(
bool verbose);
487 const vector<Mat>& refimgs,
488 const vector<vector<int> >& labels=vector<vector<int> >(),
489 int _nclasses=0,
int _patchSize=PATCH_SIZE,
490 int _signatureSize=DEFAULT_SIGNATURE_SIZE,
491 int _nstructs=DEFAULT_STRUCTS,
492 int _structSize=DEFAULT_STRUCT_SIZE,
493 int _nviews=DEFAULT_VIEWS,
494 int _compressionMethod=COMPRESSION_NONE,
499 virtual void trainFromSingleView(
const Mat& image,
500 const vector<KeyPoint>& keypoints,
501 int _patchSize=PATCH_SIZE,
502 int _signatureSize=DEFAULT_SIGNATURE_SIZE,
503 int _nstructs=DEFAULT_STRUCTS,
504 int _structSize=DEFAULT_STRUCT_SIZE,
505 int _nviews=DEFAULT_VIEWS,
506 int _compressionMethod=COMPRESSION_NONE,
508 virtual void train(
const vector<vector<Point2f> >& points,
509 const vector<Mat>& refimgs,
510 const vector<vector<int> >& labels=vector<vector<int> >(),
511 int _nclasses=0,
int _patchSize=PATCH_SIZE,
512 int _signatureSize=DEFAULT_SIGNATURE_SIZE,
513 int _nstructs=DEFAULT_STRUCTS,
514 int _structSize=DEFAULT_STRUCT_SIZE,
515 int _nviews=DEFAULT_VIEWS,
516 int _compressionMethod=COMPRESSION_NONE,
518 virtual int operator()(
const Mat& img,
Point2f kpt, vector<float>& signature)
const;
519 virtual int operator()(
const Mat& patch, vector<float>& signature)
const;
520 virtual void clear();
521 void setVerbose(
bool verbose);
523 int getClassCount()
const;
524 int getStructCount()
const;
525 int getStructSize()
const;
526 int getSignatureSize()
const;
527 int getCompressionMethod()
const;
528 Size getPatchSize()
const;
537 template<
typename _Tp>
bool operator ()(
const Mat_<_Tp>& patch)
const
538 {
return patch(y1,x1) > patch(y2, x2); }
544 DEFAULT_STRUCTS = 50,
545 DEFAULT_STRUCT_SIZE = 9,
546 DEFAULT_VIEWS = 5000,
547 DEFAULT_SIGNATURE_SIZE = 176,
548 COMPRESSION_NONE = 0,
549 COMPRESSION_RANDOM_PROJ = 1,
551 DEFAULT_COMPRESSION_METHOD = COMPRESSION_NONE
555 virtual void prepare(
int _nclasses,
int _patchSize,
int _signatureSize,
556 int _nstructs,
int _structSize,
557 int _nviews,
int _compressionMethod);
558 virtual void finalize(
RNG& rng);
559 virtual int getLeaf(
int fidx,
const Mat& patch)
const;
588 virtual void train(
const vector<Mat>& pyr,
int _npoints=300,
595 virtual void train(
const vector<Mat>& pyr,
const vector<KeyPoint>& keypoints,
602 Rect getModelROI()
const;
603 vector<KeyPoint> getModelPoints()
const;
606 void setVerbose(
bool verbose);
610 bool operator()(
const Mat& image,
CV_OUT Mat& H,
CV_OUT vector<Point2f>& corners)
const;
611 bool operator()(
const vector<Mat>& pyr,
const vector<KeyPoint>& keypoints,
613 CV_OUT vector<int>* pairs=0)
const;
636 :
x(0),
y(0), image(NULL)
640 : x(x), y(y), image(image)
650 static const int DEFAULT_DEPTH = 9;
651 static const int DEFAULT_VIEWS = 5000;
652 static const size_t DEFAULT_REDUCED_NUM_DIM = 176;
659 void train(std::vector<BaseKeypoint>
const& base_set,
RNG &rng,
660 int depth,
int views,
size_t reduced_num_dim,
int num_quant_bits);
661 void train(std::vector<BaseKeypoint>
const& base_set,
RNG &rng,
662 PatchGenerator &make_patch,
int depth,
int views,
size_t reduced_num_dim,
666 static void quantizeVector(
float *vec,
int dim,
int N,
float bnds[2],
int clamp_mode=0);
667 static void quantizeVector(
float *src,
int dim,
int N,
float bnds[2],
uchar *
dst);
670 float* getPosterior(
uchar* patch_data);
671 const float* getPosterior(
uchar* patch_data)
const;
673 const uchar* getPosterior2(
uchar* patch_data)
const;
675 void read(
const char* file_name,
int num_quant_bits);
676 void read(std::istream &is,
int num_quant_bits);
677 void write(
const char* file_name)
const;
678 void write(std::ostream &os)
const;
689 void savePosteriors(std::string url,
bool append=
false);
690 void savePosteriors2(std::string url,
bool append=
false);
696 std::vector<RTreeNode> nodes_;
698 uchar **posteriors2_;
699 std::vector<int> leaf_counts_;
701 void createNodes(
int num_nodes,
RNG &rng);
702 void allocPosteriorsAligned(
int num_leaves,
int num_classes);
703 void freePosteriors(
int which);
704 void init(
int classes,
int depth,
RNG &rng);
705 void addExample(
int class_id,
uchar* patch_data);
706 void finalize(
size_t reduced_num_dim,
int num_quant_bits);
707 int getIndex(
uchar* patch_data)
const;
708 inline float* getPosteriorByIndex(
int index);
709 inline const float* getPosteriorByIndex(
int index)
const;
710 inline uchar* getPosteriorByIndex2(
int index);
711 inline const uchar* getPosteriorByIndex2(
int index)
const;
713 void convertPosteriorsToChar();
714 void makePosteriors2(
int num_quant_bits);
715 void compressLeaves(
size_t reduced_num_dim);
716 void estimateQuantPercForPosteriors(
float perc[2]);
725 inline float* RandomizedTree::getPosteriorByIndex(
int index)
727 return const_cast<float*
>(
const_cast<const RandomizedTree*
>(
this)->getPosteriorByIndex(index));
730 inline const float* RandomizedTree::getPosteriorByIndex(
int index)
const
732 return posteriors_[index];
735 inline uchar* RandomizedTree::getPosteriorByIndex2(
int index)
737 return const_cast<uchar*
>(
const_cast<const RandomizedTree*
>(
this)->getPosteriorByIndex2(index));
740 inline const uchar* RandomizedTree::getPosteriorByIndex2(
int index)
const
742 return posteriors2_[index];
756 inline bool operator() (
uchar* patch_data)
const
758 return patch_data[offset1] > patch_data[offset2];
765 static const int DEFAULT_TREES = 48;
766 static const size_t DEFAULT_NUM_QUANT_BITS = 4;
769 void train(std::vector<BaseKeypoint>
const& base_set,
775 int num_quant_bits = DEFAULT_NUM_QUANT_BITS);
776 void train(std::vector<BaseKeypoint>
const& base_set,
783 int num_quant_bits = DEFAULT_NUM_QUANT_BITS);
787 void getSignature(
IplImage *patch,
float *sig)
const;
788 void getSparseSignature(
IplImage *patch,
float *sig,
float thresh)
const;
792 static int countNonZeroElements(
float *vec,
int n,
double tol=1e-10);
793 static inline void safeSignatureAlloc(
uchar **sig,
int num_sig=1,
int sig_len=176);
794 static inline uchar* safeSignatureAlloc(
int num_sig=1,
int sig_len=176);
796 inline int classes()
const {
return classes_; }
799 void setQuantization(
int num_quant_bits);
800 void discardFloatPosteriors();
802 void read(
const char* file_name);
803 void read(std::istream &is);
804 void write(
const char* file_name)
const;
805 void write(std::ostream &os)
const;
808 void saveAllFloatPosteriors(std::string file_url);
809 void saveAllBytePosteriors(std::string file_url);
810 void setFloatPosteriorsFromTextfile_176(std::string url);
811 float countZeroElements();
818 mutable uchar **posteriors_;
819 mutable unsigned short *ptemp_;
820 int original_num_classes_;
835 void Allocate(
int pose_count,
CvSize size,
int nChannels);
842 void GenerateSamples(
int pose_count,
IplImage* frontal,
int norm = 0);
851 void GenerateSamplesFast(
IplImage* frontal,
CvMat* pca_hr_avg,
862 void Initialize(
int pose_count,
IplImage* frontal,
const char* feature_name = 0,
int norm = 0);
872 void InitializeFast(
int pose_count,
IplImage* frontal,
const char* feature_name,
885 void InitializePCACoeffs(
CvMat* avg,
CvMat* eigenvectors);
891 void EstimatePose(
IplImage* patch,
int& pose_idx,
float& distance)
const;
900 void EstimatePosePCA(
CvArr* patch,
int& pose_idx,
float& distance,
CvMat* avg,
CvMat* eigenvalues)
const;
912 return cvSize(m_patch_size.width*2, m_patch_size.height*2);
926 void Save(
const char* path);
939 int ReadByName(
const FileNode &parent,
const char* name);
947 const char* GetFeatureName()
const;
955 int GetPCADimLow()
const;
956 int GetPCADimHigh()
const;
993 const char* pca_hr_config = 0,
const char* pca_desc_config = 0,
int pyr_levels = 1,
994 int pca_dim_high = 100,
int pca_dim_low = 100);
996 OneWayDescriptorBase(
CvSize patch_size,
int pose_count,
const string &pca_filename,
const string &train_path =
string(),
const string &images_list =
string(),
997 float _scale_min = 0.7f,
float _scale_max=1.5f,
float _scale_step=1.2f,
int pyr_levels = 1,
998 int pca_dim_high = 100,
int pca_dim_low = 100);
1006 void Allocate(
int train_feature_count);
1009 void AllocatePCADescriptors();
1026 void CreateDescriptorsFromImage(
IplImage* src,
const std::vector<cv::KeyPoint>& features);
1029 void CreatePCADescriptors();
1041 void FindDescriptor(
IplImage* patch,
int& desc_idx,
int& pose_idx,
float& distance,
float* _scale = 0,
float* scale_ranges = 0)
const;
1050 void FindDescriptor(
IplImage* patch,
int n, std::vector<int>& desc_idxs, std::vector<int>& pose_idxs,
1051 std::vector<float>& distances, std::vector<float>& _scales,
float* scale_ranges = 0)
const;
1059 void FindDescriptor(
IplImage* src,
cv::Point2f pt,
int& desc_idx,
int& pose_idx,
float& distance)
const;
1062 void InitializePoses();
1065 void InitializeTransformsFromPoses();
1068 void InitializePoseTransforms();
1074 void InitializeDescriptor(
int desc_idx,
IplImage* train_image,
const char* feature_label);
1076 void InitializeDescriptor(
int desc_idx,
IplImage* train_image,
const cv::KeyPoint& keypoint,
const char* feature_label);
1079 void InitializeDescriptors(
IplImage* train_image,
const vector<cv::KeyPoint>& features,
1080 const char* feature_label =
"",
int desc_start_idx = 0);
1092 int LoadPCADescriptors(
const char* filename);
1096 int LoadPCADescriptors(
const FileNode &fn);
1100 void SavePCADescriptors(
const char* filename);
1109 void GeneratePCA(
const char* img_path,
const char* images_list,
int pose_count=500);
1112 void SetPCAHigh(
CvMat* avg,
CvMat* eigenvectors);
1115 void SetPCALow(
CvMat* avg,
CvMat* eigenvectors);
1120 *eigenvectors = m_pca_eigenvectors;
1121 return m_pca_dim_low;
1127 void ConvertDescriptorsArrayToTree();
1163 void LoadPCAall (
const FileNode &fn);
1178 const char* pca_hr_config = 0,
const char* pca_desc_config = 0,
int pyr_levels = 1);
1181 const string &train_path =
string (),
const string &images_list =
string (),
1182 float _scale_min = 0.7f,
float _scale_max=1.5f,
float _scale_step=1.2f,
int pyr_levels = 1);
1190 void Allocate(
int train_feature_count,
int object_feature_count);
1196 vector<cv::KeyPoint> _GetLabeledFeatures()
const;
1199 int IsDescriptorObject(
int desc_idx)
const;
1202 int MatchPointToPart(
CvPoint pt)
const;
1206 int GetDescriptorPart(
int desc_idx)
const;
1209 void InitializeObjectDescriptors(
IplImage* train_image,
const vector<cv::KeyPoint>& features,
1210 const char* feature_label,
int desc_start_idx = 0,
float scale = 1.0f,
1211 int is_background = 0);
1214 int GetObjectFeatureCount()
const {
return m_object_feature_count;};
1243 void detect(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1251 void detect(
const vector<Mat>& images, vector<vector<KeyPoint> >& keypoints,
const vector<Mat>& masks=vector<Mat>() )
const;
1262 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const = 0;
1268 static void removeInvalidPoints(
const Mat&
mask, vector<KeyPoint>& keypoints );
1279 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1292 Params(
int maxCorners=1000,
double qualityLevel=0.01,
double minDistance=1.,
1293 int blockSize=3,
bool useHarrisDetector=
false,
double k=0.04 );
1307 int blockSize=3,
bool useHarrisDetector=
false,
double k=0.04 );
1312 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1322 int maxEvolution,
double areaThreshold,
double minMargin,
int edgeBlurSize );
1327 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1336 StarFeatureDetector(
int maxSize,
int responseThreshold=30,
int lineThresholdProjected = 10,
1337 int lineThresholdBinarized=8,
int suppressNonmaxSize=5 );
1342 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1361 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1374 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1385 Params(
float initFeatureScale=1.f,
int featureScaleLevels=1,
float featureScaleMul=0.1f,
1386 int initXyStep=6,
int initImgBound=0,
bool varyXyStepWithScale=
true,
bool varyImgBoundWithScale=
false );
1403 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1423 int gridRows=4,
int gridCols=4 );
1428 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1448 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1467 virtual void tooFew(
int min,
int n_detected) = 0;
1472 virtual void tooMany(
int max,
int n_detected) = 0;
1476 virtual bool good()
const = 0;
1505 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1509 int min_features_, max_features_;
1522 FastAdjuster(
int init_thresh = 20,
bool nonmax =
true);
1523 virtual void tooFew(
int min,
int n_detected);
1524 virtual void tooMany(
int max,
int n_detected);
1525 virtual bool good()
const;
1528 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1542 virtual void tooFew(
int min,
int n_detected);
1543 virtual void tooMany(
int max,
int n_detected);
1544 virtual bool good()
const;
1547 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1557 virtual void tooFew(
int min,
int n_detected);
1558 virtual void tooMany(
int max,
int n_detected);
1559 virtual bool good()
const;
1562 virtual void detectImpl(
const Mat& image, vector<KeyPoint>& keypoints,
const Mat&
mask=
Mat() )
const;
1568 float maxDeltaX,
float maxDeltaY );
1594 void compute(
const Mat& image, vector<KeyPoint>& keypoints,
Mat& descriptors )
const;
1603 void compute(
const vector<Mat>& images, vector<vector<KeyPoint> >& keypoints, vector<Mat>& descriptors )
const;
1608 virtual int descriptorSize()
const = 0;
1609 virtual int descriptorType()
const = 0;
1614 virtual void computeImpl(
const Mat& image, vector<KeyPoint>& keypoints,
Mat& descriptors )
const = 0;
1619 static void removeBorderKeypoints( vector<KeyPoint>& keypoints,
1620 Size imageSize,
int borderSize );
1640 virtual int descriptorSize()
const;
1641 virtual int descriptorType()
const;
1644 virtual void computeImpl(
const Mat& image, vector<KeyPoint>& keypoints,
Mat& descriptors )
const;
1660 virtual int descriptorSize()
const;
1661 virtual int descriptorType()
const;
1664 virtual void computeImpl(
const Mat& image, vector<KeyPoint>& keypoints,
Mat& descriptors )
const;
1672 template<
typename T>
1685 virtual void computeImpl(
const Mat& image, vector<KeyPoint>& keypoints,
Mat& descriptors )
const;
1688 static const int BORDER_SIZE = 16;
1691 template<
typename T>
1694 classifier_.read( classifier_file.c_str() );
1697 template<
typename T>
1699 std::vector<cv::KeyPoint>& keypoints,
1703 removeBorderKeypoints(keypoints, image.
size(), BORDER_SIZE);
1709 int offset = patchSize / 2;
1710 for (
size_t i = 0; i < keypoints.size(); ++i)
1713 IplImage ipl = image(
Rect((
int)(pt.
x - offset), (
int)(pt.
y - offset), patchSize, patchSize) );
1714 classifier_.getSignature( &ipl, descriptors.
ptr<T>(i));
1718 template<
typename T>
1722 template<
typename T>
1743 virtual int descriptorSize()
const;
1744 virtual int descriptorType()
const;
1747 virtual void computeImpl(
const Mat& image, vector<KeyPoint>& keypoints,
Mat& descriptors )
const;
1758 static const int PATCH_SIZE = 48;
1759 static const int KERNEL_SIZE = 9;
1764 virtual int descriptorSize()
const;
1765 virtual int descriptorType()
const;
1770 virtual void computeImpl(
const Mat& image, std::vector<KeyPoint>& keypoints,
Mat& descriptors)
const;
1772 typedef void(*PixelTestFn)(
const Mat&,
const std::vector<KeyPoint>&,
Mat&);
1781 template<
typename T>
1804 for(
int i = 0; i < size; i++ )
1807 result += diff*diff;
1825 for(
int i = 0; i < size; i++ )
1845 ResultType operator()(
const unsigned char* a,
const unsigned char* b,
int size )
const;
1852 static unsigned char byteBitsLookUp(
unsigned char b);
1869 ResultType operator()(
const unsigned char* a,
const unsigned char* b,
int size)
const;
1881 DMatch() : queryIdx(-1), trainIdx(-1), imgIdx(-1), distance(std::numeric_limits<float>::
max()) {}
1882 DMatch(
int _queryIdx,
int _trainIdx,
float _distance ) :
1883 queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(-1), distance(_distance) {}
1884 DMatch(
int _queryIdx,
int _trainIdx,
int _imgIdx,
float _distance ) :
1885 queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(_imgIdx), distance(_distance) {}
1915 virtual void add(
const vector<Mat>& descriptors );
1919 const vector<Mat>& getTrainDescriptors()
const;
1923 virtual void clear();
1932 virtual bool isMaskSupported()
const = 0;
1945 virtual void train();
1951 void match(
const Mat& queryDescriptors,
const Mat& trainDescriptors,
1952 vector<DMatch>& matches,
const Mat&
mask=
Mat() )
const;
1957 void knnMatch(
const Mat& queryDescriptors,
const Mat& trainDescriptors,
1958 vector<vector<DMatch> >& matches,
int k,
1959 const Mat&
mask=
Mat(),
bool compactResult=
false )
const;
1962 void radiusMatch(
const Mat& queryDescriptors,
const Mat& trainDescriptors,
1963 vector<vector<DMatch> >& matches,
float maxDistance,
1964 const Mat&
mask=
Mat(),
bool compactResult=
false )
const;
1969 void match(
const Mat& queryDescriptors, vector<DMatch>& matches,
1970 const vector<Mat>& masks=vector<Mat>() );
1971 void knnMatch(
const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
int k,
1972 const vector<Mat>& masks=vector<Mat>(),
bool compactResult=
false );
1973 void radiusMatch(
const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
float maxDistance,
1974 const vector<Mat>& masks=vector<Mat>(),
bool compactResult=
false );
2000 void set(
const vector<Mat>& descriptors );
2001 virtual void clear();
2003 const Mat& getDescriptors()
const;
2004 const Mat getDescriptor(
int imgIdx,
int localDescIdx )
const;
2005 const Mat getDescriptor(
int globalDescIdx )
const;
2006 void getLocalIdx(
int globalDescIdx,
int& imgIdx,
int& localDescIdx )
const;
2018 virtual void knnMatchImpl(
const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
int k,
2019 const vector<Mat>& masks=vector<Mat>(),
bool compactResult=
false ) = 0;
2020 virtual void radiusMatchImpl(
const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
float maxDistance,
2021 const vector<Mat>& masks=vector<Mat>(),
bool compactResult=
false ) = 0;
2023 static bool isPossibleMatch(
const Mat&
mask,
int queryIdx,
int trainIdx );
2024 static bool isMaskedOut(
const vector<Mat>& masks,
int queryIdx );
2027 void checkMasks(
const vector<Mat>& masks,
int queryDescriptorsCount )
const;
2042 template<
class Distance>
2054 virtual void knnMatchImpl(
const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
int k,
2055 const vector<Mat>& masks=vector<Mat>(),
bool compactResult=
false );
2056 virtual void radiusMatchImpl(
const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
float maxDistance,
2057 const vector<Mat>& masks=vector<Mat>(),
bool compactResult=
false );
2066 const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
int k,
2067 const vector<Mat>& masks,
bool compactResult );
2069 const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
float maxDistance,
2070 const vector<Mat>& masks,
bool compactResult );
2073 template<
class Distance>
2077 if( !emptyTrainData )
2079 transform( trainDescCollection.begin(), trainDescCollection.end(),
2085 template<
class Distance>
2087 const vector<Mat>& masks,
bool compactResult )
2089 commonKnnMatchImpl( *
this, queryDescriptors, matches, k, masks, compactResult );
2092 template<
class Distance>
2094 float maxDistance,
const vector<Mat>& masks,
bool compactResult )
2096 commonRadiusMatchImpl( *
this, queryDescriptors, matches, maxDistance, masks, compactResult );
2099 template<
class Distance>
2101 const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
int knn,
2102 const vector<Mat>& masks,
bool compactResult )
2104 typedef typename Distance::ValueType ValueType;
2105 typedef typename Distance::ResultType DistanceType;
2109 int dimension = queryDescriptors.
cols;
2110 matches.reserve(queryDescriptors.
rows);
2113 vector<Mat> allDists( imgCount );
2114 for(
size_t i = 0; i < imgCount; i++ )
2117 for(
int qIdx = 0; qIdx < queryDescriptors.
rows; qIdx++ )
2121 if( !compactResult )
2127 for(
size_t iIdx = 0; iIdx < imgCount; iIdx++ )
2133 const ValueType* d1 = (
const ValueType*)(queryDescriptors.
data + queryDescriptors.
step*qIdx);
2137 if( masks.empty() || matcher.
isPossibleMatch(masks[iIdx], qIdx, tIdx) )
2141 allDists[iIdx].at<DistanceType>(0, tIdx) = matcher.
distance(d1, d2, dimension);
2147 matches.push_back( vector<DMatch>() );
2148 vector<vector<DMatch> >::reverse_iterator curMatches = matches.rbegin();
2149 for(
int k = 0; k < knn; k++ )
2153 for(
size_t iIdx = 0; iIdx < imgCount; iIdx++ )
2155 if( !allDists[iIdx].empty() )
2159 minMaxLoc( allDists[iIdx], &minVal, 0, &minLoc, 0 );
2160 if( minVal < bestMatch.distance )
2161 bestMatch = DMatch( qIdx, minLoc.x, (
int)iIdx, (
float)minVal );
2164 if( bestMatch.trainIdx == -1 )
2168 curMatches->push_back( bestMatch );
2171 std::sort( curMatches->begin(), curMatches->end() );
2176 template<
class Distance>
2177 inline void BruteForceMatcher<Distance>::commonRadiusMatchImpl( BruteForceMatcher<Distance>& matcher,
2178 const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
float maxDistance,
2179 const vector<Mat>& masks,
bool compactResult )
2181 typedef typename Distance::ValueType ValueType;
2182 typedef typename Distance::ResultType DistanceType;
2184 CV_Assert( DataType<ValueType>::type == queryDescriptors.type() );
2186 int dimension = queryDescriptors.cols;
2187 matches.reserve(queryDescriptors.rows);
2189 size_t imgCount = matcher.trainDescCollection.size();
2190 for(
int qIdx = 0; qIdx < queryDescriptors.rows; qIdx++ )
2192 if( matcher.isMaskedOut( masks, qIdx ) )
2194 if( !compactResult )
2195 matches.push_back( vector<DMatch>() );
2199 matches.push_back( vector<DMatch>() );
2200 vector<vector<DMatch> >::reverse_iterator curMatches = matches.rbegin();
2201 for(
size_t iIdx = 0; iIdx < imgCount; iIdx++ )
2203 CV_Assert( DataType<ValueType>::type == matcher.trainDescCollection[iIdx].type() ||
2204 matcher.trainDescCollection[iIdx].empty() );
2205 CV_Assert( queryDescriptors.cols == matcher.trainDescCollection[iIdx].cols ||
2206 matcher.trainDescCollection[iIdx].empty() );
2208 const ValueType* d1 = (
const ValueType*)(queryDescriptors.data + queryDescriptors.step*qIdx);
2209 for(
int tIdx = 0; tIdx < matcher.trainDescCollection[iIdx].rows; tIdx++ )
2211 if( masks.empty() || matcher.isPossibleMatch(masks[iIdx], qIdx, tIdx) )
2213 const ValueType* d2 = (
const ValueType*)(matcher.trainDescCollection[iIdx].data +
2214 matcher.trainDescCollection[iIdx].step*tIdx);
2215 DistanceType d = matcher.distance(d1, d2, dimension);
2216 if( d < maxDistance )
2217 curMatches->push_back( DMatch( qIdx, tIdx, (
int)iIdx, (
float)d ) );
2221 std::sort( curMatches->begin(), curMatches->end() );
2230 void BruteForceMatcher<L2<float> >::knnMatchImpl(
const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
int k,
2231 const vector<Mat>& masks,
bool compactResult );
2233 void BruteForceMatcher<L2<float> >::radiusMatchImpl(
const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
2234 float maxDistance,
const vector<Mat>& masks,
bool compactResult );
2245 virtual void add(
const vector<Mat>& descriptors );
2246 virtual void clear();
2248 virtual void train();
2249 virtual bool isMaskSupported()
const;
2254 static void convertToDMatches(
const DescriptorCollection& descriptors,
2255 const Mat& indices,
const Mat& distances,
2256 vector<vector<DMatch> >& matches );
2258 virtual void knnMatchImpl(
const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
int k,
2259 const vector<Mat>& masks=vector<Mat>(),
bool compactResult=
false );
2260 virtual void radiusMatchImpl(
const Mat& queryDescriptors, vector<vector<DMatch> >& matches,
float maxDistance,
2261 const vector<Mat>& masks=vector<Mat>(),
bool compactResult=
false );
2296 virtual void add(
const vector<Mat>& images,
2297 vector<vector<KeyPoint> >& keypoints );
2299 const vector<Mat>& getTrainImages()
const;
2300 const vector<vector<KeyPoint> >& getTrainKeypoints()
const;
2305 virtual void clear();
2309 virtual bool isMaskSupported() = 0;
2315 virtual void train();
2325 void classify(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2326 const Mat& trainImage, vector<KeyPoint>& trainKeypoints )
const;
2328 void classify(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints );
2336 void match(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2337 const Mat& trainImage, vector<KeyPoint>& trainKeypoints,
2338 vector<DMatch>& matches,
const Mat&
mask=
Mat() )
const;
2343 void knnMatch(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2344 const Mat& trainImage, vector<KeyPoint>& trainKeypoints,
2345 vector<vector<DMatch> >& matches,
int k,
2346 const Mat&
mask=
Mat(),
bool compactResult=
false )
const;
2348 void radiusMatch(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2349 const Mat& trainImage, vector<KeyPoint>& trainKeypoints,
2350 vector<vector<DMatch> >& matches,
float maxDistance,
2351 const Mat&
mask=
Mat(),
bool compactResult=
false )
const;
2356 void match(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2357 vector<DMatch>& matches,
const vector<Mat>& masks=vector<Mat>() );
2358 void knnMatch(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2359 vector<vector<DMatch> >& matches,
int k,
2360 const vector<Mat>& masks=vector<Mat>(),
bool compactResult=
false );
2361 void radiusMatch(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2362 vector<vector<DMatch> >& matches,
float maxDistance,
2363 const vector<Mat>& masks=vector<Mat>(),
bool compactResult=
false );
2366 virtual void read(
const FileNode& );
2376 const string ¶msFilename=
string() );
2382 virtual void knnMatchImpl(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2383 vector<vector<DMatch> >& matches,
int k,
2384 const vector<Mat>& masks,
bool compactResult ) = 0;
2385 virtual void radiusMatchImpl(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2386 vector<vector<DMatch> >& matches,
float maxDistance,
2387 const vector<Mat>& masks,
bool compactResult ) = 0;
2396 void add(
const vector<Mat>& images,
const vector<vector<KeyPoint> >& keypoints );
2400 size_t keypointCount()
const;
2401 size_t imageCount()
const;
2403 const vector<vector<KeyPoint> >& getKeypoints()
const;
2404 const vector<KeyPoint>& getKeypoints(
int imgIdx )
const;
2405 const KeyPoint& getKeyPoint(
int imgIdx,
int localPointIdx )
const;
2406 const KeyPoint& getKeyPoint(
int globalPointIdx )
const;
2407 void getLocalIdx(
int globalPointIdx,
int& imgIdx,
int& localPointIdx )
const;
2409 const vector<Mat>& getImages()
const;
2410 const Mat& getImage(
int imgIdx )
const;
2421 static Mat clone_op(
Mat m ) {
return m.
clone(); }
2439 static const int POSE_COUNT = 500;
2440 static const int PATCH_WIDTH = 24;
2441 static const int PATCH_HEIGHT = 24;
2446 Params(
int poseCount = POSE_COUNT,
2447 Size patchSize =
Size(PATCH_WIDTH, PATCH_HEIGHT),
2448 string pcaFilename =
string(),
2449 string trainPath =
string(),
string trainImagesList =
string(),
2450 float minScale = GET_MIN_SCALE(),
float maxScale = GET_MAX_SCALE(),
2451 float stepScale = GET_STEP_SCALE() );
2468 virtual void clear();
2470 virtual void train();
2472 virtual bool isMaskSupported();
2474 virtual void read(
const FileNode &fn );
2486 virtual void knnMatchImpl(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2487 vector<vector<DMatch> >& matches,
int k,
2488 const vector<Mat>& masks,
bool compactResult );
2489 virtual void radiusMatchImpl(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2490 vector<vector<DMatch> >& matches,
float maxDistance,
2491 const vector<Mat>& masks,
bool compactResult );
2519 Params(
const string& filename );
2536 virtual void clear();
2538 virtual void train();
2540 virtual bool isMaskSupported();
2542 virtual void read(
const FileNode &fn );
2548 virtual void knnMatchImpl(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2549 vector<vector<DMatch> >& matches,
int k,
2550 const vector<Mat>& masks,
bool compactResult );
2551 virtual void radiusMatchImpl(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2552 vector<vector<DMatch> >& matches,
float maxDistance,
2553 const vector<Mat>& masks,
bool compactResult );
2555 void trainFernClassifier();
2556 void calcBestProbAndMatchIdx(
const Mat& image,
const Point2f& pt,
2557 float& bestProb,
int& bestMatchIdx, vector<float>& signature );
2579 virtual void add(
const vector<Mat>& imgCollection,
2580 vector<vector<KeyPoint> >& pointCollection );
2582 virtual void clear();
2584 virtual void train();
2586 virtual bool isMaskSupported();
2588 virtual void read(
const FileNode& fn );
2594 virtual void knnMatchImpl(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2595 vector<vector<DMatch> >& matches,
int k,
2596 const vector<Mat>& masks,
bool compactResult );
2597 virtual void radiusMatchImpl(
const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
2598 vector<vector<DMatch> >& matches,
float maxDistance,
2599 const vector<Mat>& masks,
bool compactResult );
2615 DRAW_OVER_OUTIMG = 1,
2617 NOT_DRAW_SINGLE_POINTS = 2,
2618 DRAW_RICH_KEYPOINTS = 4
2629 const Mat& img2,
const vector<KeyPoint>& keypoints2,
2630 const vector<DMatch>& matches1to2, Mat& outImg,
2635 const Mat& img2,
const vector<KeyPoint>& keypoints2,
2636 const vector<vector<DMatch> >& matches1to2, Mat& outImg,
2645 vector<KeyPoint>* keypoints1, vector<KeyPoint>* keypoints2,
2646 float& repeatability,
int& correspCount,
2647 const Ptr<FeatureDetector>& fdetector=Ptr<FeatureDetector>() );
2650 const vector<vector<uchar> >& correctMatches1to2Mask,
2651 vector<Point2f>& recallPrecisionCurve );
2652 CV_EXPORTS float getRecall(
const vector<Point2f>& recallPrecisionCurve,
float l_precision );
2655 vector<KeyPoint>& keypoints1, vector<KeyPoint>& keypoints2,
2656 vector<vector<DMatch> >* matches1to2, vector<vector<uchar> >* correctMatches1to2Mask,
2657 vector<Point2f>& recallPrecisionCurve,
2658 const Ptr<GenericDescriptorMatcher>& dmatch=Ptr<GenericDescriptorMatcher>() );
2673 void add(
const Mat& descriptors );
2674 const vector<Mat>& getDescriptors()
const;
2675 int descripotorsCount()
const;
2677 virtual void clear();
2686 virtual Mat cluster()
const = 0;
2687 virtual Mat cluster(
const Mat& descriptors )
const = 0;
2705 virtual Mat cluster()
const;
2706 virtual Mat cluster(
const Mat& descriptors )
const;
2726 void setVocabulary(
const Mat& vocabulary );
2727 const Mat& getVocabulary()
const;
2728 void compute(
const Mat& image, vector<KeyPoint>& keypoints,
Mat& imgDescriptor,
2729 vector<vector<int> >* pointIdxsOfClusters=0,
Mat* descriptors=0 );
2732 int descriptorSize()
const;
2733 int descriptorType()
const;