>   >  Unityでつくるインタラクティブコンテンツ:第2回:OpenCVで顔検出
第2回:OpenCVで顔検出

第2回:OpenCVで顔検出

こんにちは、Codelight株式会社の高田です。最近デザイナーの梅原 真さんの「おいしいデ」を読みました。とてもおいしいのに知名度がなく、なかなか売れない地方の商品(主に高知県の食料品)にデザインを加えることで商品に力が加わり売れ行きが良くなる、生産者に自信が付き好循環が生まれる。梅原さんが手がけた「おいしいデ」ザインを紹介しています。ここでいうデザインとはパッケージの図案を考えるだけではなくコピー、商品名、ストーリーづくりの全てです。綺麗な見た目だけではなく、本質を見極めることが大切だと改めて感じた本でした。

TEXT_高田稔則 / Toshinori Takata(Codelight
EDIT_小村仁美 / Hitomi Komura(CGWORLD)

<1>OpenCVとは?

さて、前回の予告通り、OpenCVを使って顔検出を使ったコンテンツのサンプルをつくっていきたいと思います。今回使うのは下記のアセットです(有料)。Webカメラも接続しておいてください。内蔵カメラでも問題ありません。

●OpenCV for Unity
https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088

FaceTracker Example using OpenCV for Unity

OpenCV(Open Source Computer Vision Library)はコンピュータで画像処理を行うときに使われるデファクトスタンダードのオープンソースライブラリです。1999年にプロジェクトが開始され、20年近い歴史があります。Linux、Android、iOS、Windows、MacOSなど様々な環境で動かすことができます。

OpenCVは巨大で複雑なライブラリです。Unityで利用できるといってもC#で使うことができるだけなので、ライブラリの利用方法自体は学習が必要ですし、コンピュータビジョンに対する知識も必要になります。日本語のサイトとしてはOpenCV.jpがあるようですが、現在更新がほぼ止まっているようです。

OpenCVで何ができるのかをつかむためには公式サイトのドキュメントを参照するのもひとつの手ですが、いきなりこれを見てもわからないと思います。ライブラリの実際の使用例やコードのサンプルなどはQiitaのOpenCVコミュニティなどの記事を見る方がわかりやすいでしょう。

また、OpenCVに関してはたくさんの書籍が出ていますので、できれば「詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識」(オライリー・ジャパン)や、画像処理に関しては最近出版された「コンピュータビジョン―広がる要素技術と応用―」(共立出版)などに目を通すことをオススメします。書籍を見てみるとかなり難しいと感じる人も多いかもしれません。しかしどのような理論の上に成り立っているものなのかを押さえておくことで、表現の幅が広がると思います。

<2>OpenCV for Unityを使ってみる

ではOpenCV for Unityを利用してみましょう。今回使用するUnityのバージョンは2018.2.5.f1です。まずは、以下のように新しいプロジェクトを2Dテンプレートで作成してください。

2018年8月27日現在、OpenCV for UnityはOpenCV 3.4.1がベースとなっています。OpenCV本体は3.4.2が最新なので、かなり早く追従してくれていると言えます。ここで、OpenCV for Unityを提供しているENOX SOFTWAREが提供している他のアセットも見てみましょう。

上段右から2番目の「CV VTuber Example」が気になりませんか? これはC++で書かれた機械学習などの問題を解くためのDlibというライブラリを使ってフェイストラッキングを行い、VTuber風にユニティちゃんを動かすサンプルです。

CVVTuberExample using OpenCV for Unity and Dlib FaceLandmark Detector

このサンプルのベースとなるのが先ほどの一覧画像の上段左から2番目の「Dlib Face Landmark Detector」アセットです。Dlibのサイトではこちらなどで解説があります。しかし、「Dlib Face Landmark Detector」は有料アセットなので、今回こちらは触れずにOpenCVの基本アセットでできることを進めていきます。興味のある人は調べてみてください。

ではOpenCV for Unityのライセンスをおもちの方はアセットストアからダウンロードしてインポートを行なってください。Assetsの下にOpenCVForUnityフォルダが作成されます。Examplesフォルダの下にサンプルシーンがありますので、「OpenCVForUnity Example」を実行してみてください。いくつかのサンプル名が表示されますが、何を選択しても何も起こらないと思います。

これはUnityのシーン管理の問題です。[Build Settings]メニューにビルドするシーンを登録する必要があります。

Examplesフォルダ内にさらにBasic、Advancedなどのフォルダがあり、その中にそれぞれサンプルシーンが入っています。このシーンを[Build Settings]の[Scene In Build]に追加してください。ドラッグ&ドロップで追加できます。試したいシーンを登録するとビルドに含まれてサンプルが実行できるようになります。個別にサンプルシーンを開いて実行しても結果は同じですが、手軽に切り替えられるので登録して見比べてみてください。

<3>顔検出のサンプルシーンを実行する

では改めて「OpenCVForUnity Example」を起ち上げ、Object detectカテゴリの「Face Detection WebCamTexture Example」を実行してみてください。おそらくカメラが起動するだけで何も起こらないと思います。Consoleを見ると以下のエラーが出ているはずです。

cascade file is not loaded.Please copy from "OpenCVForUnity/StreamingAssets/" to "Assets/StreamingAssets/" folder. 
UnityEngine.Debug:LogError(Object)
OpenCVForUnityExample.FaceDetectionWebCamTextureExample:Start() (at Assets/OpenCVForUnity/Examples/MainModules/objdetect/FaceDetectionExample/FaceDetectionWebCamTextureExample.cs:87)

エラー文の指示の通りにOpenCVForUnityフォルダ以下のStreamingAssetsフォルダをAssetsフォルダ直下に移動させ、再度「Face Detection WebCamTexture Example」を実行します。



  • OpenCVForUnityフォルダ以下のStreamingAssetsフォルダ(左)をAssetsフォルダ直下に移動(右)

カメラが起動し、顔の部分に赤枠が現れたら、顔検出を利用したコンテンツの準備は完了です。

次ページ:
<4>顔検出のしくみを探る

その他の連載