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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

Q&A

解決済

2回答

1205閲覧

for文を使ってテンプレートマッチングを一度に行いたい

bibienvy

総合スコア5

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

0グッド

0クリップ

投稿2020/10/07 06:57

編集2020/10/08 06:12

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ピクセルなので問題はないはずです。また、一枚ずつテンプレートマッチングを行ったときはこのようなエラーは発生しておりません。複数の写真に対して一度にテンプレートマッチングを行えるように書き直した途端、このエラーが出ました。使用している画像に変更がないにもかかわらず、です。
引き続き知恵をお貸しください、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

fname_img1 = "/content/drive/My Drive/template/"+name+"/"
というパスの書き方に原因があるようでした。
試しにfname_img1をprintすることで、パスを表示させてみたところ
/content/drive/My Drive/template/A/

という結果が得られました。このことからAのフォルダに含まれている画像を読み込めていないことが分かります。
そこで、パスの書き方を以下の様に直しました。
fname_img1 = "/content/drive/My Drive/template/"+name+"/*.jpg"
これによりAのフォルダ内に含まれるすべての画像をfname_img1に格納することが出来ます。
それをglob.globでlist_fという新たに用意した変数に取得させます。
list_f = glob.glob(fname_img1)
このlist_fに入っている画像をfor文で一つ一つ繰り返すことで、すべての写真にテンプレートマッチングを行うことが出来ました。

投稿2020/10/08 09:48

bibienvy

総合スコア5

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

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

0

2行目の
drive.mount('/content/drive')
これを
drive.mount('/content/drive',force_remount = True)
これに変えるとどうでしょうか。

投稿2020/10/07 07:15

firegrape

総合スコア902

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

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

bibienvy

2020/10/07 07:20

回答ありがとうございます! やってみたところ、同じエラーを吐きました。
firegrape

2020/10/07 07:27

承知しました。 ↓ここでエラー出てるみたいですが、 ここのソースは貼れますか。 function 'crossCorr'
bibienvy

2020/10/07 07:34

crosscorrという言葉がなんなのかわからない状態でして、ソースがどこにあるのかもわからないです・・・申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問