【OpenCV】画像の顔部分を検出する方法【Python】
OpenCV を使って、Python で画像から顔部分の検出を行ったときのメモです。
Anaconda で OpenCV をインストールしてあります。
カスケード分類器
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】Windows で ライブラリ(NumPy) をインストールする方法。
Windows の Python(2.X系)で NumPy をインストールしようと思ったら、そもそも
-
-
【Python】 Series 型を dict(辞書型)に変換する方法。
Python で Series 型を dict(辞書型)に簡単に変換する方法を紹介します。 「
-
-
【Pandas】 DetaFrame の列ごとに演算する方法【Python】
今回は、DetaFrame の列ごとに平均や加算・減算なのど演算をし、結果を DetaFrame 型
-
-
【Atomエディタ】Python 開発用にインストールしてみた。
Python でプログラミングするときの エディタ を探していたのですが、とりあえず Atom とい
-
-
python 2.7 を Windows 64bit OS にインストールした。
python 2.7 を Windows にインストールしたときのメモです。 Python に
-
-
【Python】API を使って YouTube から動画情報を収集する方法。
API を使って YouTube から動画情報を収集してみたときのメモです。 OS は Lin
-
-
【Atom エディタ】Python で Matplotlib のグラフを Atom 上に表示させる方法。
Atom エディタで Python の Matplotlib ライブラリを使って、Atom 上にグラ
-
-
【matplotlib】 Python でヒストグラムの横軸と棒(ビン)の数を調整する方法。
Python の matplotlib を使ってヒストグラムを描画し、横軸の目盛りと棒(ビン)がそろ
-
-
【Google Colaboratory】クラウド上でPythonを使って機械学習を行う。
Python をブラウザ上で実行して、手軽に機械学習ができる環境「Google Colaborato
-
-
【Pandas】 loc・ilocで1行のみ Series ではなく DataFrame で抽出する方法。
Python の Pandas で DataFrame から loc や iloc を使って行を抽出