読者です 読者をやめる 読者になる 読者になる

OpenCVで画像部分一致を検索したい人生だった

やりたいこと

駅メモのスクショからガチャでバッテリー等のアイテムが出たスクショを検知する

どうかんがえてもsyaru_botへの実装です本当にありがとうございました

実装

  • 予めバッテリー/フットバース/ねこぱんちの画像を用意
  • 与えられた画像にあるしきい値以上一致していればtrueを返す

問題は以下

  • スクショはTwitterから持ってくることを前提としているため多少画像が圧縮されても検知できるか
  • 端末によって解像度が異なる その場合でも検知できるか

さあやろう

まずは適当に画像を用意(lena_orgi.bmp)

f:id:thr3a:20150727135325j:plain

部分的に繰り抜いた画像も用意する(未加工)

f:id:thr3a:20150727135328j:plain

適当に保存すると色深度が異なってエラー吐かれるのでこちら側で変換して合わせておく

convert -depth 24 lena_orgi.bmp lena_orgi.bmp 
convert -depth 24 lena_part.bmp lena_part.bmp 
import sys
import cv2
import numpy

image = cv2.imread("lena_orgi_result.bmp")
template = cv2.imread("lena_part_result.bmp")

th, tw = template.shape[:2]

result = cv2.matchTemplate(image, template, cv2.TM_CCORR_NORMED)
threshold = 0.99
loc = numpy.where(result >= threshold)
for pt in zip(*loc[::-1]):
    cv2.rectangle(image, pt, (pt[0] + tw, pt[1] + th), 0, 2)
cv2.imwrite("reuslt.bmp", image)