前提・実現したいこと
ラズパイで撮影した画像とテンプレ画像をテンプレートマッチングで比較して対象の図形を抽出しようとしています。
テンプレートマッチングは以下のサイトを参考にしています。
https://dronebiz.net/tech/opencv/matching
自分で撮影した画像を二値化して上のサイトと同じようにテンプレートマッチングで比較しようとした時にエラーが発生しました。
- テンプレ画像のサイズ(171*151)
- 上記のサイトと同じようにして成功した時の比較画像(1215*685)
- 今回撮影した画像(3280*2464)
画像サイズの関係がよくわかりません。
何か解決策がありましたら、コメントお願いします。
発生している問題・エラーメッセージ
このサイトのエラーと同じで、テンプレ画像のサイズを変更するとできたそうですが、エラーは消えませんでした。
https://www.oipapio.com/question-8578272
error: (-215) _img.size().height <= _templ.size().height && _img.size().width <= _templ.size().width
該当のソースコード
テンプレートマッチング
#!/usr/bin/env python # -*- coding: utf-8 -*- import cv2 import numpy as np import random import sys if __name__ == '__main__': # 対象画像を指定 base_image_path = './sample.png' temp_image_path = './base.png' # 画像をグレースケールで読み込み gray_base_src = cv2.imread(base_image_path, cv2.IMREAD_GRAYSCALE) gray_temp_src = cv2.imread(temp_image_path, cv2.IMREAD_GRAYSCALE) # ラベリング処理 label = cv2.connectedComponentsWithStats(gray_base_src) n = label[0] - 1 data = np.delete(label[2], 0, 0) # マッチング結果書き出し準備 color_src = cv2.cvtColor(gray_base_src, cv2.COLOR_GRAY2BGR) height, width = gray_temp_src.shape[:2] # ラベリング情報を利用して各オブジェクトごとのマッチング結果を画面に表示 for i in range(n): # 各オブジェクトの外接矩形を赤枠で表示 x0 = data[i][0] y0 = data[i][1] x1 = data[i][0] + data[i][2] y1 = data[i][1] + data[i][3] print(data[i][3]) print(data[i][2]) cv2.rectangle(color_src, (x0, y0), (x1, y1), (0, 0, 255)) # 各オブジェクトごとの類似度を求める if(i==4): x2 = x0 - 5 -25 y2 = y0 - 5 -29 x3 = x0 + width + 5 +25 y3 = y0 + height + 5 +29 crop_src = gray_base_src[y2:y3, x2:x3] cv2.imshow("",crop_src) else: x2 = x0 - 5 y2 = y0 - 5 x3 = x0 + width + 5 y3 = y0 + height + 5 crop_src = gray_base_src[y2:y3, x2:x3] #cv2.imshow("",crop_src) c_height, c_width = crop_src.shape[:2] res = cv2.matchTemplate(crop_src, gray_temp_src, cv2.TM_CCOEFF_NORMED) res_num = cv2.minMaxLoc(res)[1] cv2.putText(color_src, str(i + 1) + ") " +str(round(res_num, 3)), (x0, y1 + 15), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 255)) # 結果の表示 cv2.imshow("color_src", color_src) cv2.waitKey(0) cv2.destroyAllWindows()
二値化
import cv2 import numpy as np if __name__ == '__main__': temp_image_path = './image_1.jpg' gray_temp_src = cv2.imread(temp_image_path, cv2.IMREAD_GRAYSCALE) ret,img_thresh = cv2.threshold(gray_temp_src, 70, 255, cv2.THRESH_BINARY_INV) height,width = img_thresh.shape[:2] img_thresh = cv2.resize(img_thresh, dsize=None, fx=0.2, fy=0.2) cv2.imshow("img_thresh", img_thresh) cv2.waitKey() cv2.destroyAllWindows()
試したこと
以下のプログラムを追加
print(crop_src.shape, gray_temp_src.shape)
出力
36 (161, 187)(151,177) (149,187)(151, 177) 以下同様のエラー
補足情報(FW/ツールのバージョンなど)
openCV(3.4.4)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/10 05:06
2019/09/10 05:13
2019/09/10 05:17 編集
2019/09/10 05:26
2019/09/10 05:48 編集
2019/09/10 05:54
2019/09/10 05:57
2019/09/10 06:01
2019/09/10 06:08