OpenCVのキーポイントディスクリプタの抽出器は,同一の問題を解く異なるアルゴリズム間を容易にスイッチできる共通のインタフェースによってラップされています. このセクションでは,多次元空間の vector として表現できるディスクリプタの計算方法について述べます. “vector” ディスクリプタ抽出器を実装するすべてのオブジェクトは, DescriptorExtractor() インタフェースから派生します.
画像キーポイントに対するディスクリプタ計算のための抽象基底クラス.
class CV_EXPORTS DescriptorExtractor
{
public:
virtual ~DescriptorExtractor();
void compute( const Mat& image, vector<KeyPoint>& keypoints,
Mat& descriptors ) const;
void compute( const vector<Mat>& images, vector<vector<KeyPoint> >& keypoints,
vector<Mat>& descriptors ) const;
virtual void read( const FileNode& );
virtual void write( FileStorage& ) const;
virtual int descriptorSize() const = 0;
virtual int descriptorType() const = 0;
static Ptr<DescriptorExtractor> create( const string& descriptorExtractorType );
protected:
...
};
このインタフェースは,キーポイントディスクリプタが,基本型を要素とする,密で固定次元の vector で表現できることを仮定しています. 実際,多くのディスクリプタは,このパターンで表現できるので,ディスクリプタ間の距離を簡単に計算できます. したがって,ディスクリプタのコレクションは Mat() で表現可能で, その各行が1つのキーポイントディスクリプタに対応します.
画像(第1のバージョン),または画像集合(第2のバージョン)から
検出されたキーポイント集合に対するディスクリプタを計算します
param image: 画像. param keypoints: キーポイント.ディスクリプタが計算できないキーポイントは削除されます. param descriptors: ディスクリプタ.i 行が キーポイント i に対するディスクリプタになります.
images 画像集合.
images[i] から検出されたキーポイントです. ディスクリプタが計算できないキーポイントは削除されます.
集合 keypoints[i] に対して計算されたディスクリプタになります.
ファイルストレージに,ディスクリプタ抽出器オブジェクトを書き込みます.
パラメタ: |
|
---|
DescriptorExtractor()
デフォルトパラメータで,指定された種類の を作成する特徴検出器ファクトリ.
(デフォルトコンストラクタを使う方が好まれます).
param descriptorExtractorType: ディスクリプタ抽出器の種類.
ここで,ディスクリプタ抽出器の種類としては以下がサポートされています: "SIFT" – SiftFeatureDetector() , "SURF" – SurfFeatureDetector() , "BRIEF" – BriefFeatureDetector() . さらに,組み合わせ可能なフォーマットもサポートされています:ディスクリプタ抽出器アダプタ名( "Opponent" – OpponentColorDescriptorExtractor() ) + ディスクリプタ抽出器名(上記を参照してください)です.例えば, "OpponentSIFT" 等となります.
SIFT() クラスを使って計算するディスクリプタのラッパークラス.
class SiftDescriptorExtractor : public DescriptorExtractor
{
public:
SiftDescriptorExtractor(
const SIFT::DescriptorParams& descriptorParams=SIFT::DescriptorParams(),
const SIFT::CommonParams& commonParams=SIFT::CommonParams() );
SiftDescriptorExtractor( double magnification, bool isNormalize=true,
bool recalculateAngles=true, int nOctaves=SIFT::CommonParams::DEFAULT_NOCTAVES,
int nOctaveLayers=SIFT::CommonParams::DEFAULT_NOCTAVE_LAYERS,
int firstOctave=SIFT::CommonParams::DEFAULT_FIRST_OCTAVE,
int angleMode=SIFT::CommonParams::FIRST_ANGLE );
virtual void read (const FileNode &fn);
virtual void write (FileStorage &fs) const;
virtual int descriptorSize() const;
virtual int descriptorType() const;
protected:
...
}
SURF() クラスを使って計算するディスクリプタのラッパークラス.
class SurfDescriptorExtractor : public DescriptorExtractor
{
public:
SurfDescriptorExtractor( int nOctaves=4,
int nOctaveLayers=2, bool extended=false );
virtual void read (const FileNode &fn);
virtual void write (FileStorage &fs) const;
virtual int descriptorSize() const;
virtual int descriptorType() const;
protected:
...
}
RTreeClassifier() クラスを使って計算するディスクリプタのラッパークラス.
template<typename T>
class CalonderDescriptorExtractor : public DescriptorExtractor
{
public:
CalonderDescriptorExtractor( const string& classifierFile );
virtual void read( const FileNode &fn );
virtual void write( FileStorage &fs ) const;
virtual int descriptorSize() const;
virtual int descriptorType() const;
protected:
...
}
Opponent Color Space(van de Sande et al., CGIV 2008 “Color Descriptors for Object Category Recognition” を参照してください) でディスクリプタを計算するように,検出器を適応させます. 入力されたRGB画像は,Opponent Color Space に変換されます. そして,(コンストラクタにセットされる)適応されないディスクリプタ抽出器が, 3チャンネルそれぞれに対してディスクリプタを計算し,それらを1つの色ディスクリプタとして結合します.
class OpponentColorDescriptorExtractor : public DescriptorExtractor
{
public:
OpponentColorDescriptorExtractor( const Ptr<DescriptorExtractor>& dextractor );
virtual void read( const FileNode& );
virtual void write( FileStorage& ) const;
virtual int descriptorSize() const;
virtual int descriptorType() const;
protected:
...
};
次の論文で述べられた BRIEF ディスクリプタを計算するためのクラス. Calonder M., Lepetit V., Strecha C., Fua P.: ‘’BRIEF: Binary Robust Independent Elementary Features.’’ 11th European Conference on Computer Vision (ECCV), Heraklion, Crete. LNCS Springer, September 2010.
class BriefDescriptorExtractor : public DescriptorExtractor
{
public:
static const int PATCH_SIZE = 48;
static const int KERNEL_SIZE = 9;
// bytes は,ディスクリプタの長さをバイト単位で表します.16,32,64 バイトのどれか.
BriefDescriptorExtractor( int bytes = 32 );
virtual void read( const FileNode& );
virtual void write( FileStorage& ) const;
virtual int descriptorSize() const;
virtual int descriptorType() const;
protected:
...
};