opencvの勉強、第2回です。
今回はオブジェクト検出(顔検出)をしたいと思います。
ちなみに、第1回はこちらです。
カスケード型分類器の準備
今回は予め用意されたカスケード型分類器を使って、顔検出をしてみたいと思います。
####Anacondaをインストールされた方
Anaconda3フォルダの中の\Lib\site-packages\cv2\dataフォルダに分類器が入っています。
####Anacondaをインストールされていない方
学習済みの分類器をOpenCVの公式サイトからダウンロードします。
- 上部にある「Releases」から自身のOpenCV Versionの「Win Pack」をダウンロード
- ダウンロードしたファイルを解凍
- \opencv\sources\data\haarcascadesの中に分類器が入っています。
今回はhaarcascade_frontalface_default.xml(正面からの顔を検出する分類器)を使ってみることにします。
分類器haarcascade_frontalface_default.xmlとサンプル画像(前回使ったhisyo.jpg)は、pythonファイルは同じディレクトリに保存します。
#顔検出の実行
とりあえず、下のコードを使って、顔検出をしてみましょう。
import cv2
# 入力画像の読み込み
img = cv2.imread("hisyo.jpg")
# カスケード型識別器の読み込み
cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# グレースケール変換(グレースケールを使用すると、高速に顔検出できるらしい)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 顔領域の探索
face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
# 顔領域を赤色の矩形で囲む
for (x, y, w, h) in face:
cv2.rectangle(img, (x, y), (x + w, y+h), (0,0,200), 3)
# 結果画像を保存
cv2.imwrite("result.jpg",img)
#結果画像を表示
cv2.imshow('image', img)
cv2.waitKey(0)
顔検出の結果
他の画像でも試してみましょう。
ばっちり顔検出できました(マスクまで顔検出されました)
一部検出できないものや誤検出がありますが、概ね正しく検出できているようです。
#参考文献
こちらのサンプルソースを参考にさせていただきました。顔検出の原理もわかりやすく書かれています。