OpenCV、matplotlib、numpyでほとんどの画像処理ができます。 OpenCVは、インテルが開発・公開したオープンソースライブラリで現在はITseezが保守しています。 matplotlibは、Python及びその科学計算用ライブラリNumPyのためのグラフ描画ライブラリです。 conda install -c conda-forge opencv
、conda install numpy
、でインストールできます。 matplotlibは、anacondaでpythonをインストールすると自動的にインストールされるようです。
# 顔・目検出
import numpy as np
import cv2
import matplotlib.pyplot as plt
OpenCVには顔・目・鼻・口・上半身などの検出器が用意されていますが、自分でカスケード分類器を作り、好きな物体を検出することができる。 ここでは、顔と眼のhaarカスケード分類器を用います。
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # Stump-based 24x24 discrete(?) adaboost frontal face detector.
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
PLAYBOY社も公共の利用のための画像使用を許可したレナさんの画像をテスト画像として用いました。
事前にインターネットからダウンロードしてください。もしくは、お好きな画像で試してください。
img = cv2.imread('lenna.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5) # face detect
for (x, y, w, h) in faces:
# img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 3) # point1, point2, blue, thickness 3
img = cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3) # point1, point2, red, thickness 3
#ROI Region of Interest 対象領域
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray) # eye detect
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2) # green
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()