背景
複数の画像の中から、ある人物が写っている画像を見つけたい!
ということで、
複数の画像に対して、ある画像が一致する箇所があるかを検出して、
判定結果をCSVにまとめてみました。
環境
MacOS Mojave ver10.14.4
Anaconda Navigator 1.9.7
※Anacondaのインストールは、こちらを参考に
JupiterNotebook 5.4.0
OpenCV 3.4.2
※OpenCVのインストールは以前の記事を参照ください
手順
方針
・検索対象の画像をフォルダから読み込む
・画像の一致検索をかけ、判定結果を配列に格納
・配列をCSVに保存
実装
まずは、各種ライブラリをインポート
cv2:OpenCVを使用するため
glob:フォルダ内のファイルを取得するため
os:ファイルぱすからファイル名を取得するため
csv:csvに保存するため
import cv2
import glob
import os
import csv
判定結果を返す関数を設定する(1:一致あり、0:一致なし)
def Push_Stamp(num):
if 0.99 < num:
return 1
else:
return 0
フォルダの中のファイルを取得する
今回は以下の3つのファイルが検索対象としました
files =glob.glob("./ImagesFolder/temp/*") #検索画像保管フォルダパスを指定
imreadで検出したい画像を読み込み
template = cv2.imread('./imagesFolder/temp_template/ipou.jpeg')
判定結果を格納する空配列を用意する
wrcsv = []
画像の一致判定を行って、判定結果をCSVに書き込む(繰り返し処理)
for fname in files:
# 検索対象画像の読み込み
image = cv2.imread(fname)
# 画像マッチング処理
result = cv2.matchTemplate(image, template, cv2.TM_CCORR_NORMED)
# 最も類似度が高い位置を取得する。
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)
# 類似度から、判定結果を求める(上で設定した式を使用)
Judg = Push_Stamp(maxVal)
# ファイルパスから、ファイル名と拡張子を取得
filename, ext = os.path.splitext( os.path.basename(fname) )
# CSVに書き込み
wrcsv.append([filename,Judg])
判定結果の配列をCSVに保存
with open('./imagesFolder/Output/c01.csv', "w") as f: # 文字コードをShift_JISに指定
writer2 = csv.writer(f, lineterminator="\n") # writerオブジェクトの作成 改行記号で行を区切る
writer2.writerows(wrcsv) # csvファイルに書き込み
実行結果
終わりに
これで、一致しているかどうかをCSVでまとめて見ることができるようになりました!
参考
「初心者がpython Anaconda GUIで、簡単にOpenCVをインストールしてみる」
https://qiita.com/anzanshi/items/a88df7db49f77f65fbbf
「Python OpenCVで画像の一部が一致しているか、判定結果を返してみた」
https://qiita.com/anzanshi/items/82fc4c7a3a1f84137aef