Help us understand the problem. What is going on with this article?

OpenCV Haar-Cascadeによる顔検出

この記事の目的

なんか顔認証のシステム作りたいなーと思い、OpenCVの基礎的な勉強から始めてます。

OpenCVでは、顔・目などを検出できるカスケード識別器の学習済みファイルを事前に用意されています。
学習済みファイルは下記リンク先からダウンロードできます。

今回は顔検出のために「haarcascade_frontalface_default.xml」を使ってみます。

https://github.com/opencv/opencv/tree/master/data/haarcascades

以下も用意されてるのでまとめてgit cloneしましょう。

カスケード型の識別器のファイル

ファイル名 対象物体
haarcascade_eye.xml
haarcascade_eye_tree_eyeglasses.xml メガネ
haarcascade_frontalcatface.xml 猫の顔(正面)
haarcascade_frontalcatface_extended.xml 猫の顔(正面)
haarcascade_frontalface_alt.xml 顔(正面)
haarcascade_frontalface_alt2.xml 顔(正面)
haarcascade_frontalface_alt_tree.xml 顔(正面)
haarcascade_frontalface_default.xml 顔(正面)
haarcascade_fullbody.xml 全身
haarcascade_lefteye_2spits.xml 左目
haarcascade_licence_plate_rus_16stages.xml ロシアのナンバープレート(全体)
haarcascade_lowerbody.xml 下半身
haarcascade_profileface.xml 顔(証明写真)
haarcascade_righteye_2splits.xml 右目
haarcascade_russian_plate_number.xml 笑顔
haarcascade_upperbody.xml 上半身

OpenCV概要

  • OpenCVはIntel社で1999年に Gary Bradskyによって開発が開始され、2000年に最初リリースされた
  • 画像処理・画像解析および機械学習等の機能を持つC/C++, Java, Python, MATLAB用ライブラリ
  • プラットフォームとしてmacOSやFreeBSD等すべてのPOSIXに準拠したUnix系OS、Linux、Windows、Android、iOSをサポート
  • 歴史
    • 1999年にプロジェクト開始。最初のアルファ版が公開されたのは、国際会議CVPR2000年である
    • 2001年から2005年の間に5つのベータ版がリリースされた
    • 1.0版がリリースされたのは2006年
    • 2008年にWillow Garageによるサポートを受け、開発情況が再び活発になった
    • 2009年10月に2回目のメジャーバージョンアップが実施され、2.0版がリリースされた
    • OpenCV 2.4.4以降ではJavaが公式にサポートされている
    • 2015年6月に3回目のメジャーバージョンアップデートとしてOpenCV 3.0が正式リリースされた
    • OpenCV 3.0では従来のC言語関数形式のインターフェースはレガシーAPI扱いとなり、メンテナンスが終了している
    • 代わりにC++ APIを使うことが推奨されている
    • 2018年11月にOpenCV 4.0がリリースされた

主な機能

# 項目 機能
1 画像処理 勾配、エッジ、コーナー(Gradients, Egdes and Corners)
2 画像処理 サンプリング、補間、幾何変換(Sampling, Interpolation and Geometrical Transforms)
3 画像処理 モルフォロジー演算(morphological Operations)
4 画像処理 フィルタと色変換(Filters and Color Conversion)
5 画像処理 ピラミッドとその応用(Pyramids and the Applications)
6 画像処理 画像分割、領域結合、輪郭検出(Image Segmentation, Connected Componets and Contour Retrieval)
7 画像処理 画像と形状のモーメント(Image and Transforms)
8 画像処理 特殊な画像変換(Special Image Transforms)
9 画像処理 ヒストグラム(Histograms)
10 画像処理 マッチング(Matching)
11 画像処理 ラベリング(Labeling)※OpenCV 3.0以降
12 構造解析 輪郭処理(Contour Processing)
13 構造解析 計算幾何(Comutational Geometry)
14 構造解析 平面再分割(Planar Subdivisions)
15 モーション解析と物体追跡 背景統計量の累積(Accumulation of Backgorund Statistics)
16 モーション解析と物体追跡 モーションテンプレート(Motion Templates)
17 モーション解析と物体追跡 物体追跡(Object Tracking)
18 モーション解析と物体追跡 オプティカルフロー(Optical Flow)
19 モーション解析と物体追跡 推定器(Estimators)
20 パターン認識 物体検出(Object Detection)
21 カメラキャリブレーションと3次元再構成 カメラキャリブレーション(Camera Calibration)
22 メラキャリブレーションと3次元再構成 姿勢推定(Pose Estimation)
23 メラキャリブレーションと3次元再構成 エピポーラ幾何(Epipolar Geometry)
24 機械学習 単純ベイズ分類器(Native Bayes Classifier)
25 機械学習 k近傍法(K Nearest Neighbors)
26 機械学習 サポートベクターマシン(SVM)
27 機械学習 決定木(Decision Trees)
28 機械学習 ブースティング(Boosting)
29 機械学習 ランダムフォレスト(Random Forest)
30 機械学習 EMアルゴリズム(Expectation-Maximization)
31 機械学習 ニューラルネットワーク(Neural Networks)
32 ユーザインターフェース シンプルGUI(Simple GUI)
33 ユーザインターフェース 画像の読み込みと保存(Loading and Saving Images)
34 ユーザインターフェース ビデオ入出力(Video I/O)
35 ユーザインターフェース OpenGL/Direct3Dの相互運用

やってみたこと

皆ほぼ同じにしか見えない就活生の顔をdetectしてやりたいと思います🙃

もとの画像

image.png

結果

image.png

おお、なんか惜しいな...🤔
後ろの方はもはや認識されていないように思える。

探索窓が小さすぎるとダメなねすかね。
前の方は顔半分見切れてるし...🤫

image.png

コード

python3
# -*- coding: utf-8 -*-
import cv2

def main():
    # 入力画像の読み込み
    img = cv2.imread("test.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,300), 4)

    # 結果を出力
    cv2.imwrite("result.jpg",img)


if __name__ == '__main__':
    main()

参考にさせていただいたサイト

幅広く詳解されています。
https://algorithm.joho.info/programming/python/opencv-haar-cascade-face-detection-py/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away