python
1import cv2 2import matplotlib.pyplot as plt 3import numpy as np 4 5 6# 入力画像、テンプレート画像を読み込む。 7img = cv2.imread('mosaic2.jpg',0) #変形後 8image = cv2.imread('mosaic1.jpg',0) 9template = image[29:114,207:292] # テンプレート画像 10 11 12# テンプレートマッチングを行う。 13result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) 14 15H, W = img.shape 16h, w = template.shape 17 18print('img.shape', img.shape) 19print('template.shape', template.shape) 20 21print(H - h + 1, W - w + 1) 22print('result.shape', result.shape) 23 24x, y = 207,29 25position1 = np.array([207, 29]) 26 27# 検索窓の範囲を描画する。 28fig, ax = plt.subplots(facecolor="w") 29ax.add_patch(plt.Rectangle((x, y), w, h, ec="r", fc="none")) 30ax.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) 31 32plt.show() 33 34# 最も類似度が高い位置を取得する。 35minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result) 36print(f"max value: {maxVal}, position: {maxLoc}") 37 38# 描画する。 39fig, ax = plt.subplots(facecolor="w") 40ax.add_patch(plt.Rectangle(maxLoc, w, h, ec="r", lw=1, fc="none")) 41ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) 42 43plt.show() 44
↓mosaic1の画像です。
画像として貼り付けできないのでこちらにリンクとして貼ります。
リンク内容
最初の画像から抽出した部分だけをテンプレートマッチングしたいのですが、
今のプログラムではマッチング結果が-5°回転しただけで精度が低くなってしまいます。
最も類似度が高い位置を取得し、それを描画した時に赤い正方形が-5°回転している形になりたいのですがどのようにプログラムを書き換えればよいかどなたか教えてください。
また、実行結果で一枚目の画像と二枚目の画像が同時に出力されるにはどうすればよいでしょうか
参考しているサイトはこちらになります。
リンク内容
長文乱文で申し訳ありませんが行き詰まっているのでどなたか教えてください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/26 09:59
退会済みユーザー
2019/11/26 21:38
2019/11/27 04:37
2019/11/27 05:07
2019/11/27 05:19