目的
- ファミマのレシートを探したい
- OpenCVの理解
- なんか画像処理っぽいことしたい
OpenCVにTemplate Matching機能があると聞き、どんなもんだろうと思いお試ししてみました
環境
- Windows11 Home
- VSCode
- Python3.9
- pip
opencv-python 4.5.5.62
numpy 1.22.1
本編
参考文献
ありがとうございます。お世話になりました
プログラム
元の画像
いろいろなレシートを混ぜて取りました。
大きさの違うロゴを左上に貼り付けて、これも探せるといいな。
テンプレート画像
これを探したい。
TemplateMatching
## 1.file load
img = cv2.imread(DATA_DIR + filename)
famima_template = cv2.imread('famima.jpg')
height, width = famima_template.shape[:2]
# 画像の検索(Template Matching)
result = cv2.matchTemplate(img, famima_template, cv2.TM_CCORR_NORMED)
scoreによる足切り
# 閾値による足きり
threshold = 0.93
loc = np.where( result >= threshold)
dst=img.copy()
for pt in zip(*loc[::-1]):
cv2.rectangle(dst, pt, (pt[0] + width, pt[1] + height), (0,0,255), 10)
save_image(filename+"2", dst)
まあまあうまくいったのですが、大きさが違うと探せないのかな?
一番scoreが高いもの
# 検索結果の信頼度と位置座標の取得
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# 検索結果の左上頂点の座標を取得
top_left = max_loc
# 検索結果の右下頂点の座標を取得
bottom_right = (top_left[0] + width, top_left[1] + height)
# 検索対象画像内に、検索結果を長方形で描画
cv2.rectangle(img, top_left, bottom_right, (255, 255, 0), 10)
ここのロゴを切り抜いたので正解です。
まとめ
- まったく同じものを探し出すことはできる
- 大きさが違ったりすると探せない。