1枚のテンプレート画像を用いてA~Dの4人の顔写真(それぞれ10枚)から目領域を抽出できるようにしたいです。
ツリーは以下のようになっています。
template/ ├A/(10枚) ├B/(10枚) ├C/(10枚) ├D/(10枚) ├temp.jpg
元々のテンプレートマッチングのコードを以下に示します。
このコードではマッチングを行いたい画像のパスをいちいち書き換える必要があります。
from google.colab import drive drive.mount('/content/drive') import cv2 import numpy as np #画像をグレースケールで読み込む fname_img1='/content/drive/My Drive/template/A/(1).jpg' fname_img2='/content/drive/My Drive/template/temp.jpg' img = cv2.imread(fname_img1, 0) temp = cv2.imread(fname_img2, 0) #マッチングテンプレートを実行 match_result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF_NORMED) #類似度の設定(0~1) threshold = 0.8 #検出結果から検出領域の位置を取得 loc=np.where(match_result >= threshold) #検出領域を四角で囲んで保存 w, h = temp.shape[::-1] for top_left in zip(*loc[::-1]): bottom_right = (top_left[0] + w, top_left[1] + h) #保存 result = cv2.imread(fname_img1) #height = img.shape[0] #width = img.shape[1] #result = cv2.resize(img , (int(width*1.0), int(height*1.0))) cv2.rectangle(result,top_left, bottom_right, (255, 0, 0), 10) cv2.imwrite('/content/drive/My Drive/template/Dm/result2/'+"(22).jpg", result)
for文を使っている他のコードをまねてなんとかならないかやってみた結果が以下のコードです。
しかし、エラーが出てしまい上手く行かないです。
from google.colab import drive drive.mount('/content/drive') import cv2 import numpy as np from __future__ import print_function from scipy import ndimage import cv2 import glob import os SearchName = ["A","B","C","D"] fname_img2='/content/drive/My Drive/template/temp.jpg' for name in SearchName: fname_img1 = "/content/drive/My Drive/template/"+name+"/*" out_dir = "/content/drive/My Drive/template/result"+name os.makedirs(out_dir, exist_ok=True) in_jpg=glob.glob(fname_img1) img = cv2.imread(fname_img1, 0) temp = cv2.imread(fname_img2, 0) #マッチングテンプレートを実行 match_result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF_NORMED) #類似度の設定(0~1) threshold = 0.8 #検出結果から検出領域の位置を取得 loc=np.where(match_result >= threshold) #検出領域を四角で囲んで保存 w, h = temp.shape[::-1] for top_left in zip(*loc[::-1]): bottom_right = (top_left[0] + w, top_left[1] + h) #保存 result = cv2.imread(fname_img1) #height = img.shape[0] #width = img.shape[1] #result = cv2.resize(img , (int(width*1.0), int(height*1.0))) cv2.rectangle(result,top_left, bottom_right, (255, 0, 0), 10) cv2.imwrite(str(fileName), result) **__以下がエラーになります__** Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True). --------------------------------------------------------------------------- error Traceback (most recent call last) <ipython-input-58-abd3c5273ca8> in <module>() 23 24 #マッチングテンプレートを実行 ---> 25 match_result = cv2.matchTemplate(img, temp, cv2.TM_CCOEFF_NORMED) 26 27 #類似度の設定(0~1) error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/templmatch.cpp:588: error: (-215:Assertion failed) corr.rows <= img.rows + templ.rows - 1 && corr.cols <= img.cols + templ.cols - 1 in function 'crossCorr'
どのように書き換えれば上手くいくかご教示ください。よろしくお願いいたします。
追記
下記ページで似たようなエラーに対する質問がありました。
https://teratail.com/questions/182763
そのページではテンプレート画像がマッチングを行いたい画像よりも大きい?ことが原因と書かれていました。
しかし、私の場合、テンプレート画像は40×15ピクセルで、マッチングを行いたい画像は250×250ピクセルなので問題はないはずです。また、一枚ずつテンプレートマッチングを行ったときはこのようなエラーは発生しておりません。複数の写真に対して一度にテンプレートマッチングを行えるように書き直した途端、このエラーが出ました。使用している画像に変更がないにもかかわらず、です。
引き続き知恵をお貸しください、よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。