OpenCV 顔検出

顔検出はコンピュータビジョンにおける古典的な問題の 1 つであり、OpenCV は Haar 特徴分類器に基づく顔検出方法を提供しています。簡単で使いやすく、効果も顕著です。

この記事では、OpenCV のcv2.CascadeClassifier()を使用した顔検出について詳しく説明します。

Haar 特徴分類器の概要

Haar 特徴分類器は、Haar-like 特徴に基づく機械学習手法であり、2001 年に Paul Viola と Michael Jones によって提案されました。画像から Haar-like 特徴を抽出し、AdaBoost アルゴリズムを使用してトレーニングし、最終的に画像内のターゲット(顔など)を検出するための分類器を生成します。

Haar-like 特徴は単純な矩形特徴であり、画像内の異なる領域のピクセル値の差分を計算することで特徴を抽出します。例えば、Haar-like 特徴は、2 つの隣接する矩形のピクセル値の合計の差です。これらの特徴は、画像内のエッジやラインなどの構造情報を捉えることができます。

OpenCV の Haar 特徴分類器

OpenCV は事前トレーニングされた Haar 特徴分類器を提供しており、顔検出に直接使用できます。これらの分類器は XML ファイル形式で保存され、トレーニング済みのモデルパラメータが含まれています。

OpenCV のcv2.CascadeClassifier()クラスは、これらの分類器を読み込んで使用するためのものです。

顔検出の実装手順

  1. Haar 特徴分類器モデルの読み込み:を使用してcv2.CascadeClassifier()事前トレーニングされた顔検出モデルを読み込みます。

  2. 画像の読み込み:を使用してcv2.imread()検出対象の画像を読み込みます。

  3. グレースケール画像への変換:画像をグレースケール画像に変換します。Haar 特徴分類器はグレースケール画像上でより速く動作するためです。

  4. 顔の検出:を使用したdetectMultiScale()メソッドで画像内の顔を検出します。

  5. 検出結果の描画:画像内に検出された顔の矩形枠を描画します。

  6. 結果の表示:検出結果を表示します。

Haar 特徴分類器の読み込み

Haar 特徴分類器を使用する前に、まず事前トレーニングされた分類器モデルを読み込む必要があります。OpenCV は複数の事前トレーニングされた分類器を提供しています。例えば、顔検出用のhaarcascade_frontalface_default.xml。

例

import cv2

# Haar 特徴分類器の読み込み
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

画像の読み込み

顔検出を行う前に、検出対象の画像を読み込む必要があります。OpenCV はcv2.imread()関数で画像を読み取ります。

例

# 画像の読み込み
image = cv2.imread('image.jpg')

グレースケール画像への変換

Haar 特徴分類器は通常、グレースケール画像上で検出を行うため、カラー画像をグレースケール画像に変換する必要があります。

例

# グレースケール画像への変換
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

顔検出の実行

を使用したcv2.CascadeClassifier.detectMultiScale()メソッドで顔検出を行います。このメソッドは、検出された顔領域の矩形枠(x, y, w, h)を返します。(x, y) は矩形枠の左上隅の座標で、w と h はそれぞれ矩形枠の幅と高さです。

例

# 顔検出の実行
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
  • scaleFactor: 毎回の画像サイズの縮小比率を表し、画像ピラミッドの構築に使用されます。デフォルト値は 1.1 です。
  • minNeighbors: 各候補矩形枠に保持する近傍の数を表します。デフォルト値は 5 です。
  • minSize: 検出ターゲットの最小サイズを表します。デフォルト値は (30, 30) です。

検出結果の描画

顔を検出した後は、cv2.rectangle()メソッドを用いて画像上に矩形枠を描画し、顔の位置をマークします。

例

# 検出結果の描画
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)

結果の表示

最後に、cv2.imshow()メソッドで検出結果を表示します。

例

# 結果の表示
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

完全なコード例

以下は、完全な OpenCV 顔検出コードの例です:

例

import cv2

# Haar 特徴分類器の読み込み
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 画像の読み込み
image = cv2.imread('image.jpg')

# グレースケール画像への変換
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 顔検出の実行
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 検出結果の描画
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)

# 結果の表示
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
その他の拡張