カスケード分類器で特徴量を求めるための基底クラス.
class CV_EXPORTS FeatureEvaluator
{
public:
enum { HAAR = 0, LBP = 1 }; // サポートされる特徴タイプ
virtual ~FeatureEvaluator(); // デストラクタ
virtual bool read(const FileNode& node);
virtual Ptr<FeatureEvaluator> clone() const;
virtual int getFeatureType() const;
virtual bool setImage(const Mat& img, Size origWinSize);
virtual bool setWindow(Point p);
virtual double calcOrd(int featureIdx) const;
virtual int calcCat(int featureIdx) const;
static Ptr<FeatureEvaluator> create(int type);
};
現在の画像上に,特徴量を計算する探索窓をセットします( によって呼び出されます)
Parameter: | p – 探索窓の左上角の座標.この探索窓の中の特徴量が計算されます.探索窓のサイズは,学習画像と同じです |
---|
順序付き(数値)特徴量の値を求めます.
Parameter: | featureIdx – 値を求める特徴量のインデックス |
---|
求められた順序付き特徴量の値を返します.
カテゴリ特徴量の値を求めます.
Parameter: | featureIdx – 値を求める特徴量のインデックス |
---|
求められたカテゴリ特徴量,つまり [0,... (カテゴリ数 - 1)] の範囲内の値を返します.
特徴量評価器を作成します.
Parameter: | type – カスケードによって評価される特徴量の種類(現在は,HAAR または LBP のどちらか) |
---|
物体検出のためのカスケード分類器クラス.
class CascadeClassifier
{
public:
// 木ノードを表す構造体
struct CV_EXPORTS DTreeNode
{
int featureIdx; // 分岐となる特徴量インデックス
float threshold; // 順序付き特徴量に対する分岐の閾値
int left; // 木ノード配列において,左側にある子ノードのインデックス
int right; // 木ノード配列において,右側にある子ノードのインデックス
};
// 決定木を表す構造体
struct CV_EXPORTS DTree
{
int nodeCount; // ノード数
};
// カスケードステージ(現在のところ BOOST のみ)を表す構造体
struct CV_EXPORTS Stage
{
int first; // 木配列における,最初の木のインデックス
int ntrees; // 木の数
float threshold; // ステージの閾値
};
enum { BOOST = 0 }; // サポートされるステージの種類
// 検出のモード(HaarDetectObjects 関数のパラメータ flags を参照してください)
enum { DO_CANNY_PRUNING = CV_HAAR_DO_CANNY_PRUNING,
SCALE_IMAGE = CV_HAAR_SCALE_IMAGE,
FIND_BIGGEST_OBJECT = CV_HAAR_FIND_BIGGEST_OBJECT,
DO_ROUGH_SEARCH = CV_HAAR_DO_ROUGH_SEARCH };
CascadeClassifier(); // デフォルトコンストラクタ
CascadeClassifier(const string& filename);
~CascadeClassifier(); // デストラクタ
bool empty() const;
bool load(const string& filename);
bool read(const FileNode& node);
void detectMultiScale( const Mat& image, vector<Rect>& objects,
double scaleFactor=1.1, int minNeighbors=3,
int flags=0, Size minSize=Size());
bool setImage( Ptr<FeatureEvaluator>&, const Mat& );
int runAt( Ptr<FeatureEvaluator>&, Point );
bool is_stump_based; // 木が stump の場合は true
int stageType; // ステージの種類(現在は,BOOST のみ)
int featureType; // 特徴量の種類(現在は,HAAR または LBP のどちらか)
int ncategories; // カテゴリ数(カテゴリ特徴量の場合のみ)
Size origWinSize; // 学習画像のサイズ
vector<Stage> stages; // ステージの vector (現在は,BOOST のみ)
vector<DTree> classifiers; // 決定木の vector
vector<DTreeNode> nodes; // 木ノードの vector
vector<float> leaves; // 葉の値の vector
vector<int> subsets; // カテゴリ特徴量によって分けられた部分集合
Ptr<FeatureEvaluator> feval; // 特徴評価器へのポインタ
Ptr<CvHaarClassifierCascade> oldCascade; // pointer to old cascade
};
ファイルから分類器を読み込む.
Parameter: | filename – ファイル名.ここから分類器を読み込みます |
---|
ファイルから分類器を読み込みます.以前の内容は破棄されます.
Parameter: | filename – ファイル名.ここから分類器を読み込みます.ファイルには(haartraining アプリケーションによって学習された)古い haar 分類器,または(traincascade アプリケーションによって学習された)新しいカスケード分類器が保存されている場合があります |
---|
入力画像中から異なるサイズの物体を検出します.検出された物体は,矩形のリストとして返されます.
パラメタ: |
|
---|
画像をセットします(各レベルの画像において detectMultiScale から呼び出されます).
パラメタ: |
|
---|
画像の指定位置で検出器を実行します(検出器の動作対象となる画像は,setImage によってセットされている必要があります).
パラメタ: |
|
---|
以下を返します:
1 - カスケード分類器が,指定位置で物体を検出した場合.
-si - それ以外の場合.si は,与えられた探索窓位置が背景画像であると最初に予測したステージのインデックスです.
物体候補の矩形をグループ化します..
パラメタ: |
|
---|
この関数は,汎用関数 partition() のラッパです.これは,矩形が同一と見なせるかどうかの基準を利用して,すべての入力矩形をクラスタリングします.つまり,同じようなサイズで同じような位置にある(この類似性は eps で定義されます)矩形を結合します. eps=0 の場合,クラスタリングは全く行われません. ならば,すべての矩形が1つのクラスタに入れられます. また, groupThreshold 個以下の矩形しか含まないような小さいクラスタは,棄却されます.それぞれのクラスタにおいて平均矩形が計算され,出力の矩形リストに書き出されます.
テンプレートと,それに重なった画像領域とを比較します.
パラメタ: |
|
---|
この関数は templ を image 全体に対してスライドさせ,それと重なる の領域とを指定された方法で比較し,その結果を result に保存します.以下に,この関数で指定可能な比較手法を表す式を示します( は画像を, はテンプレートを, は結果をそれぞれ表します.総和計算は,以下のようにテンプレートと(または)画像領域に対して行われます:
method=CV_TM_SQDIFF
method=CV_TM_SQDIFF_NORMED
method=CV_TM_CCORR
method=CV_TM_CCORR_NORMED
method=CV_TM_CCOEFF
where
method=CV_TM_CCOEFF_NORMED
この関数による比較の後,関数 minMaxLoc() を用いて,大域的最小値( CV_TM_SQDIFF の場合)あるいは大域的最大値( CV_TM_CCORR や CV_TM_CCOEFF の場合)を検出することでベストマッチを得ることができます.カラー画像の場合,分母・分子それぞれの総和計算は全てのチャンネルについて行われます(各チャンネルで用いる平均値はそれぞれ異なります).つまり,この関数はカラーテンプレートやカラー画像をとることができます.結果はシングルチャンネル画像のままで,簡単に分析できます.