opencvラーニングテン:テンプレートマッチング

テンプレートマッチングの原則

テンプレートマッチングは、画像内の特定のターゲットを見つける方法の1つです。この方法の原理は非常に単純です。画像内のすべての可能な位置をトラバースし、テンプレートと「類似」しているかどうかを比較します。類似性が高い場合その時、私たちは自分たちの目標を見つけたと思いました。

実際、テンプレートマッチングのアイデアも非常にシンプルで暴力的です。テンプレート画像を保持し、特定の領域の類似性が設定したしきい値より低くなるまで、元の画像の左上から右下にスライドすることです。 、次に、その領域がテンプレートと一致すると考えます。つまり、探していた場所を見つけてマークを付けました。
Tがテンプレート画像を表し、Iが照合される画像を表し、カットされたテンプレート画像の幅がw、高さがh、Rが照合結果であるとします。照合プロセスを次の図に示します
ここに画像の説明を挿入
。OpenCVは6を提供します。テンプレートマッチングアルゴリズム:
ここに画像の説明を挿入CV_TM_SQDIFF二乗差分マッチング方法最良の一致は0であり、値が大きいほど一致
度が低くなりますCV_TM_SQDIFF_NORMED正規化二乗差マッチング
CV_TM_CCORR乗算演算を使用した相関マッチング方法、値が大きいほど一致度が高くなります
CV_TM_CCORR_NORMED正規化相関マッチング
CV_TM_CCOEFF相関マッチング最良の一致は1で、-1は最悪の一致を意味します
。CV_TM_CCOEFF_NORMED正規化された相関係数の一致方法。
最初の2つの方法の値が小さいほど一致が良く、最後の4つの方法の値が大きいほど良くなります。一致。

ここに画像の説明を挿入

OpenCVテンプレートマッチングの実装

cv2.matchTemplate(image、templ、method、result = None、mask = None)

画像:検索
する画像templ:テンプレート画像
方法:一致度の計算方法
結果:一致結果、行列

cv2.minMaxLoc(src、mask = None)
srcは行列です。cv2.matchTemplateの戻り値を入力します

関数関数:行列aがあり、この行列の最小値と最大値を要求し、最大インデックスと最小インデックスを取得する必要があるとします。インデックスは位置座標です

import cv2 as cv
import numpy as np

def template_demo():
    tpl = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/tpl.png") #模板
    target = cv.imread("C:/Users/lenovo/Desktop/opencv/daima/banknum/template-matching-ocr/images/credit_card_01.png")#待检测图
    cv.imshow("template image", tpl)
    cv.imshow("target image", target)
    methods = [cv.TM_SQDIFF_NORMED, cv.TM_CCORR_NORMED, cv.TM_CCOEFF_NORMED]#归一化均方误差,归一化相关匹配,归一化相关系数
    th, tw = tpl.shape[:2] #取出模板的高宽 [:n]表示此列表的前n维度
    for md in methods:
        print(md)
        result = cv.matchTemplate(target, tpl, md)
        min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)#寻找最小值,最大值。最小值位置,最大值位置
        if md == cv.TM_SQDIFF_NORMED:
            tl = min_loc #tl是矩形左上角的点
        else:
            tl = max_loc
        br = (tl[0] + tw, tl[1] + th);
        cv.rectangle(target, tl, br, (0, 0, 255), 2)#rectangle函数用法,第一个参数是在哪个图上绘图,第二个和第三个是左上、右下位置顶点坐标,颜色为红色,宽度为2
        #cv.imshow("match--"+np.str(md), target)
        cv.imshow("match--" + np.str(md), result)
#match1 是平方不同的归一化,3是相关性的归一化,5是相关性因子的归一化
#以0~255的灰度范围标记算法算出来的相关性,目标图像的区域越白,这个区域与template的相关性越大


cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)

template_demo()
cv.waitKey(0)
cv.destroyAllWindows()

スクリーンショットを実行する:
match1はさまざまな正方形の正規化、3は相関の正規化、5は相関係数の正規化です。
ここに画像の説明を挿入
結果を実行して表示することもできます:
0からグレースケールマークアルゴリズムによって計算された相関255ターゲット画像の領域が白いほど、この領域とテンプレートの間の相関が大きくなります。
ここに画像の説明を挿入
結果の画像が検出される画像よりも小さいのはなぜですか?
結果からテンプレートの幅と高さが差し引かれるため、テンプレートの4つの頂点でカバーされる領域の中心は、幅と高さのちょうど半分になります。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44145452/article/details/112505445