OpenCVにおけるキーポイントディスクリプタMatcherは,同一の問題を解く異なるアルゴリズム間を容易にスイッチできる共通のインタフェースによってラップされています. このセクションでは,多次元空間の vector として表現できないディスクリプタ同士の,マッチング方法について述べます. GenericDescriptorMatcher は,ディスクリプタのより一般的なインタフェースです.これは,ディスクリプタの表現方法について何の仮定も持ちません. DescriptorExtractor() インタフェースを持つすべてのディスクリプタは,
GenericDescriptorMatcher インタフェースのラッパーを持ちます( VectorDescriptorMatcher() を参照してください). One way ディスクリプタ や Ferns ディスクリプタのように, GenericDescriptorMatcher インタフェースの実装を持っていても, DescriptorExtractor() をサポートしないものもあります.
キーポイントディスクリプタの抽出とマッチングのための抽象インタフェース. 同じ目的のものとして 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:
...
};
画像と画像から得られるキーポイントを,訓練コレクションに追加します(ここで,ディスクリプタが計算されることになります).
訓練コレクションが空ではない場合,新しい画像と,そこから得られるキーポイントが,既存のデータに追加されます.
param images: 画像コレクション. param keypoints: 点コレクション. keypoints[i] は, 画像 images[i] で検出されたキーポイントと見なされます.
訓練コレクション(画像とキーポイント)をクリアします.
オブジェクトの学習を行います.
例えば,木ベースの構造を学習して,ディスクリプタを抽出するように, または,ディスクリプタ同士のマッチングを最適化するように学習されます.
一般的なディスクリプタ Matcher が,マスキング可能なマッチングをサポートする場合には true を返します.
GenericDescriptorMatcher::add()
クエリキーポイントを,入力引数として与えられる1つの訓練画像のキーポイントのどれかに分類します(このメソッドの第1のバージョン).
または,クエリキーポイントを, によってセットされた訓練画像コレクションのキーポイントのどれかに分類します(第2のバージョン).
GenericDescriptorMatcher::add() DescriptorMatcher::match()
クエリキーポイントに対するベストマッチを,訓練集合から見つけます.
このメソッドの第1のバージョンでは,1つの訓練画像と,そこで検出される予定のキーポイント,が入力引数になります. 第2のバージョンでは,クエリキーポイントと訓練画像集合とのマッチングが行われます. この集合は によってセットされます. また, の場合と同様に,マスクもセットすることができます.
パラメタ: |
|
---|
GenericDescriptorMatcher::match() DescriptorMatcher::knnMatch()
クエリ集合から得られる各キーポイントに対するKNN ベストマッチを,訓練キーポイントから見つけます.
K個の最近傍(あるいは,それより少ない可能性もあります)マッチは,距離が昇順になるように返されます. 詳細は, および を参照してください.
GenericDescriptorMatcher::match() DescriptorMatcher::radiusMatch()
各クエリキーポイントに対して,与えられた閾値よりも小さい距離にあるベストマッチを見つけます.
求められたマッチは,距離の昇順で返されます.詳細は,および を参照してください.
ファイルストレージに Matcher オブジェクトを書き込みます.
Matcher を複製します.
パラメタ: |
|
---|
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:
...
};
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:
...
};
有限次元空間内のベクトルとして表現されるディスクリプタ同士の,マッチングに利用されるクラス.
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> > );