【OpenCV】画像の顔部分を検出する方法【Python】
OpenCV を使って、Python で画像から顔部分の検出を行ったときのメモです。
Anaconda で OpenCV をインストールしてあります。
Contents
カスケード分類器
OpenCV では、カスケード分類器というものが用意されています。
カスケード分類器は、複数の識別器を組み合わせた分類器のことです。
その中でも、Haar-like特徴を使った識別器が OpenCV では使われています。
Haar-like特徴とは、画像の明暗差により特徴をとらえたものになります。
OpenCV をインストールすると、以下の場所に、17種類のカスケード分類器が格納されます。
私の環境では「C:\Users\XXXX\anaconda3\Lib\site-packages\cv2\data」の中に、以下のような「xml」ファイルがありました。
※格納されるフォルダは環境によって若干異なるかと思われます。
画像データの準備
画像データは、有名な「Lenna」を使います。
以下の URL から、tif 画像「lena_std.tif」をダウンロードします。
顔部分の検出
顔部分の検出は、カスケード分類器の中の「haarcascade_frontalface_default.xml」ファイルを使います。
四角の枠は、cv2.rectangle()メソッドで描画することができます。
以下のようなコードで、顔部分を矩形で囲んだ jpg 画像を保存し、さらに、別ウィンドウで表示させることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import cv2 # カスケード分類器の読み込み face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # イメージファイルの読み込み img = cv2.imread('lena_std.tif') # 顔を検知 face = face_cascade.detectMultiScale(img) # [[217 201 173 173]] print(face) # 顔部分を矩形で囲む for(x, y, w, h) in face: cv2.rectangle( img, pt1=(x, y), # 矩形の1つの頂点 pt2=(x+w, y+h), # 矩形の反対側の頂点 color=(0, 255, 0), thickness=2) # 枠の太さ # 検出処理後の画像を保存 cv2.imwrite('Face_detection.jpg', img) # 検出処理後の画像を別ウィンドウで表示 cv2.imshow('face01', img) # これがないと「応答なし」になってしまう cv2.waitKey(0) cv2.destroyAllWindows() |
「face_cascade.detectMultiScale(img)」部分では、以下のような [x値, y値, 幅, 高さ]のリストが返ってきます。
1 |
[[217 201 173 173]] |
「!empty() in function」エラーの対処方法
1つ目の注意点としては、「haarcascade_frontalface_default.xml」ファイルをソースコードと同じディレクトリにコピーしていれました。
ファイルパスが間違っていると、以下のような「!empty() in function」エラーがでてしまいます。
error: OpenCV(4.5.4-dev) D:\a\opencv-python\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassifier::detectMultiScale’
「imshow」で「応答なし」の対処方法
2つ目の注意点は、「cv2.imshow(‘face01’, img)」だけで終わってしまうと、別ウィンドウが「応答なし」となり、フリーズしてしまいます。
そのため、必ず「waitKey(0)」をいれるようにしましょう。
参考書籍
関連記事
-
【Python】 複数の辞書型の同じ key を持つ value を計算に用いる方法。
Python で、複数の辞書型を読み込んで、同じキー(key)を持つ数値(value)を計算に使う方
-
【Pandas】 DataFrame の行を抽出する方法【Python】
今回は、Python の Pandas で、DataFrame 型の行を抽出する方法を紹介します。
-
【Python】時系列データ(為替データ)をグラフ表示してみた。
今回は、pandas・matplotlib ライブラリを使って、時系列データ(為替データ)をグラフ表
-
【Pandas】 DataFrame のインデックスを置き換える方法【Python】
今回は、Pandas の DataFrame型で、インデックス(index)を分かりやすいものに置き
-
【Python】機械学習のために SciPy・Matplotlib・scikit-learn をインストール。
Python で機械学習を行うために、Windows OS の python 2 系にライブラリ「S
-
【Python】OpenCV を使って顔画像を検出してみた。
OpenCV のインストール Numpy のインストール [crayon-6730e9e92
-
【Atom エディタ】Python で Matplotlib のグラフを Atom 上に表示させる方法。
Atom エディタで Python の Matplotlib ライブラリを使って、Atom 上にグラ
-
【Python】Windows で ライブラリ(NumPy) をインストールする方法。
Windows の Python(2.X系)で NumPy をインストールしようと思ったら、そもそも
-
【Python】Beautiful Soup を使ってスクレイピングする方法。
Beautiful Soup は、シンプルでわかりやすい API でデータを抜き出せる Python
-
【Python】Requests ライブラリを使って Web ページを取得してみた。
python の標準ライブラリ urllib を使っても Web ページの取得はできるのですが、Re