【OpenCV】画像の顔検出【Python】
こんにちは!こーたろーです。
OpenCVの基礎トレーニング第2回です。
第2回は、画像における顔の検出を行っていきます。
顔認識は結構身近になったと思いますが、私としては全然やっていなかったので、これを機にプロフェッショナルになってみたいです。
CPUでは限界がありますが、できるところまでやってみます!
ライブラリのインポート
画像取得及び操作・表示のためのライブラリをインポートします。
画像操作用のOpenCVと、描画用にmatplotlibとurllibを定義しておきます。
import cv2 import matplotlib.pyplot as plt import urllib.request as req
画像データの取得
以前やったように、画像をWebから取得します。
取得する画像は、フリーのものを選びました。
url = "https://jp.static.photo-ac.com/assets/img/ai_page/ai_model_512_01.png" req.urlretrieve(url, "face_test.png") img = cv2.imread("face_test.png") img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
今回もこちらの画像を使用します。
カスケードファイルの定義と検出器の作成・顔の検出
画像における顔の部分を検出するためには、カスケードファイルなるものが必要だそうです。
github.com
こちらのサイトの、「haarcascade_frontalcatface.xml」ファイルをダウンロード、又はコピーしてファイルを作成しましょう。
カスケードファイルを用いて顔の検出器を作成するのですが、このカスケードファイルは、画像の明暗に対して、「目・鼻・口」といったパーツに関するフィルタのようなものが含まれており、画像をグレースケールにしたうえでこのフィルターを使ってパーツを検出し、顔全体を検出するという仕組みです。
cascade_file = "haarcascade_frontalface_alt.xml" cascade = cv2.CascadeClassifier(cascade_file) face_list = cascade.detectMultiScale(img_gray, minSize = (150, 150))
カスケードファイルを定義して、「cv2.CascadeClassifier」関数にて検出器を作成します。
その後、検出器にグレースケールに変換した画像と最小サイズを定義します。
このCascadeClassifierメソッドの引数は、次のようなものがあります。
⁻image : CV_8U型の行列。ここに格納されていいる画像中から物体が検出されます。
- objects : 矩形を要素とするベクトル。それぞれの矩形には、検出した物体を含みます。
- scaleFactor : 画像スケールにおける縮小量を表します。
- minNeighbors : 物体候補となる矩形は、最低でもこの数だけの近傍矩形を含む必要があります。
- flags : このパラメータは、新しいカスケードでは使用されません。古いカスケードに対しては、cvHaarDetectObjects関数の場合と同じ意味を持ちます。
- minSize : 物体が取り得る最小サイズ。これよりも小さい物体は無視されます。
- maxSize : 物体が取り得る最大サイズ。
検出結果の表示
検出後のface_listには、次のような値が入っています。
face_list
元画像に対して、検出した枠を描画してみます。
face_listと書いていますが、実際はarray[0]にtupleが入っているため、for分で座標を書きます。
for x, y, w, h in face_list: print("顔の座標 =", x, y, w, h) cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), thickness = 5) plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show()
確かに顔が検出されていることが分かります。
なんか少しやってやった感が残ります。
ではでは。
OpenCVによる画像処理入門 改訂第2版 (KS情報科学専門書)