UnityでOpenCVを利用した顔検出・画像処理アプリ事始め


# はじめに

UnityでOpenCVを利用したアプリが簡単に作れるようになるAssetプラグイン「**OpenCV for Unity**」がAssetStoreで販売されています。

**[OpenCV for Unity](https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088) (https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088)**

- **[オフィシャルサイト](https://enoxsoftware.com/opencvforunity/)**
- **[Android Demo](https://play.google.com/store/apps/details?id=com.enoxsoftware.opencvforunitysample)**
- **[WebGL Demo](https://enoxsoftware.github.io/OpenCVForUnity/webgl_example/index.html)** (ブラウザ上で動作確認できるのでオススメ)
- **[チュートリアルビデオ](https://www.youtube.com/watch?v=yVl4HF2I4yc)**
- **[OpenCV for Unity APIリファレンス](https://enoxsoftware.github.io/OpenCVForUnity/3.0.0/doc/html/)**

公式では無いがインストール手順を詳細に紹介しているサイト

- **[Telepathy Jumperアプリを作る OpenCV for Unity #アセットアドカレ](http://2vr.jp/2015/12/05/unity-assets-telepathy-jumper_opencv-for-unity/2/)**

初学者に目を通しておいてほしい使い方講座記事

- **[OpenCV for Unityの使い方講座１　エラーハンドリング編](https://qiita.com/utibenkei/items/83c172f91c9c2b2be19d)**
- **[OpenCV for Unityの使い方講座２　Texture2DとMatの相互変換編](https://qiita.com/utibenkei/items/d1050253fc586f17f0ec)**

***

**Windows、Mac、Android、IOS、Linux、Windows10 UWP、WebGL**という数多くのプラットフォーム対応しています。
自分で一からネイティブプラグインを作成する手間を考えたら$95は十分お得だと思います。

このAssetを使用した「[MarkerBased AR](https://assetstore.unity.com/packages/templates/tutorials/markerbased-ar-example-29678)」や「[Face Tracker](https://assetstore.unity.com/packages/templates/tutorials/facetracker-example-35284)」「[RealTime FaceRecognition](https://assetstore.unity.com/packages/templates/tutorials/realtime-facerecognition-example-73233)」のサンプルプロジェクトもAssetStoreで無料配布されています。（動作確認には「OpenCV for Unity」が必要。これらのサンプルは「[Mastering OpenCV With Practical Computer Vision Projects](http://www.amazon.co.jp/Mastering-OpenCV-Practical-Computer-Projects/dp/1849517827)」という本のに載っているいるサンプルコードを移植したもののようです）
たまたま参考に読んでいた「[OpenCV for Secret Agents](https://www.packtpub.com/application-development/opencv-secret-agents)」という電子書籍でも一章にわたってサンプルアプリの作成手順が掲載されていました。

Unity5ならproライセンスを持っていなくてもエディタ上でも実行できるのでOpenCVを使った顔検出や画像加工アプリなどのアイデアを手軽に試すことが出来るので楽しいです。
(バージョン2.0.9からWebGLプラットフォームに対応したことにより、ブラウザ上で実行できるWebアプリを作成することが出来るようになりました！実行速度も実用的なレベルでした)



**この記事ではAssetのインポートからサンプルの実行までの流れを解説したいと思います。**
> ######※AssetにはReadMe.pdf(英語)が同梱されています。合わせて読んでください。（以下は基本的にはこのマニュアル内容を翻訳したものとなります）




# OpenCV for Unityのインポート

UnityのAssetStoreから「**[OpenCV for Unity](https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088)**」をダウンロードし、プロジェクトにインポートします。（※[「OpenCV for Unity」Assetのインポートサイズを削減する方法]
(http://qiita.com/utibenkei/items/eee141cd2f1656b19cc2)を参考に必要なプラットフォームのプラグインファイルのみインポートすることを推奨）

Assetsのインポートが完了すると、Unity Editorのメニューバーに[Tools/OpenCV for Unity/Set Plugin Import Settings]が追加されます。




# OpenCV for Unityのセットアップとサンプル実行

### セットアップ

1. メニューの[Tools/OpenCV for Unity/Set Plugin Import Settings]を選択する
![QiitaOpenCV124_setup.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/98fd5799-f91d-5805-c995-527535144fc4.jpeg)
2.  “OpenCVForUnity/StreamingAssets/”フォルダを“Assets/”フォルダ直下に移動する
![QiitaOpenCV300bata2.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/c77155c0-9c05-f457-fc17-9ab19809745c.jpeg)


### サンプル実行

1. [PlayerSettings]-[Resolution  and  Presentation]-[Orientation]-[Default Orientation : Portrait]に設定を変更する。
2. [Build  Settings] を開き、全てのシーン“***.unity” を[Scene In Build]に追加してビルド。サンプルを実行。

> ######※通常ならば上記のセットアップ作業を行えば、サンプルを動かすことができるはずです。
もし、なにかしらのエラーが出た場合でもReadMe.pdfを見れば、たいていの問題は解決出来るんじゃないかと思います。
よくあるケースとしては、Assetのインポート時や何かの弾みでopencvforunity.bundleやopencv2.frameworkファイルのインポート設定がリセットされてしまうことがあるようです。その場合はメニューの[Tools/OpenCV for Unity/Set Plugin Import Settings]を選択することで壊れた設定を修復することが出来ます。



![QiitaOpenCV_sample01.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/c3fba78d-f9d4-de5c-7328-de92f22c708e.jpeg)

![QiitaOpenCV_sample02.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/e109eb43-1f0f-ba27-7d29-7715c6702d3d.jpeg)

![QiitaOpenCV_sample03.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/a7fa76a3-d3bb-d790-f2e7-c9ad1d44c79e.jpeg)





# あなたのOpenCVアプリを作成する

ReadMeによると、このAssetはOpenCV Javaのクローンとして作成されているとあるので、Javaのラッパーで対応しているAPIは基本的に対応している[^1]と考えて良いようです。
これまでのOpenCV Java向けの技術情報等もそのまま活用出来ると思います。


>### [参考資料]OpenCVでできることの一部([ICVS2013資料](http://opencv.org/wp-content/uploads/2013/icvs/ICVS2013%20-%20OpenCV%203.0.pdf)から引用)
![02_s.gif](https://qiita-image-store.s3.amazonaws.com/0/28558/5d149ae1-4af1-3482-c6cb-b2753e9ce97f.gif)

> 画像処理 (Image Processing)

> - 勾配，エッジ，コーナー (Gradients, Edges and Corners)
> - サンプリング，補間，幾何変換 (Sampling, Interpolation and Geometrical Transforms)
> - モルフォロジー演算 (Morphological Operations)
> - フィルタと色変換 (Filters and Color Conversion)
> - ピラミッドとその応用 (Pyramids and the Applications)
> - 画像分割、領域結合、輪郭検出 (Image Segmentation, Connected Components and Contour Retrieval)
> - 画像と形状のモーメント (Image and Contour Moments)
> - 特殊な画像変換 (Special Image Transforms)
> - ヒストグラム (Histograms)
> - マッチング (Matching)

> 構造解析 (Structural Analysis)

> - 輪郭処理 (Contour Processing)
> - 計算幾何 (Computational Geometry)
> - 平面再分割 (Planar Subdivisions)

> モーション解析と物体追跡 (Motion Analysis and Object Tracking)

> - 背景統計量の累積 (Accumulation of Background Statistics)
> - モーションテンプレート (Motion Templates)
> - 物体追跡 (Object Tracking)
> - オプティカルフロー (Optical Flow)
> - 推定器 (Estimators)

> パターン認識 (Pattern Recognition)

> - 物体検出 (Object Detection)
> - カメラキャリブレーションと3次元再構成 (Camera Calibration and 3D Reconstruction)
> - カメラキャリブレーション (Camera Calibration)
> - 姿勢推定 (Pose Estimation)
> - エピポーラ幾何 (Epipolar Geometry)

> 機械学習

> - 単純ベイズ分類器 (Naive Bayes Classifier)
> - k近傍法 (K Nearest Neighbors)
> - サポートベクターマシン (SVM)
> - 決定木 (Decision Trees)
> - ブースティング (Boosting)
> - Random forest (Random forest)
> - EMアルゴリズム (Expectation-Maximization)
> - ニューラルネットワーク (Neural Networks)

> ユーザインタフェース

> - シンプルGUI (Simple GUI)
> - 画像の読み込みと保存 (Loading and Saving Images)
> - ビデオ入出力 (Video I/O)
> 
...and more

> [OpenCV.jp : OpenCV逆引きリファレンス](http://opencv.jp/cookbook/)
> [画像処理速報](http://python-gazo.blog.jp/opencv)



[^1]: 公式のOpenCV JavaラッパーがOpenCVの全てのAPIをラップしているわけではないようなので、使用したい機能が対応しているかどうかは確認が必要です。

# 関連記事
UnityでOpenCVを利用した顔検出・画像処理アプリ事始め
[UnityでOpenCVを利用した顔検出・画像処理アプリ事始め2 サンプルコード詳解](http://qiita.com/utibenkei/items/290e83d2c50cdadbcb2d)
[OpenCV for Unityの使い方講座１　エラーハンドリング編](https://qiita.com/utibenkei/items/83c172f91c9c2b2be19d)
[OpenCV for Unityの使い方講座２　Texture2DとMatの相互変換編](https://qiita.com/utibenkei/items/d1050253fc586f17f0ec)
[「OpenCV for Unity」Assetのインポートサイズを削減する方法](http://qiita.com/utibenkei/items/eee141cd2f1656b19cc2)
[UnityでOpneCVを利用した動画再生をしてみた](http://qiita.com/utibenkei/items/aaaa6cf5b470aa4f69d5)
[UnityでOpneCVを利用したハコスコVR体験](http://qiita.com/utibenkei/items/a9c4e96a395666f9bf54)