OpenCV3とPython3で、顔検出してみた。

OpenCVを使って顔検出するPythonスクリプトを書いてみました。

1. 環境

当方の環境は次のとおり。なお、MacBook Pro 2017上に環境を構築してます。

  • Python 3.6.3
  • OpenCV 3.3.1
  • Pillow 4.3.0
  • numpy 1.13.3

環境の構築方法は、こちらに書きました。

Homebrewで (pyenv + pyenv-virtualenv + python3 + OpenCV3)の環境を構築する。

ただし、Pillowをまだ導入していなかったので、pipでインストールします。
Pillowとは、PIL(Python Image Library)のforkプロジェクトで、Python3で動作する画像処理ライブラリです。

 

2. 画像ファイルから顔を検出する

画像ファイルから顔を検出し、その顔を別の画像で覆い隠すPythonスクリプト「pic_face_mask.py」です。

 

7行目でOpenCVのHaar Cascadesの分類器を指定しています。顔正面分類用のファイルがいくつか用意されていますが、違いが良く解らなかったので「haarcascade_frontalface_default.xml」を選びました。なお、当方の環境に合わせたフルパスを指定しています。

顔が写った、JPEGやPNGフォーマットのファイルを用意し、10行目に元画像のファイル名を指定します。

12行目で顔に被せるマスク画像を指定しています。矩形の絵を貼り付けるだけでは面白くないので、アルファチャンネル付の透過PNGを貼り付けられるようにしました。
OpenCVは、顔位置を正方形の形で検出します。なので、できるだけ正方形に近いPNG画像をマスク画像に選びましょう。
私はこれを選びました。。

File:Ghostbusters logo.svg

スケキヨもあり…?

 

次のコマンドでスクリプトを実行します。

「result.png」というファイルが作成されるので見てみましょう。
麗しきYUKI様のご尊顔が隠されました。絵が小さかったり横顔だったりして検出できない顔がいくつかありますけど。また、誤検出もいくつかあります。

before

after

 

もういっちょ。正面向いてる顔が多いので、まあまあ良い感じに検出できてます。

after

「haarcascade_frontalface_default.xml」を使って顔検出を行いましたが、顔を傾けるとダメ、片目が隠れているとダメ、横を向いているとダメ…などなど、顔を検出するための条件が厳しい印象です。

 

3. カメラ映像から顔を検出する

カメラ映像から顔を検出し、その顔を隠すPythonスクリプト「cam_face_mask.py」を作りました。攻殻機動隊の笑い男っぽいやつです。

 

10行目でdevice_idに0を設定し、24行目でカメラをオープンしています。これで、MacBook ProのFaceTimeカメラを認識しました。

実行してみます。

5〜10fpsぐらいのカクカクした画像ではありますが、顔検出&マスク処理がリアルタイムで実行されました。
顔が隠れているとはいえ、自分のビデオ画像を掲載するのはこっぱずかしいので遠慮しておきます。ぜひ、お試しください。

 

4. 参考にした情報

顔を検出して顔をいろいろ細工するライブラリを公開しています。faces.pyが非常に参考になりました。というか、骨子は一緒です。

MacbookAirのカメラで顔が写ったら顔を笑い男マーク(Python3+OpenCV3+PIL)

umentu/opencv

 

透過PNG画像を合成する方法を学びました。pillowを使うことにしたきっかけでもあります。

FreeBSD 10 + Python + pillowで透過pngの合成

 

画像のリサイズなど、Pillowの使い方を参考にしました。

Python 3.5 対応画像処理ライブラリ Pillow (PIL) の使い方

 

Leave a Comment

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください