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.∗ 」が 表示されていることを確認してください.

カメラ映像の表示

Capture クラスを利用して,カメラから入力した画像を表示しましょう. 下記を参考にコードを入力したら,Runボタンをクリックしてください. ここでは, サイズ(size)320x240フレームレート(fps)30 となっている, 3番のカメラを使用していることに注意してください. ウィンドウにカメラ映像が表示されることを確認してください.

https://gyazo.com/f0bda3ee7c555e685b5092ada1b994ce

顔位置の検出

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

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

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

https://gyazo.com/f2407a0560c1643e5042b428f4986c8d

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

red.png

blue.png

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

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

https://gyazo.com/4a568d286717b4d8a0465410fe0dfffc

課題

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

https://gyazo.com/6a2e1f542cf1d3568e55fbb63e0ccb0b

参考書籍

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.