質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

Pythonのテンプレートマッチングの際のコンソール表示

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,509

score 9

前提・実現したいこと

テンプレートマッチングを行った際に、コンソールに表示された値のうち、1行目の数値が一番大きいなら「1です」、2行目の数値が一番大きいなら「2です」と表示されるようにしたいです。どのように書けばよいか全くわからないので教えていただきたいです。よろしくお願いいたします。
イメージ説明
イメージ説明

該当のソースコード

import cv2
import numpy as np

def main():
    # 入力画像とテンプレート画像をで取得
    img = cv2.imread("image1.jpg")
    temp1 = cv2.imread("1.jpg")
    temp2 = cv2.imread("2.jpg")
    temp3 = cv2.imread("3.jpg")
    temp4 = cv2.imread("4.jpg")
    temp5 = cv2.imread("5.jpg")
    temp6 = cv2.imread("6.jpg")
    temp7 = cv2.imread("7.jpg")
    temp8 = cv2.imread("8.jpg")

    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)   
    temp1 = cv2.cvtColor(temp1, cv2.COLOR_RGB2GRAY)   
    temp2 = cv2.cvtColor(temp2, cv2.COLOR_RGB2GRAY)
    temp3 = cv2.cvtColor(temp3, cv2.COLOR_RGB2GRAY)
    temp4 = cv2.cvtColor(temp4, cv2.COLOR_RGB2GRAY)
    temp5 = cv2.cvtColor(temp5, cv2.COLOR_RGB2GRAY)
    temp6 = cv2.cvtColor(temp6, cv2.COLOR_RGB2GRAY)
    temp7 = cv2.cvtColor(temp7, cv2.COLOR_RGB2GRAY)
    temp8 = cv2.cvtColor(temp8, cv2.COLOR_RGB2GRAY)

    # テンプレート画像の高さ・幅
    h, w = temp1.shape

    # テンプレートマッチング(OpenCVで実装)
    match = cv2.matchTemplate(gray, temp1, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)

    match = cv2.matchTemplate(gray, temp2, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)

    match = cv2.matchTemplate(gray, temp3, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)

    match = cv2.matchTemplate(gray, temp4, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)

    match = cv2.matchTemplate(gray, temp5, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)

    match = cv2.matchTemplate(gray, temp6, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)

    match = cv2.matchTemplate(gray, temp7, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)

    match = cv2.matchTemplate(gray, temp8, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)
    # テンプレートマッチングの結果を出力
    cv2.rectangle(img, (pt[0], pt[1] ), (pt[0] + w, pt[1] + h), (0,0,200), 3)
    cv2.imwrite("output.jpg", img)


if __name__ == "__main__":
    main()

補足情報(FW/ツールのバージョンなど)

上の例で言うと、入力画像(image1.jpg)と、1~8までのテンプレート画像(1.jpg~8.jpg)をテンプレートマッチングさせて、数字の1の画像がマッチングしたので1行目が一番大きな値になっています。この際に、「1です」と追加表示させたいです。2や3の時も同様に、「2です」「3です」と表示させたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tiitoi

    2019/08/21 13:53

    1行目、2行目とはなんの行数のことを指しているのでしょうか。

    キャンセル

  • TMaccount2

    2019/08/21 13:56

    2枚目の画像にあるコンソールに表示された文字列です。画像でいうと1行目は1.0 1.0 (0, 0) (0, 0)ということになります。

    キャンセル

回答 1

checkベストアンサー

0

テンプレートマッチングをして、minMaxLoc で類似度の最大値を取得していますが、それを保存しておいて、最後に一番大きい値のものを取得すればよいです。

import cv2
import numpy as np

target_img = cv2.imread("image1.jpg", cv2.IMREAD_GRAYSCALE)

match_val = {}
for i in range(1, 10):
    # テンプレート画像を読み込む。 1.jpg, 2.jpg, ...
    temp_img_path = f"{i}.jpg"
    temp_img = cv2.imread(temp_img_path, cv2.IMREAD_GRAYSCALE)
    if temp_img is None:
        print(f"faild to load template image. {temp_img_path}")
        continue

    # テンプレートマッチング
    match = cv2.matchTemplate(target_img, temp_img, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    # キーを番号、値を最大値とした辞書に保存する。
    match_val[i] = max_value

max_no = max(match_val, key=match_val.get)
print(f"{max_no} です。")

追記

質問のコードを利用してやるなら以下のようにすればよいです。

import cv2
import numpy as np

match_val = {}
def main():
    # 入力画像とテンプレート画像をで取得
    img = cv2.imread("image1.jpg")
    temp1 = cv2.imread("1.jpg")
    temp2 = cv2.imread("2.jpg")
    temp3 = cv2.imread("3.jpg")
    temp4 = cv2.imread("4.jpg")
    temp5 = cv2.imread("5.jpg")
    temp6 = cv2.imread("6.jpg")
    temp7 = cv2.imread("7.jpg")
    temp8 = cv2.imread("8.jpg")

    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)   
    temp1 = cv2.cvtColor(temp1, cv2.COLOR_RGB2GRAY)   
    temp2 = cv2.cvtColor(temp2, cv2.COLOR_RGB2GRAY)
    temp3 = cv2.cvtColor(temp3, cv2.COLOR_RGB2GRAY)
    temp4 = cv2.cvtColor(temp4, cv2.COLOR_RGB2GRAY)
    temp5 = cv2.cvtColor(temp5, cv2.COLOR_RGB2GRAY)
    temp6 = cv2.cvtColor(temp6, cv2.COLOR_RGB2GRAY)
    temp7 = cv2.cvtColor(temp7, cv2.COLOR_RGB2GRAY)
    temp8 = cv2.cvtColor(temp8, cv2.COLOR_RGB2GRAY)

    # テンプレート画像の高さ・幅
    h, w = temp1.shape

    # テンプレートマッチング(OpenCVで実装)
    match = cv2.matchTemplate(gray, temp1, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)
    match_val[1] = max_value  # テンプレート画像1を使ってテンプレートマッチングしたときの類似度の最大値を保存

    match = cv2.matchTemplate(gray, temp2, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)
    match_val[2] = max_value  # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存

    match = cv2.matchTemplate(gray, temp3, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)
    match_val[3] = max_value  # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存

    match = cv2.matchTemplate(gray, temp4, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)
    match_val[4] = max_value  # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存

    match = cv2.matchTemplate(gray, temp5, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)
    match_val[5] = max_value  # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存

    match = cv2.matchTemplate(gray, temp6, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)
    match_val[6] = max_value  # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存

    match = cv2.matchTemplate(gray, temp7, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)
    match_val[7] = max_value  # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存

    match = cv2.matchTemplate(gray, temp8, cv2.TM_CCOEFF_NORMED)
    min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match)
    pt = max_pt
    print(min_value, max_value, min_pt, max_pt)
    # テンプレートマッチングの結果を出力
    cv2.rectangle(img, (pt[0], pt[1] ), (pt[0] + w, pt[1] + h), (0,0,200), 3)
    cv2.imwrite("output.jpg", img)
    match_val[8] = max_value  # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存

    # 類似度が一番大きいときのキーの値を出力する。
    max_no = max(match_val, key=match_val.get)
    print(f"{max_no} です。")


if __name__ == "__main__":
    main()

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/21 14:46

    回答ありがとうございます。私は初心者なものでこの回答を見ただけではよく分からないのです。私が記載したソースコードのどこにこちらの回答を組み込めばよいのか教えていただけるとありがたいです。

    キャンセル

  • 2019/08/21 15:09

    質問のコードに追記する形でやるなら、
    match_val = {} という辞書を用意して、
    match_val[1] = 1のときの類似度の最大値
    match_val[2] = 2のときの類似度の最大値
    ...
    と記録して、最後に match_val で値が最大となるキーを探せばよいです。
    コードを追記しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る