【Python】OpenCV で曖昧検索をしてみる

Uncategorized
426 words

OpenCV とは、画像・動画に関する機能を提供するライブラリです。

特定の画像内に、検索したい画像と似た部分を持つ箇所があるかを調べたい。

言葉で書くと難しいですが、見てもらえれば何となく伝わると思います。

OpenCV をインストール

Windows PowerShell でインストールできます。

1
pip install opencv-python

結果から

検索元となる画像

この画像内から日本国旗を探したいので、日本国旗のみの画像を検索したい画像として読み込ませます。

結果はこんな感じになります。

見つかった部分に赤枠が付きます。

処理

OpenCV のインポート

1
import cv2

画像の読み込み

1
2
3
4
5
6
# 検索元画像の読み込み
img = cv2.imread('dribbble.png')
H, W, C = img.shape
# 検索する画像の読み込み
template = cv2.imread('dribbble_jp.png')
h, w, c = template.shape

テンプレートマッチング

1
2
3
result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
# 最も類似度が高い位置を取得する。
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)

見つかった箇所に枠を付ける

1
2
3
4
5
6
def draw_window(img, x, y, w, h):
tl = x, y # 左上の頂点座標
br = x + w, y + h # 右下の頂点座標
cv2.rectangle(img, tl, br, (255, 0, 255), 3)
drawn = img.copy()
draw_window(drawn, maxLoc[0], maxLoc[1], w, h)

画面に表示

1
2
3
cv2.imshow('image', drawn)
cv2.waitKey(0)
cv2.destroyAllWindows()

おわりに

とりあえず、やりたいことのやり方が分かったから、次から応用をやって行こうと思います。

今回の内容を GitHub に上げておきます。

https://github.com/noitaro/python-opencv

興味があればどうぞ。

参考

http://pynote.hatenablog.com/entry/opencv-template-matching

https://qiita.com/anzanshi/items/82fc4c7a3a1f84137aef