Python OpenCV3で画像の顔判定(ネタあり)

2015年7月28日

画像から顔を判定して四角で囲うという、もはや出尽くされてたネタ。
下準備ということで。

[amazonjs asin="4061538225″ locale="JP" title="OpenCVによる画像処理入門 (KS情報科学専門書)"]

前提

ディレクトリ構成などはこことかこことか。

 

準備

前提にも書いていたが、一応準備を明記しておく。
当ブログのインストール手順では、「/Users/umentu/Downloads/opencv-3.0.0/」配下にhaarcascadesディレクトリがあるため、これをsourceディレクトリにコピーしておく。
もしない場合は、私のgithubからダウンロードして設置する。

 

元画像

なんとなく徳川慶喜(yoshinobu.jpg)を使った。
wikipediaから拝借して、source/imageディレクトリにyoshinobu.jpgファイルを設置しておく。

yoshinobu.jpg

 

顔判定

実際に顔判定してみる。
顔判定には準備の項目で用意したxmlファイルを利用する。

sourceディレクトリにface.pyを作成する。

[python title="face.pyの内容"]
# -*- coding: UTF-8 -*-

import cv2
import math
import numpy as np
import os

if __name__ == '__main__’:

# 顔判定で使うxmlファイルを指定する。
cascade_path = os.path.dirname(os.path.abspath(__file__)) + "/haarcascades/haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_path)

# 画像の読み込み
img_src = cv2.imread("./image/yoshinobu.jpg", 1)

# 結果を保存するための変数を用意しておく。
img_result = img_src

# グレースケールに変換
img_gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)

#顔判定
"""
minSize で顔判定する際の最小の四角の大きさを指定できる。
(小さい値を指定し過ぎると顔っぽい小さなシミのような部分も判定されてしまう。)
"""
faces = cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))

# 顔があった場合
if len(faces) > 0:

#顔認識の枠の色
color = (255, 0, 0)

# 複数の顔があった場合、1つずつ四角で囲っていく
for face in faces:

# faceには(四角の左上のx座標, 四角の左上のy座標, 四角の横の長さ, 四角の縦の長さ) が格納されている。

# 囲う四角の左上の座標
coordinates = tuple(face[0:2])
# (囲う四角の横の長さ, 囲う四角の縦の長さ)
length = tuple(face[0:2] + face[2:4])

# 四角で囲う処理
cv2.rectangle(img_result, coordinates, length, color, thickness=3)

# 表示
cv2.imshow("Show FACES Image", img_result)
cv2.waitKey(0)
cv2.destroyAllWindows()

[/python]

実行してみる。

[shell]
(opencv_python)$ python face.py
[/shell]

スクリーンショット 2015-07-11 0.57.57

 

顔判定できた!

 

複数人でも

偉大なる物理学者の方々も顔判定してみる。
source/image ディレクトリにphysicists.jpgを設置する。

今回はひとりひとりの顔が小さいため、face.pyの

[python]
faces = cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))
[/python]

のminSizeを(10, 10)にして判定してみる。
そのため、face2.pyを作成する。

[python title="face2.pyの内容"]
# -*- coding: UTF-8 -*-

import cv2
import math
import numpy as np
import os

if __name__ == '__main__’:

# 顔判定で使うxmlファイルを指定する。
cascade_path = os.path.dirname(os.path.abspath(__file__)) + "/haarcascades/haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_path)

# 画像の読み込み
img_src = cv2.imread("./image/physicists.jpg", 1)

# 結果を保存するための変数を用意しておく。
img_result = img_src

# グレースケールに変換
img_gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)

#顔判定
"""
minSize で顔判定する際の最小の四角の大きさを指定できる。
(小さい値を指定し過ぎると顔っぽい小さなシミのような部分も判定されてしまう。)
"""
faces = cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1, minSize=(10, 10))

# 顔があった場合
if len(faces) > 0:

#顔認識の枠の色
color = (255, 0, 0)

# 複数の顔があった場合、1つずつ四角で囲っていく
for face in faces:

# faceには(四角の左上のx座標, 四角の左上のy座標, 四角の横の長さ, 四角の縦の長さ) が格納されている。

# 囲う四角の左上の座標
coordinates = tuple(face[0:2])
# (囲う四角の横の長さ, 囲う四角の縦の長さ)
length = tuple(face[0:2] + face[2:4])

# 四角で囲う処理
cv2.rectangle(img_result, coordinates, length, color, thickness=3)

# 表示
cv2.imshow("Show FACES Image", img_result)
cv2.waitKey(0)
cv2.destroyAllWindows()

[/python]

実行してみる。

[shell]
(opencv_python)$ python face2.py
[/shell]

スクリーンショット 2015-07-11 0.57.03

 

皆さん、顔判定できた!・・・ん?左上に・・・・・

スクリーンショット 2015-07-11 1.26.44

 

・・・

スクリーンショット 2015-07-11 0.57.18

 

お分かりいただけただろうか。
我々は見てはいけない物理学の一面をみてしまったのかもしれない。