背景
ある画像の中から、複数の顔を検出したい!!
ということで、
フォルダに格納した複数の顔を読み込み、
元画像から検出して、強調表示させてみました。
環境
MacOS Mojave ver10.14.4
Anaconda Navigator 1.9.7
※Anacondaのインストールは、こちらを参考に
JupiterNotebook 5.4.0
OpenCV 3.4.2
※OpenCVのインストールは以前の記事を参照ください
手順
方針
・検索したい画像をフォルダから読み込む
・検索対象画像に対して、検索をかけ一致した部分を四角で囲んで表示させる
実装
まずは、各種ライブラリをインポート
cv2:OpenCVを使用するため
glob:フォルダ内のファイルを取得するため
numpy:一致率の計算を実行するため
matopolib:グラフを表示させるため
import cv2 #OpenCVをインポート
import glob
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline #JupiterNotebookに表示するため
フォルダの中のファイルを取得する
files =glob.glob("./ImagesFolder/temp_template/*") #検索画像保管フォルダパスを指定
今回のフォルダの中身を確認する。
(今回は以下の母娘2人の画像ファイルを入れています)
temp_saki.png
temp_saki2.png
imreadを使って、検索対象の画像を読み込む
image = cv2.imread('./ImagesFolder/temp/temp_moto.png')
検索したい画像分だけ、検索をかけて一致した場合に、
cv2.rectangleで四角に囲む(繰り返し処理)
for fname in files:
#検索したい画像を読み込む
template = cv2.imread(fname)
#検索対象画像内で画像が一致するかを検索
result = cv2.matchTemplate(image, template, cv2.TM_CCORR_NORMED)
# 一致部分を□で囲む
th, tw = template.shape[:2]
threshold = 0.99
loc = np.where(result >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(image, pt, (pt[0] + tw, pt[1] + th), (255,0,255), 2)
Matpolibのimshow画像を表示させる
OpenCVで取得した画像はBGRデータ配列、Matplotlibで呼び出す場合のはRGBデータ配列なので、変換する必要があることに注意!
image2 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) #データ配列の変換
plt.imshow(image2)
実行結果
おまけ
画像を保存するには、以下を実行
cv2.imwrite('./imagesFolder/temp/result_temp.png', image)
参考
「初心者がpython Anaconda GUIで、簡単にOpenCVをインストールしてみる」
https://qiita.com/anzanshi/items/a88df7db49f77f65fbbf
「Python OpenCVで画像の一部が一致しているか、判定結果を返してみた」
https://qiita.com/anzanshi/items/82fc4c7a3a1f84137aef