OpenCVを利用した顔検出(動画ファイル版)

https://gyazo.com/d3973e5c6b33e5bc08bf95c7b6bf90d1

スケッチの作成

Processingを起動して,新規にスケッチを保存しましょう. メニューから[ファイル]-[名前を付けて保存]をクリックして,「スケッチフォルダを名前を付けて保存」を開きます. ファイル名に「Project11」を入力し,[保存]をクリックしましょう. 保存先に「Project11」という名前のフォルダが作成されていることを確認してください.

https://gyazo.com/f3f48f8fe0d13e78f308daff5a773ee4

OpenCVの導入

インテルが開発したオープンソースのライブラリであるOpenCVを導入することで, 画像処理・画像解析など様々な機能を利用することが可能となります. ここでは,Processing用のOpenCVを導入して,顔検出を試みてみましょう. まずは,メニューから[スケッチ]-[ライブラリをインポート]-[ライブラリを追加]をクリックして, 「Contribution Manager」を開きます. ここで,opencvをキーワードに検索すると, 「OpenCV for Processing | Computer vision with OpenCV.」が表示されるので, このライブラリを選択してインストールしましょう.

https://gyazo.com/538852267edc0956cf1d754107f52b7b

次に,[スケッチ]-[ライブラリをインポート]-[OpenCV for Processing]をクリックして,OpenCVライブラリをインポートします. また,同様にVideoライブラリをインポートしてください. ソースコードの先頭に「import gab.opencv.∗;」と「import processing.video.∗;」が 表示されていることを確認してください.

動画ファイルの表示

今回はPixabayの動画ファイルを利用します. このサイトで配布されている素材は,商用・非商用において,コピー・改変・再配布が認められています. 下記の男性が平手打ちされている動画をダウンロードしましょう.

「Slap in The Face」のダウンロード

ダウンロードした動画ファイル(face.mp4)を,スケッチフォルダにコピーします. このとき,スケッチフォルダに新しく data という名前でフォルダを作成し,そのなかに動画ファイルを配置する必要があるので注意してください.

\Project11\data\face.mp4

Processingでの動画ファイルの再生は前回と同じ Movie クラスを利用します. 下記を参考にコードを入力したら,Runボタンをクリックしてください. 動画ファイルが再生されることを確認してください.

Image from Gyazo

顔位置の検出

顔位置の検出にはOpenCVクラスを利用して下記のように記述します. 例えば,OpenCV.CASCADE_FRONTALFACEは顔を検出することを意味します. この他にOpenCV.CASCADE_PEDESTRIANSは歩行者,OpenCV.CASCADE_EYEは目を検出することが可能です (詳細はOpenCVのドキュメントを参照してください). 検出された顔位置はRectangleクラスとして返されます. Rectangleクラスは矩形を表しており,フィールドとしてx, y, width, heightを持ちます. xyで左上の座標,widthheigthで幅と高さを表します.

opencv = new OpenCV(this, movie);
opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);
faces = opencv.detect();

それでは,検出された顔位置にrect()関数で矩形を描いてみましょう. 下記を参考にコードを入力したら,Runボタンをクリックしてください. ここでは,矩形の輪郭線を赤色,また,塗りつぶしを描画しないように設定しています. 検出された顔位置に赤い矩形が表示されることを確認してください.

Image from Gyazo

次は,検出された顔位置に画像を表示してみましょう. 下記の2種類の画像(red.pngblue.png)の内から一つを選び, 画像をダウンロードしてください(画像提供:GAHAG|著作権フリー写真・イラスト素材集). いずれの画像もサイズは250x220ピクセルです. また,ダウンロードした画像は「スケッチフォルダ(Project11)」の中に配置しましょう. これ以降,本資料ではred.pngを例に取り説明していきます.

red.png

blue.png

まずは,PImageクラスのインスタンスを作成し,ダウンロードした画像を読み込みます. 後は,draw()関数の中で,これまでのrect()関数に代えて,image()関数を呼び出すだけです. image()関数の引数は,PImage型の変数に加えて,表示する位置x,y,幅width,高さheightを指定します.`

下記を参考にコードを入力したら,Runボタンをクリックしてください. 検出された顔位置に画像が表示されていることを確認してください.

Image from Gyazo

課題

下記の女性の動画ファイルをダウンロードして, OpenCV.CASCADE_EYEを指定して目の位置を検出し,目の位置に円を描きましょう. 課題が完成したら,作成したスケッチをZIPアーカイブ形式で保存します. ZIPアーカイブを作成するには,メニューから[ツール]-[スケッチをアーカイブ]をクリックして,「スケッチを名前を付けてアーカイブする」を開きます. 保存するファイル名を確認した上で,[保存]をクリックします. 保存先に「Project11-日付a.zip」というファイルが作成されていることを確認してください.

「Girl Shouting」のダウンロード

Image from Gyazo

参考書籍