物体検出

cv::matchTemplate

Comments from the Wiki

void matchTemplate(const Mat& image, const Mat& templ, Mat& result, int method)

テンプレートと,それに重なった画像領域とを比較します.

パラメタ:
  • image – テンプレートの探索対象となる画像.8ビットまたは32ビットの浮動小数点型.
  • templ – 探索されるテンプレート.探索対象となる画像以下のサイズで,同じデータ型でなければいけません.
  • result – 比較結果のマップ.シングルチャンネル,32ビット,浮動小数点型. imageW \times H で, templw \times h とすると result(W-w+1) \times (H-h+1) となります.
  • method – 比較手法の指定(以下の説明を参照してください).

この関数は templimage 全体に対してスライドさせ,それと重なる w \times h の領域とを指定された方法で比較し,その結果を result に保存します.以下に,この関数で指定可能な比較手法を表す式を示します( I は画像を, T はテンプレートを, R は結果をそれぞれ表します.総和計算は,以下のようにテンプレートと(または)画像領域に対して行われます: x' = 0...w-1, y' = 0...h-1

  • method=CV_TM_SQDIFF

    R(x,y)= \sum _{x',y'} (T(x',y')-I(x+x',y+y'))^2

  • method=CV_TM_SQDIFF_NORMED

    R(x,y)= \frac{\sum_{x',y'} (T(x',y')-I(x+x',y+y'))^2}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}

  • method=CV_TM_CCORR

    R(x,y)= \sum _{x',y'} (T(x',y')  \cdot I(x+x',y+y'))

  • method=CV_TM_CCORR_NORMED

    R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I'(x+x',y+y'))}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}

  • method=CV_TM_CCOEFF

    R(x,y)= \sum _{x',y'} (T'(x',y')  \cdot I(x+x',y+y'))

    ここで,

    \begin{array}{l} T'(x',y')=T(x',y') - 1/(w  \cdot h)  \cdot \sum _{x'',y''} T(x'',y'') \\ I'(x+x',y+y')=I(x+x',y+y') - 1/(w  \cdot h)  \cdot \sum _{x'',y''} I(x+x'',y+y'') \end{array}

  • method=CV_TM_CCOEFF_NORMED

    R(x,y)= \frac{ \sum_{x',y'} (T'(x',y') \cdot I'(x+x',y+y')) }{ \sqrt{\sum_{x',y'}T'(x',y')^2 \cdot \sum_{x',y'} I'(x+x',y+y')^2} }

となります.

この関数による比較の後,関数 minMaxLoc() を用いて,大域的最小値( CV_TM_SQDIFF の場合)あるいは大域的最大値( CV_TM_CCORRCV_TM_CCOEFF の場合)を検出することでベストマッチを得ることができます.カラー画像の場合,分母・分子それぞれの総和計算はすべてのチャンネルについて行われます(各チャンネルで用いる平均値はそれぞれ異なります).つまり,この関数はカラーテンプレートやカラー画像をとることができます.その場合も結果はシングルチャンネル画像のままで,簡単に分析できます.

目次

このページ