10 人が閲覧(直近 30 日) AI

テンプレートマッチングとは?matchTemplateの仕組みと類似度指標の選び方を解説

AI画像認識ソフトウェアにおける主な機能一覧

テンプレートマッチングは、探したい対象を切り出した小さな画像を入力画像の上で1画素ずつずらして重ね、最も似ている位置の座標を返す処理です。学習も推論エンジンも要らず、OpenCVのmatchTemplateとminMaxLocを呼ぶだけで動く。詰まるのは、6つある類似度指標のどれを選ぶかと、大きさや向きが変わると検出が落ちる事実をどう受け止めるかの2点です。この記事では、指標の選び分け、崩れる条件と回避策の限界、特徴点マッチングやディープラーニング物体検出への切り替え基準、用途別の実装判断までを整理しました。

まとめ|テンプレートマッチングの採否を決める撮影条件の固定度と切り替えの境界

この手法を使うかどうかは、精度の議論より先に、撮影条件を固定できるかどうかで決まります。

対象が毎回ほぼ同じ大きさ・同じ向き・同じ明るさで写るなら、この手法は強い。カメラも治具も固定された位置決めや欠品検査の工程では、教師データを1枚も作らずに座標が取れます。逆に、斜めから写る、距離が変わる、影が乗る条件が1つでも入ると、正規化した指標でも検出は落ちます。

切り替えの境界は2つあります。大きさや向きが変わるが模様はあるならORBやAKAZEの特徴点マッチングへ、個体差そのものが大きいならディープラーニングの物体検出へ渡す。この順で検討すれば、いきなり学習モデルへ飛ぶ事故を避けられます。

画面自動テストで使うときは、しきい値の既定値が想像より緩いことを先に押さえてください。AppiumのimageMatchThresholdは0.4、SikuliXのMinSimilarityは0.7。誤検出の原因がテンプレート画像ではなく既定値だった、という結論は珍しくありません。

テンプレートマッチングの仕組み|検索窓のスライドと類似度マップから座標を決める処理

この処理がやっているのは、テンプレートと同じ大きさの窓を入力画像の左上から右下まで動かし、各位置で窓の中身とテンプレートの似ている度合いを1つの数値に落とすことだけです。難しさは計算ではなく、数値の読み方に移ります。

スライド探索が出力する類似度マップの大きさとminMaxLocでの座標取得

入力画像がW×H、テンプレートがw×hのとき、matchTemplateが返す結果は(W-w+1)×(H-h+1)の1チャンネル32ビット浮動小数点画像になります。窓が画像からはみ出す位置は計算しないため、テンプレートの大きさの分だけ小さくなる。各画素が、その位置に窓を置いたときの類似度そのものです。

最も一致する位置は、結果画像の最小値または最大値から取り出します。公式ヘッダには、TM_SQDIFFなら最小値、TM_CCORRとTM_CCOEFFなら最大値が最良の一致になると明記されている。この探索はminMaxLocが1回で済ませます。返る座標はテンプレートの左上に対応するため、矩形を描くなら幅と高さを足して右下を作ります。

import cv2

img = cv2.imread("board.png", cv2.IMREAD_GRAYSCALE)
tmpl = cv2.imread("mark.png", cv2.IMREAD_GRAYSCALE)

res = cv2.matchTemplate(img, tmpl, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

if max_val >= 0.8:
    h, w = tmpl.shape
    top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)

入力は8ビットか32ビット浮動小数点という型の制約とテンプレート寸法の上限

公式ヘッダの引数説明には、入力画像は8ビットまたは32ビット浮動小数点、テンプレートは入力画像より大きくてはならず同じデータ型、結果画像は1チャンネル32ビット浮動小数点と書かれています。ここを外すと例外で止まるため、読み込み時のフラグと拡大縮小の順序は先に決めます。

カラー画像もそのまま渡せます。ヘッダには、カラーの場合は総和を全チャンネルで計算し、平均値はチャンネルごとに別々に使うと書かれている。結果は1チャンネルのまま返るため、色が判別に効かない対象ならグレースケール化して計算量を3分の1に落とすほうが速い。読み込みや前処理の基本操作はOpenCVをPythonで使う画像処理入門に手順があります。

マスク引数で不定形テンプレートの背景を計算から外す実装と対応モード

matchTemplateの第5引数maskには、テンプレートと同じ大きさの画像を渡します。CV_8Uなら値が0でない画素だけを使う二値マスク、CV_32Fなら値がそのまま重みになる、と公式ヘッダに書かれている。丸いラベルや工具の先端など、矩形で切り出すと背景が混ざる対象で効きます。

ただし全モードで使えるわけではありません。4.x系と5.x系のヘッダを2026年8月時点で見比べると、マスク使用時の式が併記されているのはTM_CCOEFF_NORMEDを除く5モードだけで、正規化したCCOEFFにはマスク時の式が書かれていない。既定として選びやすい指標とマスクを同時に求めると、指標の選び直しが発生します。

6種類の類似度指標の違い|SQDIFF・CCORR・CCOEFFと正規化版の選び分け基準

OpenCVのTemplateMatchModesは6つで、定数値は0から5の連番です。名前は似ていますが、数式を見れば3系統×正規化の有無という構造にすぎません。

差分二乗和と相互相関と平均差分相関という3系統の数式が示す性質

TM_SQDIFFはテンプレートと窓の画素値の差を二乗して足し合わせます。完全一致で0になり、値が小さいほど似ている。TM_CCORRは差ではなく積を足すため、明るい領域ほど値が大きくなり、真っ白な部分が誤って最大になる事故が起きます。

TM_CCOEFFは、テンプレートと窓それぞれから自身の平均値を引いてから積を足す形です。公式ヘッダの式の通り、平均を引く操作が明るさのずれを打ち消すため、照明が少し変わっても順位が入れ替わりにくい。3系統のうち実務で最初に試す価値があるのはこれです。

6モードの比較表と最良値が最小か最大かで変わる後処理の書き分け

後処理で事故が起きやすいのは、SQDIFF系だけ「小さいほど良い」点です。minMaxLocの戻り値のどれを見るかがモードで変わるため、指標を切り替えるときは判定側も直します。

モード 値 最良 実務での位置づけ
TM_SQDIFF 0 最小 生の差分。輝度差に弱い
TM_SQDIFF_NORMED 1 最小 差分を正規化した版
TM_CCORR 2 最大 白い領域で誤検出しやすい
TM_CCORR_NORMED 3 最大 相関を正規化した版
TM_CCOEFF 4 最大 平均を引き明るさ差を吸収
TM_CCOEFF_NORMED 5 最大 既定候補。しきい値が固定可

迷ったらTM_CCOEFF_NORMEDから始め、誤検出が多いならTM_SQDIFF_NORMEDと見比べる。この2つで説明のつかない結果なら、原因は指標でなく撮影条件の側です。

正規化版を既定に置く理由としきい値を0.8前後から詰める運用手順

正規化版を選ぶ理由は精度より、しきい値を数値として固定できることにあります。TM_CCOEFF_NORMEDとTM_CCORR_NORMEDの値はおおむね-1から1に収まり、完全一致が1に近づく。非正規化の指標は画素数と輝度でスケールが変わるため、テンプレートを差し替えるたびにしきい値を引き直す羽目です。

詰め方の手順はこうです。対象が写っている画像を10枚ほど流して最大値の分布を見て、次に写っていない画像を同じ本数流し、最大値がどこまで上がるかを測る。2つの分布が離れていれば、その谷にしきい値を置けば済みます。0.8は出発点でしかなく、分布が重なっているならしきい値では解けない。前処理か指標か撮影条件のどれかを直す段階です。

スケール・回転・照明変化でテンプレートマッチングが崩れる条件と回避策の限界

この手法はテンプレートと窓を画素の位置ごとに突き合わせます。裏を返せば、対象の大きさも向きも変わらない前提でしか成立しない。前提が崩れたとき何が起きるかを条件ごとに切り分けます。

サイズ変化に多重スケール探索で対応するときの試行回数と処理時間

カメラと対象の距離が変われば、テンプレートは同じでも窓の中の対象は拡大縮小されます。1割のずれでも正規化相関の値は目に見えて下がる。対策はテンプレート側を段階的に拡大縮小し、そのつど探索を回す多重スケール探索です。

scores = []
for scale in [0.9, 0.95, 1.0, 1.05, 1.1]:
    resized = cv2.resize(tmpl, None, fx=scale, fy=scale)
    if resized.shape[0] >= img.shape[0]:
        continue
    res = cv2.matchTemplate(img, resized, cv2.TM_CCOEFF_NORMED)
    scores.append((cv2.minMaxLoc(res)[1], scale))

費用は単純で、5段階なら計算量は5倍です。スケール範囲が±30%を超え刻みも細かく要るなら、現実的な処理時間には収まらない。タクトタイムが決まっている工程では、多重スケールに入る前に治具で距離を固定できないかを先に検討するほうが早い。

回転に弱くなる理由と角度刻みテンプレートを並べる現実解のコスト

回転にはさらに弱い。窓とテンプレートは画素の並びをそのまま比較するため、対象が数度傾いただけで対応する画素同士がずれ、類似度が急に落ちます。matchTemplateに回転を吸収する引数はありません。

現実解は、テンプレートを角度刻みで回転させて何枚も用意し、全部試すことです。5度刻みで360度なら72枚、これに拡大縮小5段階を掛けると360回の探索になる。角度が±10度に収まると分かっているなら5枚で済みます。範囲を機構側で狭められるかどうかが採否の分かれ目です。

照明ムラと遮蔽で正規化相関が破綻する境界と前処理で戻せる範囲

明るさが画像全体で一様に変わるだけなら、TM_CCOEFF_NORMEDが平均を引く操作でおおむね吸収します。破綻するのは、画像の左右で明るさが違う、対象の一部にだけ影が落ちるといったムラのある変化です。平均は画像全体で1つしか引かないため、局所的なずれは残ります。

前処理で戻せる範囲もはっきりしています。照明ムラは適応的二値化やエッジ抽出で軽減でき、輪郭が保たれているうちは有効です。しきい値の決め方は二値化のしきい値の決め方と大津・適応的の使い分けで扱っています。一方、対象が半分隠れる遮蔽では、隠れた領域の画素が丸ごと不一致になるため、隠れ方が既知でマスクに落とせる場合を除いて手はありません。

特徴点マッチングへの切り替え基準|ORBとAKAZEの既定値から読む適用条件

大きさや向きが変わる対象では、画素の並びを比べる代わりに、画像の中の目立つ点だけを取り出して照合する特徴点マッチングへ切り替えます。OpenCVに標準で入り特許の制約もないのがORBとAKAZEです。

ORBの既定値が示す探索範囲とハミング距離での照合という設計

ORBの生成関数の既定値は、nfeatures=500、scaleFactor=1.2、nlevels=8、edgeThreshold=31、WTA_K=2、scoreType=HARRIS_SCORE、patchSize=31、fastThreshold=20です。scaleFactorとnlevelsが示すのは探索する大きさの幅で、1.2の8乗はおよそ4.3倍。既定のままで4倍強の違いまで追えます。

記述子は32バイトの二値列で、照合はビットの違いを数えるハミング距離で行う。公式ヘッダにも、ORBにはNORM_HAMMING、WTA_Kを3か4にしたときはNORM_HAMMING2を使うと明記されています。この設計のおかげでORBは軽く、組み込み機器にも載せやすい。

AKAZEの既定パラメータと非線形拡散に基づく検出の向き不向き

AKAZEの既定値は、descriptor_type=DESCRIPTOR_MLDB、descriptor_size=0(フルサイズ)、descriptor_channels=3、threshold=0.001、nOctaves=4、nOctaveLayers=4、diffusivity=DIFF_PM_G2です。ぼかす段階で輪郭を残す非線形拡散を使うため、エッジ付近の特徴点が滲みにくい。

thresholdを0.001から下げれば点は増えますが、計算時間も伸びる。ORBのnfeatures=500という上限と違い、AKAZEは既定のmax_pointsが-1で点の数に制限がなく、画像によって検出数が変動します。速度を優先するならORB、輪郭の質を優先するならAKAZEの順で試すと判断が早い。

無地の部品では特徴点が出ないという事実から見る使い分けの条件

特徴点マッチングは常に上位互換ではありません。ORBもAKAZEも、輝度が急に変わる角や斑点を手がかりに点を打ちます。表面が均一な金属板、無地の樹脂部品、単色のボタンでは点がほとんど出ず、照合そのものが成立しない。

判断の順序は決まっています。模様や刻印があり、かつ大きさか向きが変わるなら特徴点マッチング。模様が乏しく、大きさも向きも固定できるならテンプレートマッチング。模様が乏しいのに大きさや向きが変わるなら、どちらでも解けないので次章の物体検出へ渡します。

ディープラーニング物体検出との使い分け|学習データ量と見えのばらつきで決まる線引き

テンプレートマッチングと物体検出は、同じ「対象の位置を出す」処理でありながら必要な準備が違います。前者はテンプレート画像1枚、後者は数百枚から数千枚の注釈付き画像です。

学習データを用意するコストと見えのばらつきで決まる手法の分岐点

物体検出は、見え方のばらつきごと学習させる手法です。裏返せば、ばらつきの分だけ画像を集めて枠を付ける作業が発生する。1クラスあたり数百枚という規模感は、撮影と注釈で数日から数週間の工数になります。手法の系譜と選定の考え方は物体検出の仕組みと代表手法の比較に整理しています。

分岐点は、テンプレートを何枚用意すれば足りるかで測れます。角度5パターンと大きさ3パターンの15枚で収まるなら、こちらのほうが早くて安い。個体ごとに形が違う、背景が毎回変わる、種類が10を超えるといった条件では枚数が発散し、学習側に切り替えたほうが総コストは下がります。

テンプレートマッチングを採用しない場面を条件付きで言い切る基準

次の条件に当てはまるなら、この手法は採用しません。

  • 形が毎回変わる(袋詰めの食品、束ねたケーブル、盛り付けた食材)
  • 屋外や窓際で、時間帯によって光の向きと色温度が変わる
  • 種類が10を超え、種類ごとにテンプレートを保守し続ける必要がある
  • 対象が他の物に重なって隠れる割合が読めない

逆に、対象が剛体で、照明が固定され、種類が数個までに収まる工程なら、学習モデルを持ち込むほうが過剰です。計算資源もモデル再学習の運用も要らない処理で足りるところに、更新のたびに精度確認が要る仕組みを入れる理由はない。「まずAIで」と決めると、教師データの用意で数週間を失ってから戻ってきます。手法単位ではなく工程全体でどちらへ倒すかを決めるなら、画像処理AIとは?古典的手法とディープラーニングの使い分けを実装判断で解説で判断軸を整理しています。

位置決め・欠品検査・画面自動テストで変わる実装判断と委託の線引き

同じmatchTemplateでも、要求される精度と失敗の損失は用途で違います。実装の勘所を用途ごとに分けます。

位置決めの精度を左右する探索領域の限定と前処理の順番の決め方

位置決めでは、対象がだいたいどこに来るかが分かっているのが普通です。全体を探索せず、想定範囲を切り出した部分画像にmatchTemplateを掛けると、計算量が減るだけでなく誤検出も減る。1920×1080の全面探索を200×200に絞れば、探索位置の数はおよそ50分の1になります。

前処理の順番も結果を変えます。ぼかしを掛けるならテンプレートと入力画像の両方へ同じ条件で掛ける。片方だけだと輪郭の鈍り方が違い、類似度が下がります。画素より細かい精度が要るなら、結果画像の最大値とその周囲に放物線を当てはめて頂点を求める補間を足せば、実装を大きく変えずに分解能を上げられる。

欠品検査で差分を見るときのしきい値の運用と二値化前処理の位置

欠品検査は、部品があるかないかを見る用途です。検査位置ごとにテンプレートを持ち、正規化した類似度がしきい値を下回ったら欠品と判定する。効くのは、良品だけでなく実際の欠品状態でも最大値を測っておくことです。良品の分布しか見ていないと、しきい値が甘いまま出荷検査に流れます。

二値化を前段に入れるかは、対象の写り方で決まります。金属光沢のように輝度が回ごとに変わる対象では、二値化してから照合したほうが安定する。逆に微細な傷や汚れまで見たい工程では、二値化が情報を落として検出できなくなります。傷まで求めるなら部品の有無に限定し、傷は別の手法へ分けるほうが崩れにくい。

画面自動テストの既定しきい値0.4と拡大縮小の既定オフという罠

画面自動テストや業務自動化のツールは、内部でテンプレートマッチングを使って画面上のボタンを探しています。既定値を知らないまま使うと失敗の切り分けができません。Appiumの画像プラグインは、テンプレート画像をbase64で渡す-imageロケータを提供し、imageMatchThresholdの既定値は0.4です。0が「しきい値なし」、1が「画素単位で完全一致」という尺度での0.4なので、かなり緩い。

解像度まわりの既定値はさらに注意が要ります。テンプレートが画面画像より大きいと照合は自動的に失敗するのに、それを縮小するfixImageTemplateSizeの既定値はfalseです。縮小率にテンプレートを合わせるfixImageTemplateScaleもfalseで、defaultImageTemplateScaleは1.0。iOSの750×1334の画像がウィンドウサイズ375×667に0.5倍で縮小される例が公式に載っており、この挙動を知らずに撮ったテンプレートは一致しません。

SikuliXも同じ構造です。Settings.javaを見るとMinSimilarityの既定は0.7、AlwaysResizeは0、直前に見つけた位置を優先するCheckLastSeenはtrueで、その判定に使うCheckLastSeenSimilarは0.95。画像で画面を操作する仕組みが端末や解像度に縛られる構造は画像認識に依存した自動化が壊れる理由の通りで、テストが落ちたとき疑う順番はテンプレートの撮り直しより先に設定値です。

自社で実装する範囲と画像認識の受託開発へ渡す範囲の線引きの基準

ここまでの内容は、Pythonが書ける担当者なら自社で組める範囲です。テンプレート1枚、正規化した指標、しきい値の分布確認、探索領域の限定。この4点で解ける工程の外注は費用の無駄です。

線引きが変わるのは、次のいずれかが入ったときです。産業用カメラや照明を含む撮像系ごと設計する場合。この手法では解けないと判明し、学習データの収集からモデル運用まで必要になった場合。検査結果を製造実行システムや品質記録に接続し、装置の停止判断まで担わせる場合。撮像条件の設計から手法選定までを一緒に見る必要があるなら、画像認識AIモデル構築のように要件定義から引き受ける形が向きます。

よくある質問

実装で問い合わせの多い点を、判断できる粒度で答えます。

テンプレートマッチングと物体検出は何が違いますか?

テンプレートマッチングは、切り出した1枚の画像と画素単位で見比べて位置を返す処理で、学習は要りません。物体検出は多数の注釈付き画像から見え方そのものを学習し、大きさや向きが変わっても検出できるようにする手法です。準備の重さと、ばらつきへの強さが逆になっている。対象が剛体で撮影条件を固定できるならテンプレートマッチング、個体差が大きいなら物体検出という順で検討します。

類似度のしきい値はいくつに設定すればよいですか?

正規化した指標なら0.8前後から始めますが、この数値は出発点でしかありません。対象が写っている画像と写っていない画像をそれぞれ10枚ほど流し、最大値の分布を測って谷の位置に置きます。2つの分布が重なっているなら、しきい値の調整では解けない。前処理か指標か撮影条件のどれかを直す段階です。非正規化の指標は値の範囲が画素数と輝度で変わるため、しきい値を固定できません。

回転した対象を検出するにはどうすればよいですか?

matchTemplateに回転を吸収する仕組みはないため、テンプレートを角度刻みで回転させて用意し、全て試すのが基本の対処です。5度刻みで360度なら72枚の探索になり、処理時間も72倍に近づく。角度の範囲が±10度程度に収まるなら5枚前後で足ります。範囲が読めないならORBやAKAZEの特徴点マッチングへ切り替えたほうが早い。特徴点は向きの情報を持つため、回転が入っても照合できます。

複数の対象を同時に見つけることはできますか?

できます。minMaxLocは最良の1点しか返さないため、結果画像からしきい値を超える座標を全て取り出す処理を自分で書きます。numpyのwhereで集める方法が一般的です。ただし1つの対象の周囲は類似度の高い画素が固まるため、そのままでは同じ対象を何十回も検出する。近い座標を統合する処理を後段に入れて、1対象1件に整理します。

テンプレート画像はどう用意すればよいですか?

本番と同じカメラ・同じ照明・同じ距離で撮った画像から切り出します。別環境で撮った画像や画面写真の流用は、解像度と色味の差で一致しなくなる原因です。切り出す範囲は対象を判別できる最小限にとどめ、背景を含めないほうが安定する。背景が必ず混ざる対象では、mask引数で背景を計算から外してください。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.06 テックブログ 大和証券の不正アクセスと約11万人分の口座番号:問い合わせ管理の委託先に残さない設計
  2. 2026.10.06 テックブログ 焼肉きんぐの不正アクセスと1,078万件の会員情報|全件規模の流出を防ぐAPIとログの点検
  3. 2026.10.06 テックブログ 原子力研究開発機構の不正アクセスと身分証画像の漏えい|研究支援サイトのファイル保管を点検する手順
  4. 2026.10.04 テックブログ デジタル庁GSSの不正アクセスと約24.6万件|CVSS中のVPN脆弱性を何で優先するか
  5. 2026.10.01 テックブログ AWS VPN Clientの使い方:6.x系のインストールとCLI・接続できない時の確認先

RELATED POSTS 関連記事

目次