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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1033閲覧

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

TMaccount2

総合スコア9

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/08/21 04:40

編集2019/08/21 04:41

前提・実現したいこと

テンプレートマッチングを行った際に、コンソールに表示された値のうち、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です」と表示させたいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/08/21 04:53

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

2019/08/21 04:56

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

回答1

0

ベストアンサー

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

python

1import cv2 2import numpy as np 3 4target_img = cv2.imread("image1.jpg", cv2.IMREAD_GRAYSCALE) 5 6match_val = {} 7for i in range(1, 10): 8 # テンプレート画像を読み込む。 1.jpg, 2.jpg, ... 9 temp_img_path = f"{i}.jpg" 10 temp_img = cv2.imread(temp_img_path, cv2.IMREAD_GRAYSCALE) 11 if temp_img is None: 12 print(f"faild to load template image. {temp_img_path}") 13 continue 14 15 # テンプレートマッチング 16 match = cv2.matchTemplate(target_img, temp_img, cv2.TM_CCOEFF_NORMED) 17 min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match) 18 # キーを番号、値を最大値とした辞書に保存する。 19 match_val[i] = max_value 20 21max_no = max(match_val, key=match_val.get) 22print(f"{max_no} です。")

追記

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

python

1import cv2 2import numpy as np 3 4match_val = {} 5def main(): 6 # 入力画像とテンプレート画像をで取得 7 img = cv2.imread("image1.jpg") 8 temp1 = cv2.imread("1.jpg") 9 temp2 = cv2.imread("2.jpg") 10 temp3 = cv2.imread("3.jpg") 11 temp4 = cv2.imread("4.jpg") 12 temp5 = cv2.imread("5.jpg") 13 temp6 = cv2.imread("6.jpg") 14 temp7 = cv2.imread("7.jpg") 15 temp8 = cv2.imread("8.jpg") 16 17 # グレースケール変換 18 gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) 19 temp1 = cv2.cvtColor(temp1, cv2.COLOR_RGB2GRAY) 20 temp2 = cv2.cvtColor(temp2, cv2.COLOR_RGB2GRAY) 21 temp3 = cv2.cvtColor(temp3, cv2.COLOR_RGB2GRAY) 22 temp4 = cv2.cvtColor(temp4, cv2.COLOR_RGB2GRAY) 23 temp5 = cv2.cvtColor(temp5, cv2.COLOR_RGB2GRAY) 24 temp6 = cv2.cvtColor(temp6, cv2.COLOR_RGB2GRAY) 25 temp7 = cv2.cvtColor(temp7, cv2.COLOR_RGB2GRAY) 26 temp8 = cv2.cvtColor(temp8, cv2.COLOR_RGB2GRAY) 27 28 # テンプレート画像の高さ・幅 29 h, w = temp1.shape 30 31 # テンプレートマッチング(OpenCVで実装) 32 match = cv2.matchTemplate(gray, temp1, cv2.TM_CCOEFF_NORMED) 33 min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match) 34 pt = max_pt 35 print(min_value, max_value, min_pt, max_pt) 36 match_val[1] = max_value # テンプレート画像1を使ってテンプレートマッチングしたときの類似度の最大値を保存 37 38 match = cv2.matchTemplate(gray, temp2, cv2.TM_CCOEFF_NORMED) 39 min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match) 40 pt = max_pt 41 print(min_value, max_value, min_pt, max_pt) 42 match_val[2] = max_value # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存 43 44 match = cv2.matchTemplate(gray, temp3, cv2.TM_CCOEFF_NORMED) 45 min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match) 46 pt = max_pt 47 print(min_value, max_value, min_pt, max_pt) 48 match_val[3] = max_value # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存 49 50 match = cv2.matchTemplate(gray, temp4, cv2.TM_CCOEFF_NORMED) 51 min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match) 52 pt = max_pt 53 print(min_value, max_value, min_pt, max_pt) 54 match_val[4] = max_value # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存 55 56 match = cv2.matchTemplate(gray, temp5, cv2.TM_CCOEFF_NORMED) 57 min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match) 58 pt = max_pt 59 print(min_value, max_value, min_pt, max_pt) 60 match_val[5] = max_value # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存 61 62 match = cv2.matchTemplate(gray, temp6, cv2.TM_CCOEFF_NORMED) 63 min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match) 64 pt = max_pt 65 print(min_value, max_value, min_pt, max_pt) 66 match_val[6] = max_value # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存 67 68 match = cv2.matchTemplate(gray, temp7, cv2.TM_CCOEFF_NORMED) 69 min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match) 70 pt = max_pt 71 print(min_value, max_value, min_pt, max_pt) 72 match_val[7] = max_value # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存 73 74 match = cv2.matchTemplate(gray, temp8, cv2.TM_CCOEFF_NORMED) 75 min_value, max_value, min_pt, max_pt = cv2.minMaxLoc(match) 76 pt = max_pt 77 print(min_value, max_value, min_pt, max_pt) 78 # テンプレートマッチングの結果を出力 79 cv2.rectangle(img, (pt[0], pt[1] ), (pt[0] + w, pt[1] + h), (0,0,200), 3) 80 cv2.imwrite("output.jpg", img) 81 match_val[8] = max_value # テンプレート画像2を使ってテンプレートマッチングしたときの類似度の最大値を保存 82 83 # 類似度が一番大きいときのキーの値を出力する。 84 max_no = max(match_val, key=match_val.get) 85 print(f"{max_no} です。") 86 87 88if __name__ == "__main__": 89 main()

投稿2019/08/21 05:18

編集2019/08/21 06:08
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TMaccount2

2019/08/21 05:46

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

2019/08/21 06:09

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問