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

ツヨシのブログ

技術的な事とか日常の事とか徒然なるままに

MacでOpenCVをPythonで使ってみる(その2)

前回はOpenCVMacにインストールしてPythonで使えるようにしました。

MacでOpenCVをPythonで使ってみる(その1) - ツヨシのブログ

今回はこのOpenCVを使用して顔の認識をしてみたいと思います。では早速OpenCVを使ったプログラムを書いてみます。

今回使用する画像ファイルはまいどおなじみのlenaです。

f:id:ginga0118:20150225145748j:plain

以下、実行するコードです。

# -*- coding: utf-8 -*-

import cv2

cascade_path = "/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"

image_path = "lena.jpg"

color = (255, 255, 255) #白

image = cv2.imread(image_path)
image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)

cascade = cv2.CascadeClassifier(cascade_path)

facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

print facerect

if len(facerect) > 0:
   for rect in facerect:
      cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)
   cv2.imwrite("./result.jpg", image)

顔検出用の分類器の設定

まずは、文字コードの指定とOpenCVのインポートを行います。

# -*- coding: utf-8 -*-

import cv2

HAAR分類器を使って顔検出用の特徴量を設定します。

cascade_path = "/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml"

顔の検出を行うファイルの設定と、顔を検出した際の枠のカラーを設定します。ここでは枠は白(255,255,255)に設定しました。 その後、ファイルを読み込みます。

image_path = "lena.jpg"
color = (255, 255, 255)
image = cv2.imread(image_path)

グレースケールに変換して、カスケード分類器の特徴量を取得します。

image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)
cascade = cv2.CascadeClassifier(cascade_path)

顔認識を実行と保存

顔認識を実行します。以下それぞれのパラメータです。

  • image : CV_8U 型の行列です。ここに格納されている画像中から物体が検出されます。
  • objects : 矩形を要素とするベクトルです。それぞれの矩形は、検出した物体を含みます。
  • scaleFactor : 各画像スケールにおける縮小量を表します。
  • minNeighbors : 物体候補となる矩形は最低でもこの数だけの近傍矩形を含む必要があります。
  • flags : このパラメータは新しいカスケードでは利用されません。古いカスケードに対しては,cvHaarDetectObjects 関数の場合と同じ意味を持ちます。
  • minSize : 物体が取り得る最小サイズ.これよりも小さい物体は無視されます。
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

print facerect

検出した顔を囲む矩形の作成と結果の保存をします。

if len(facerect) > 0:
    for rect in facerect:
        cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)
   cv2.imwrite("./result.jpg", image)

実際出来上がった画像は次のようになります。

f:id:ginga0118:20150225145758j:plain

結構簡単にできました。 使ってみて意外と処理に時間がかかると思いました。動画などでリアルタイムに処理する場合にはもっと掛かるかとおもいます。次回は動画でチャレンジしてみたいと思います。