teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

2020/06/30 19:53

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -23,7 +23,7 @@
23
23
 
24
24
  # 最も類似度が高い位置と低い位置を取得
25
25
  minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)
26
- print(result)
26
+
27
27
 
28
28
  if maxVal >= 0.8:
29
29
  img[
@@ -32,7 +32,4 @@
32
32
  ] = 255
33
33
 
34
34
  return img
35
-
36
-
37
- imshow(erase_img("a.png", "b.png"))
38
35
  ```

1

修正

2020/06/30 19:53

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -7,5 +7,32 @@
7
7
  ] = 255 # 白塗りして保存
8
8
  ```
9
9
 
10
- それはそうとして、上記を直さないとエラーがでるはずなので、エラーもでないということは、そもそも呼び出し側の `for targetimg in targetimgs` のループが1回も回っていないのではないでしょう
10
+ それはそうとして、`if num == 1`、つまり、類似度厳密に1るとは、テンプレート画像と全く同じ画素を持つ領域が検索対象の画像にある場合すので、まずこの条件に引っかからないでしょう
11
+ `if maxVal >= 0.8:` のように条件をゆるめてみてはどうでしょうか
12
+
13
+ ## 修正後のコード
14
+
15
+ ```python
16
+ import cv2
17
+
18
+ def erase_img(img_path, templ_path):
19
+ img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
20
+ templ = cv2.imread(templ_path, cv2.IMREAD_GRAYSCALE)
21
+
11
- print() を入れるなどして、まず erase_img() が呼び出されていることを確認してください
22
+ result = cv2.matchTemplate(img, templ, cv2.TM_CCORR_NORMED)
23
+
24
+ # 最も類似度が高い位置と低い位置を取得
25
+ minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)
26
+ print(result)
27
+
28
+ if maxVal >= 0.8:
29
+ img[
30
+ maxLoc[1] : maxLoc[1] + templ.shape[0],
31
+ maxLoc[0] : maxLoc[0] + templ.shape[1],
32
+ ] = 255
33
+
34
+ return img
35
+
36
+
37
+ imshow(erase_img("a.png", "b.png"))
38
+ ```