Home | History | Annotate | Download | only in src
      1 /*M///////////////////////////////////////////////////////////////////////////////////////
      2 //
      3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
      4 //
      5 //  By downloading, copying, installing or using the software you agree to this license.
      6 //  If you do not agree to this license, do not download, install,
      7 //  copy or use the software.
      8 //
      9 //
     10 //                           License Agreement
     11 //                For Open Source Computer Vision Library
     12 //
     13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
     14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
     15 // Third party copyrights are property of their respective owners.
     16 //
     17 // Redistribution and use in source and binary forms, with or without modification,
     18 // are permitted provided that the following conditions are met:
     19 //
     20 //   * Redistribution's of source code must retain the above copyright notice,
     21 //     this list of conditions and the following disclaimer.
     22 //
     23 //   * Redistribution's in binary form must reproduce the above copyright notice,
     24 //     this list of conditions and the following disclaimer in the documentation
     25 //     and/or other materials provided with the distribution.
     26 //
     27 //   * The name of the copyright holders may not be used to endorse or promote products
     28 //     derived from this software without specific prior written permission.
     29 //
     30 // This software is provided by the copyright holders and contributors "as is" and
     31 // any express or implied warranties, including, but not limited to, the implied
     32 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     33 // In no event shall the Intel Corporation or contributors be liable for any direct,
     34 // indirect, incidental, special, exemplary, or consequential damages
     35 // (including, but not limited to, procurement of substitute goods or services;
     36 // loss of use, data, or profits; or business interruption) however caused
     37 // and on any theory of liability, whether in contract, strict liability,
     38 // or tort (including negligence or otherwise) arising in any way out of
     39 // the use of this software, even if advised of the possibility of such damage.
     40 //
     41 //M*/
     42 
     43 #include <stdlib.h>
     44 #include <math.h>
     45 #include <vector>
     46 
     47 namespace cv
     48 {
     49 /*
     50  * ShapeContextDescriptor class
     51  */
     52 class SCD
     53 {
     54 public:
     55     //! the full constructor taking all the necessary parameters
     56     explicit SCD(int _nAngularBins=12, int _nRadialBins=5,
     57                  double _innerRadius=0.1, double _outerRadius=1, bool _rotationInvariant=false)
     58     {
     59         setAngularBins(_nAngularBins);
     60         setRadialBins(_nRadialBins);
     61         setInnerRadius(_innerRadius);
     62         setOuterRadius(_outerRadius);
     63         setRotationInvariant(_rotationInvariant);
     64     }
     65 
     66     void extractSCD(cv::Mat& contour, cv::Mat& descriptors,
     67                     const std::vector<int>& queryInliers=std::vector<int>(),
     68                     const float _meanDistance=-1);
     69 
     70     int descriptorSize() {return nAngularBins*nRadialBins;}
     71     void setAngularBins(int angularBins) { nAngularBins=angularBins; }
     72     void setRadialBins(int radialBins) { nRadialBins=radialBins; }
     73     void setInnerRadius(double _innerRadius) { innerRadius=_innerRadius; }
     74     void setOuterRadius(double _outerRadius) { outerRadius=_outerRadius; }
     75     void setRotationInvariant(bool _rotationInvariant) { rotationInvariant=_rotationInvariant; }
     76     int getAngularBins() const { return nAngularBins; }
     77     int getRadialBins() const { return nRadialBins; }
     78     double getInnerRadius() const { return innerRadius; }
     79     double getOuterRadius() const { return outerRadius; }
     80     bool getRotationInvariant() const { return rotationInvariant; }
     81     float getMeanDistance() const { return meanDistance; }
     82 
     83 private:
     84     int nAngularBins;
     85     int nRadialBins;
     86     double innerRadius;
     87     double outerRadius;
     88     bool rotationInvariant;
     89     float meanDistance;
     90 
     91 protected:
     92     void logarithmicSpaces(std::vector<double>& vecSpaces) const;
     93     void angularSpaces(std::vector<double>& vecSpaces) const;
     94 
     95     void buildNormalizedDistanceMatrix(cv::Mat& contour,
     96                           cv::Mat& disMatrix, const std::vector<int> &queryInliers,
     97                           const float _meanDistance=-1);
     98 
     99     void buildAngleMatrix(cv::Mat& contour,
    100                               cv::Mat& angleMatrix) const;
    101 };
    102 
    103 /*
    104  * Matcher
    105  */
    106 class SCDMatcher
    107 {
    108 public:
    109     // the full constructor
    110     SCDMatcher()
    111     {
    112     }
    113 
    114     // the matcher function using Hungarian method
    115     void matchDescriptors(cv::Mat& descriptors1,  cv::Mat& descriptors2, std::vector<cv::DMatch>& matches, cv::Ptr<cv::HistogramCostExtractor>& comparer,
    116                                       std::vector<int>& inliers1, std::vector<int> &inliers2);
    117 
    118     // matching cost
    119     float getMatchingCost() const {return minMatchCost;}
    120 
    121 private:
    122     float minMatchCost;
    123 protected:
    124     void buildCostMatrix(const cv::Mat& descriptors1, const cv::Mat& descriptors2,
    125                                      cv::Mat& costMatrix, cv::Ptr<cv::HistogramCostExtractor>& comparer) const;
    126     void hungarian(cv::Mat& costMatrix, std::vector<cv::DMatch>& outMatches, std::vector<int> &inliers1,
    127                    std::vector<int> &inliers2, int sizeScd1=0, int sizeScd2=0);
    128 
    129 };
    130 
    131 }
    132