【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)」をいれるようにしましょう。
参考書籍
関連記事
-
-
【Anaconda】Prompt 上で Git コマンドを実行する方法。
Anaconda のコマンドプロンプト(Anaconda Prompt)上で、Git Hub からダ
-
-
【Google Colaboratory】クラウド上でPythonを使って機械学習を行う。
Python をブラウザ上で実行して、手軽に機械学習ができる環境「Google Colaborato
-
-
【Python】漢字を分解するライブラリを使ってみた【部首分解】
Python で漢字を部首やさらに細かい部分に分解してくれるライブラリがあったので使ってみました。
-
-
【OpenCV】検出した顔画像部分を切り出す方法【Python】
OpenCV を使って、Python で画像の中から顔部分を切り出したときのメモです。 顔部分
-
-
【Python】 Series 型を dict(辞書型)に変換する方法。
Python で Series 型を dict(辞書型)に簡単に変換する方法を紹介します。 「
-
-
【Spyder】引数のあるスクリプトを実行する方法。
Python の統合開発環境(IDE)である Spyder では、簡単にスクリプトを実行できます。
-
-
【Python】API を使って Amazon の商品情報を収集する方法。
AmazonAPI ライブラリをインストール 以下のコマンドで python-amazon-sim
-
-
【Python】 DataFrame の特定の列で出現回数をカウントして降順でソートする方法。
Python で DataFrame 型の特定の列を指定して、対象列の文字列の出現回数をカウントして
-
-
【Python】 複数の辞書型の同じ key を持つ value を計算に用いる方法。
Python で、複数の辞書型を読み込んで、同じキー(key)を持つ数値(value)を計算に使う方
-
-
【matplotlib】 Python でヒストグラムの横軸と棒(ビン)の数を調整する方法。
Python の matplotlib を使ってヒストグラムを描画し、横軸の目盛りと棒(ビン)がそろ