いま流行りの顔検出をしたいです。
OpenCVを使えば簡単にできるぞ。
✔️ 本記事のテーマ
OpenCVで顔検出を行う(コード付き)
✔️ 読者さんへの前置きメッセージ
本記事は「OpenCVで顔検出をする方法」について書いています。
OpenCVライブラリは画像処理に特化したライブラリです。
OpenCVライブラリを使えば、
画像中から顔を検出するプログラムを簡単に書くことが出来ます。
それでは、顔検出をプログラムで行う方法を解説していきましょう。
OpenCVとは?(顔検出)
OpenCV (Open Source Computer Vision Library) は、
画像処理に関する機能をまとめたライブラリです。
OpenCVには画像中から人の顔を検出したり、
カラー画像を白黒画像に変換するなど多くの使い道があります。
なお、OpenCVライブラリの関数一覧と使い方については
「【python】OpenCVの関数一覧と使い方」の記事で解説しています。
今では「画像処理」を用いたPythonプログラミングでは
必ずと言っていいほど使用される、メジャーなライブラリです。
インストール自体も簡単なので、趣味や個人開発にもオススメです。
なお、OpenCVのインストールについては
「【python】OpenCVのインストール方法」の記事で解説しています。
OSにもよりますが、
3ステップほどでサクッとインストールすることができます。
OpenCVで顔を検出する方法
OpenCVを使って、顔検出を行う方法について解説します。
この記事では、以下のように顔を検出します。
まず、今回のサンプルコードは以下のようになります。
import cv2
face_cascade_path = '/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml'
face_cascade = cv2.CascadeClassifier(face_cascade_path)
src = cv2.imread('/tmp/lena_square.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(src_gray)
for x, y, w, h in faces:
cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.imwrite('/tmp/lena_after.png', src)
順番に、詳しく解説していきましょう。
OpenCVライブラリのインポート
import cv2
OpenCVライブラリはPythonの標準ライブラリではありません。
プログラムの一番上でインポートすることで、
OpenCVライブラリを使えるようにしておきましょう。
なお、プログラムを実行した時にこの箇所でエラーが出る場合は、
そもそもOpenCVライブラリのインストールが上手くできていない可能性があります。
OpenCVのインストールについては、
「【python】OpenCVのインストール方法」の記事で解説しています。
エラーが出る場合は、一度、確認してみましょう。
顔検出器の定義
face_cascade_path =
'/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml'
OpenCVで顔検出を行う場合は、検出器を定義する必要があります。
検出器とは画像から顔と思われる箇所を予測するために使用するもので、
機械学習でいうモデルに相当するものです。
この検出器はMacのHomebrewでOpenCVをインストールした場合は
以下のパスに格納されています。
'/usr/local/opt/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml'
このパスに検出器がない場合やWindows OSで処理を行う場合は、
以下のOpenCVのリポジトリからダウンロードすることができるので、
任意のパスに格納してコードの中でそのパスを指定すればOKです。
https://github.com/opencv/opencv/tree/master/data/haarcascades
顔検出器の読み込み
face_cascade = cv2.CascadeClassifier(face_cascade_path)
上記で定義した検出器のパスを使って、検出器を読み込みます。
OpenCVでは、cv2.CascadeClassifier()関数に
パスを与えてやることで検出器を読み込み、顔検出が可能になります。
OpenCVで画像の読み込み + 前処理
src = cv2.imread('/tmp/lena_square.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
OpenCVで顔検出するためには、対象画像の前処理をする必要があります
具体的には、OpenCVで画像を読み込んだ後、画像をグレースケールに変換します。
cv2.imreadで画像を読み込み、cv2.cvtColorでグレースケール変換をかけます。
なお、OpenCVの画像読み込みについては「OpenCVで画像を読み込む方法」の記事で、グレースケール変換については「OpenCVでグレースケール画像を簡単に作成する」の記事で解説しています。
それぞれの処理について、詳しく知りたい方はこちらの記事も参考にして下さい。
OpenCVで顔検出をする
faces = face_cascade.detectMultiScale(src_gray)
for x, y, w, h in faces:
cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
ここまでで、
検出器の定義、画像の読み込み、前処理
が完了したので、顔検出を行います。
顔検出には、face_cascade.detectMultiScale()関数を使います。
この関数の引数には、先ほどグレースケールに変換した画像を与えます。
detectMultiScale()関数の戻り値である `faces` には
「顔と思われる箇所」のx, y座標が格納されています。
また、この「顔と思われる箇所」は複数あれば、
その個数だけリストで返すので後ろのfor文でその個数だけ回しています。
さらに、for文の中でrectangle関数で枠線を付けます。
このようにして、顔検出を行い、顔と思われる箇所に枠線を描画します。
顔検出した画像を保存する
cv2.imwrite('/tmp/lena_after.png', src)
ここまで処理してきた画像を保存します。
OpenCVで処理した画像はcv2.imwrite()関数で、簡単に保存することが出来ます。
cv2.imwrite()関数の引数には、画像を出力するパスを指定します。
この関数を通して、画像を保存することで以下のような画像が出力されます。
なお、cv2.imwrite()関数については
「OpenCVで画像を保存する方法」の記事で解説しています。
OpenCVやPythonについてもっとスキルをつけるなら
今回はOpenCVを使って顔を検出する方法について解説しました。
OpenCVは今回解説した機能以外にも多くの便利な機能があり、
マスターすれば非常に強い武器になるでしょう。
もし、OpenCVについて独学でスキルをつけるなら、以下の書籍がオススメです。
この書籍はOpenCVの基礎から応用までを
丁寧にかつ詳細に解説しています。
OpenCVのほぼ全てを網羅しているとも言えるほどの徹底ぶりなので、
関数のリファレンスとしても使用することができます。
本記事で解説した顔検出についても掲載されています。
エンジニアとしての自身の価値をチェックする(完全無料)
エンジニアとして、
自分の価値がどれくらいのものかご存知でしょうか?
エンジニアとしてIT業界に身を置いていると
今の会社でずっと働くのか、フリーランスとして独立するのか …
と様々な選択肢があります。
どの選択肢が正解なのかを見極めるためにも、選択肢を広げるためにも
自身の価値を知っておくことはとても重要です。
TechClips ME では、
職務経歴書をアップロードするだけで企業からのスカウトを受けることができます。
▼▼▼▼▼
▲▲▲▲▲
しかもTechClips MEでは想定年収を企業から提示してくれるので、
自身の価値を数字で分かりやすくたしかめることができます。
登録はもちろん完全無料なので、一度登録してみると良いかもしれません。
コメント