一般的なディスクリプタMatcherの共通インタフェース

OpenCVにおけるキーポイントディスクリプタMatcherは,同一の問題を解く異なるアルゴリズム間を容易にスイッチできる共通のインタフェースによってラップされています. このセクションでは,多次元空間の vector として表現できないディスクリプタ同士の,マッチング方法について述べます. GenericDescriptorMatcher は,ディスクリプタのより一般的なインタフェースです.これは,ディスクリプタの表現方法について何の仮定も持ちません. DescriptorExtractor() インタフェースを持つすべてのディスクリプタは,

GenericDescriptorMatcher インタフェースのラッパーを持ちます( VectorDescriptorMatcher() を参照してください). One way ディスクリプタ や Ferns ディスクリプタのように, GenericDescriptorMatcher インタフェースの実装を持っていても, DescriptorExtractor() をサポートしないものもあります.

GenericDescriptorMatcher

Comments from the Wiki

GenericDescriptorMatcher

キーポイントディスクリプタの抽出とマッチングのための抽象インタフェース. 同じ目的のものとして DescriptorExtractor() および DescriptorMatcher() がありますが, これらのインタフェースは,多次元空間の vector として表現されるディスクリプタ専用のものです. GenericDescriptorMatcher は,ディスクリプタに対する,より一般的なインタフェースです. DescriptorMatcher() と同様に, GenericDescriptorMatcher のマッチング方法も, 1つの画像のキーポイントに対するマッチングと,画像集合のキーポイントに対するマッチング,の2種類に分けられます:

class GenericDescriptorMatcher
{
public:
    GenericDescriptorMatcher();
    virtual ~GenericDescriptorMatcher();

    virtual void add( const vector<Mat>& images,
                      vector<vector<KeyPoint> >& keypoints );

    const vector<Mat>& getTrainImages() const;
    const vector<vector<KeyPoint> >& getTrainKeypoints() const;
    virtual void clear();

    virtual void train() = 0;

    virtual bool isMaskSupported() = 0;

    void classify( const Mat& queryImage,
                   vector<KeyPoint>& queryKeypoints,
                   const Mat& trainImage,
                   vector<KeyPoint>& trainKeypoints ) const;
    void classify( const Mat& queryImage,
                   vector<KeyPoint>& queryKeypoints );

    /*
     * 画像ペアから得たキーポイント同士のマッチメソッド一覧.
     */
    void match( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
                const Mat& trainImage, vector<KeyPoint>& trainKeypoints,
                vector<DMatch>& matches, const Mat& mask=Mat() ) const;
    void knnMatch( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
                   const Mat& trainImage, vector<KeyPoint>& trainKeypoints,
                   vector<vector<DMatch> >& matches, int k,
                   const Mat& mask=Mat(), bool compactResult=false ) const;
    void radiusMatch( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
                      const Mat& trainImage, vector<KeyPoint>& trainKeypoints,
                      vector<vector<DMatch> >& matches, float maxDistance,
                      const Mat& mask=Mat(), bool compactResult=false ) const;
    /*
     * 画像集合から得たキーポイント同士のマッチメソッド一覧.
     */
    void match( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
                vector<DMatch>& matches, const vector<Mat>& masks=vector<Mat>() );
    void knnMatch( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
                   vector<vector<DMatch> >& matches, int k,
                   const vector<Mat>& masks=vector<Mat>(), bool compactResult=false );
    void radiusMatch( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
                      vector<vector<DMatch> >& matches, float maxDistance,
                      const vector<Mat>& masks=vector<Mat>(), bool compactResult=false );

    virtual void read( const FileNode& );
    virtual void write( FileStorage& ) const;

    virtual Ptr<GenericDescriptorMatcher> clone( bool emptyTrainData=false ) const = 0;

protected:
    ...
};

cv::GenericDescriptorMatcher::add

Comments from the Wiki

void GenericDescriptorMatcher::add(const vector<Mat>& images, vector<vector<KeyPoint> >& keypoints)

画像と画像から得られるキーポイントを,訓練コレクションに追加します(ここで,ディスクリプタが計算されることになります).

訓練コレクションが空ではない場合,新しい画像と,そこから得られるキーポイントが,既存のデータに追加されます.

param images:画像コレクション.
param keypoints:
 点コレクション. keypoints[i] は, 画像 images[i] で検出されたキーポイントと見なされます.

cv::GenericDescriptorMatcher::getTrainImages

Comments from the Wiki

cv::

Comments from the Wiki

GenericDescriptorMatcher::add()

void GenericDescriptorMatcher::classify(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, const Mat& trainImage, vector<KeyPoint>& trainKeypoints) const

クエリキーポイントを,入力引数として与えられる1つの訓練画像のキーポイントのどれかに分類します(このメソッドの第1のバージョン).

または,クエリキーポイントを, によってセットされた訓練画像コレクションのキーポイントのどれかに分類します(第2のバージョン).

void GenericDescriptorMatcher::classify(const Mat& queryImage, vector<KeyPoint>& queryKeypoints)
パラメタ:
  • queryImage – クエリ画像.
  • queryKeypoints – クエリ画像から得られたキーポイント.
  • trainImage – 訓練画像.
  • trainKeypoints – 訓練画像から得られたキーポイント.

cv::GenericDescriptorMatcher::match

Comments from the Wiki

GenericDescriptorMatcher::add() DescriptorMatcher::match()

void GenericDescriptorMatcher::match(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, const Mat& trainImage, vector<KeyPoint>& trainKeypoints, vector<DMatch>& matches, const Mat& mask=Mat()) const

クエリキーポイントに対するベストマッチを,訓練集合から見つけます.

このメソッドの第1のバージョンでは,1つの訓練画像と,そこで検出される予定のキーポイント,が入力引数になります. 第2のバージョンでは,クエリキーポイントと訓練画像集合とのマッチングが行われます. この集合は によってセットされます. また, の場合と同様に,マスクもセットすることができます.

void GenericDescriptorMatcher::match(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, vector<DMatch>& matches, const vector<Mat>& masks=vector<Mat>())
パラメタ:
  • queryImage – クエリ画像.
  • queryKeypointsqueryImage から検出されるキーポイント.
  • trainImage – 訓練画像.これは,クラスオブジェクト内に格納される訓練画像コレクションには追加されません.
  • trainKeypointstrainImage から検出されるキーポイント.これは,クラスオブジェクト内に格納される訓練画像コレクションには追加されません.
  • matches – マッチ. mask によって除外されるクエリディスクリプタ(キーポイント)の場合, そのディスクリプタに対しては,マッチは追加されません. よって, matches サイズは,クエリキーポイント数よりも少なくなる可能性があります.
  • mask – 入力クエリキーポイントと訓練キーポイントとの間のマッチに対するマスク.
  • masks – マスク集合.それぞれの masks[i] が, 入力クエリキーポイントと,i-番目の画像から得られる訓練キーポイントとの間のマッチに対するマスクになります.

cv::GenericDescriptorMatcher::knnMatch

Comments from the Wiki

GenericDescriptorMatcher::match() DescriptorMatcher::knnMatch()

void GenericDescriptorMatcher::knnMatch(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, const Mat& trainImage, vector<KeyPoint>& trainKeypoints, vector<vector<DMatch> >& matches, int k, const Mat& mask=Mat(), bool compactResult=false) const

クエリ集合から得られる各キーポイントに対するKNN ベストマッチを,訓練キーポイントから見つけます.

K個の最近傍(あるいは,それより少ない可能性もあります)マッチは,距離が昇順になるように返されます. 詳細は, および を参照してください.

void GenericDescriptorMatcher::knnMatch(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, vector<vector<DMatch> >& matches, int k, const vector<Mat>& masks=vector<Mat>(), bool compactResult=false)

cv::GenericDescriptorMatcher::radiusMatch

Comments from the Wiki

GenericDescriptorMatcher::match() DescriptorMatcher::radiusMatch()

void GenericDescriptorMatcher::radiusMatch(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, const Mat& trainImage, vector<KeyPoint>& trainKeypoints, vector<vector<DMatch> >& matches, float maxDistance, const Mat& mask=Mat(), bool compactResult=false) const

各クエリキーポイントに対して,与えられた閾値よりも小さい距離にあるベストマッチを見つけます.

求められたマッチは,距離の昇順で返されます.詳細は,および を参照してください.

void GenericDescriptorMatcher::radiusMatch(const Mat& queryImage, vector<KeyPoint>& queryKeypoints, vector<vector<DMatch> >& matches, float maxDistance, const vector<Mat>& masks=vector<Mat>(), bool compactResult=false)

cv::GenericDescriptorMatcher::read

Comments from the Wiki

void GenericDescriptorMatcher::read(const FileNode& fn)

ファイルノードから Matcher オブジェクトを読み込みます.

cv::GenericDescriptorMatcher::write

Comments from the Wiki

void GenericDescriptorMatcher::write(FileStorage& fs) const

ファイルストレージに Matcher オブジェクトを書き込みます.

cv::GenericDescriptorMatcher::clone

Comments from the Wiki

Ptr<GenericDescriptorMatcher>\GenericDescriptorMatcher::clone(bool emptyTrainData) const

Matcher を複製します.

パラメタ:
  • emptyTrainDataemptyTrainData が false の場合, このメソッドはオブジェクトの深いコピーを作成,つまり,パラメータと訓練データの両方をコピーします. emptyTrainData が true の場合,現在のパラメータだけをコピーしたオブジェクトを作成し,訓練データは空になります.

OneWayDescriptorMatcher

Comments from the Wiki

OneWayDescriptorMatcher

OneWayDescriptorBase() クラスを用いた,ディスクリプタの計算,マッチング,分類のためのラッパークラス.

class OneWayDescriptorMatcher : public GenericDescriptorMatcher
{
public:
    class Params
    {
    public:
        static const int POSE_COUNT = 500;
        static const int PATCH_WIDTH = 24;
        static const int PATCH_HEIGHT = 24;
        static float GET_MIN_SCALE() { return 0.7f; }
        static float GET_MAX_SCALE() { return 1.5f; }
        static float GET_STEP_SCALE() { return 1.2f; }

        Params( int poseCount = POSE_COUNT,
                Size patchSize = Size(PATCH_WIDTH, PATCH_HEIGHT),
                string pcaFilename = string(),
                string trainPath = string(), string trainImagesList = string(),
                float minScale = GET_MIN_SCALE(), float maxScale = GET_MAX_SCALE(),
                float stepScale = GET_STEP_SCALE() );

        int poseCount;
        Size patchSize;
        string pcaFilename;
        string trainPath;
        string trainImagesList;

        float minScale, maxScale, stepScale;
    };

    OneWayDescriptorMatcher( const Params& params=Params() );
    virtual ~OneWayDescriptorMatcher();

    void initialize( const Params& params, const Ptr<OneWayDescriptorBase>& base=Ptr<OneWayDescriptorBase>() );

    // コレクションおよび OneWayDescriptorBase に保存されたキーポイントをクリアします
    virtual void clear();

    virtual void train();

    virtual bool isMaskSupported();

    virtual void read( const FileNode &fn );
    virtual void write( FileStorage& fs ) const;

    virtual Ptr<GenericDescriptorMatcher> clone( bool emptyTrainData=false ) const;
protected:
    ...
};

FernDescriptorMatcher

Comments from the Wiki

FernDescriptorMatcher

FernClassifier() クラスを用いた,ディスクリプタの計算,マッチング,分類のためのラッパークラス.

class FernDescriptorMatcher : public GenericDescriptorMatcher
{
public:
    class Params
    {
    public:
        Params( int nclasses=0,
                int patchSize=FernClassifier::PATCH_SIZE,
                int signatureSize=FernClassifier::DEFAULT_SIGNATURE_SIZE,
                int nstructs=FernClassifier::DEFAULT_STRUCTS,
                int structSize=FernClassifier::DEFAULT_STRUCT_SIZE,
                int nviews=FernClassifier::DEFAULT_VIEWS,
                int compressionMethod=FernClassifier::COMPRESSION_NONE,
                const PatchGenerator& patchGenerator=PatchGenerator() );

        Params( const string& filename );

        int nclasses;
        int patchSize;
        int signatureSize;
        int nstructs;
        int structSize;
        int nviews;
        int compressionMethod;
        PatchGenerator patchGenerator;

        string filename;
    };

    FernDescriptorMatcher( const Params& params=Params() );
    virtual ~FernDescriptorMatcher();

    virtual void clear();

    virtual void train();

    virtual bool isMaskSupported();

    virtual void read( const FileNode &fn );
    virtual void write( FileStorage& fs ) const;

    virtual Ptr<GenericDescriptorMatcher> clone( bool emptyTrainData=false ) const;

protected:
        ...
};

VectorDescriptorMatcher

Comments from the Wiki

VectorDescriptorMatcher

有限次元空間内のベクトルとして表現されるディスクリプタ同士の,マッチングに利用されるクラス.

class CV_EXPORTS VectorDescriptorMatcher : public GenericDescriptorMatcher
{
public:
    VectorDescriptorMatcher( const Ptr<DescriptorExtractor>& extractor, const Ptr<DescriptorMatcher>& matcher );
    virtual ~VectorDescriptorMatcher();

    virtual void add( const vector<Mat>& imgCollection,
                      vector<vector<KeyPoint> >& pointCollection );
    virtual void clear();
    virtual void train();
    virtual bool isMaskSupported();

    virtual void read( const FileNode& fn );
    virtual void write( FileStorage& fs ) const;

    virtual Ptr<GenericDescriptorMatcher> clone( bool emptyTrainData=false ) const;

protected:
    ...
};

作成例:

VectorDescriptorMatcher matcher( new SurfDescriptorExtractor,
                                 new BruteForceMatcher<L2<float> > );