マルチプラットフォーム対応のOpenCV画像処理アプリをUnityで効率的に作る方法

OpenCV Advent Calendar 2016、12月9日の記事です。

#はじめに#
####

画像処理アプリのアイデアをサクッと形にしたい！

**この記事はマルチプラットフォーム対応のOpenCVアプリを作りたい人向けにUnityを使用をする利点を紹介するために書きました。**

#Unityならマルチプラットフォームアプリが効率的に開発可能#

**一つのプロジェクトから複数プラットフォーム向けのアプリが出力できる**

今更説明は不要かもしれませんが、Unityとは統合開発環境を内蔵し、複数プラットフォームに対応したゲームエンジンです。
コードはC#やjavascriptで記述でき、以下ような機能を利用したアプリケーションを効率的に作成可能です。

- 2D/3Dグラフィック
- サウンド
- UI
- データ管理
- WebCamera入力

プラットフォーム間の開発環境の差を気にすることなく、一つのプロジェクトを作成するだけで、デスクトップ/モバイル/VR/ゲームコンソール/Web/SmartTVなどの環境対応のアプリをいっぺんに出力可能。
基本的には無料で利用可能なので今すぐ始められます。

##現時点でOpenCVをUnityで利用する方法##
現時点でOpenCVをUnityで利用する方法を私が調べた範囲でまとめてみました。

###「OpenCV for Unity」###

**[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://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088))**

|                              |   |
|-----------------------------:|:-:|
| **対応バージョン** | OpenCV 4.1.0 |
| **対応プラットフォーム** | Windows, Mac, Android, iOS, Linux, Windows10 UWP, **WebGL** |
| **価格** | $95(消費税込み) |
| **セットアップ難易度** | AssetStoreからImportする。 セットアップの詳細は[UnityでOpenCVを利用した顔検出・画像処理アプリ事始め](http://qiita.com/utibenkei/items/fb93623a7ccaabb342f2)を参照。 |
| **API** | OpenCVのJavaラッパーと同じAPIが使用できるので、既存のOpenCVのJavaのコードを参考にできる。[API Reference](https://enoxsoftware.github.io/OpenCVForUnity/3.0.0/doc/html/index.html) |
| **備考** | Unity向けに開発されているので、UnityのTexture2DとOpenCVのMatとの変換などの便利メソッドも用意されている。他のサイトではUnity Editor上では動作しないという情報があったが、現在は問題無く対応している。WebGLプラットフォームに対応している。さらにUnity Cloud Buildでの動作も確認されている|


###「Emgu CV v4.x」###

**[Emgu CV v4.x](https://assetstore.unity.com/packages/tools/ai/emgu-cv-v4-x-144853) ([https://assetstore.unity.com/packages/tools/ai/emgu-cv-v4-x-144853](https://assetstore.unity.com/packages/tools/ai/emgu-cv-v4-x-144853))**

|                              |   |
|-----------------------------:|:-:|
| **対応バージョン** | OpenCV 4.1.0 |
| **対応プラットフォーム** | Windows, Mac, Android, iOS, Windows10 UWP |
| **価格** | $399(消費税込み) |
| **セットアップ難易度** | AssetStoreからImportする。 |
| **API** | [Documentation](http://www.emgu.com/wiki/index.php/Documentation) |
| **備考** | **OpenCLやTesseract OCRにも対応している。**|


###「ネイティブプラグインを自作する」###

|                              |   |
|-----------------------------:|:-:|
| **備考** | プラットフォームごとに自分でネイティブプラグインを自作する。C++で開発できる。使用したい機能だけビルドすればいいのでアプリサイズが小さくなる。プラグイン作成方法を学習する時間がかかる。|



**私の場合は、iOS、Android、WebGLやWindows UWP(Hololens)に対応していること、OpenCV Javaの既存コードを参考にできること、お財布事情、から「OpenCV for Unity」を選択しました。自分でネイティブプラグインを作成することも考えましたが、ただでさえビルドが大変なOpenCVを各プラットフォームでビルドするのは多くの時間と手間がかかりそうなので、サクッとお金で解決することにしました。**


##実際にOpenCV for Unityで作ったもの##
同梱されている多くのサンプルコードを参考にしつつ、詰まった時はOpenCV Javaのコードを検索したりしてOpenCV初心者でもこのようなアプリを作ることが出来ました。製作時のTipsは下記にまとめてあります。

- [UnityでOpenCVを利用した顔検出・画像処理アプリ事始め](http://qiita.com/utibenkei/items/fb93623a7ccaabb342f2)
- [UnityでOpenCVを利用した顔検出・画像処理アプリ事始め2 サンプルコード詳解](http://qiita.com/utibenkei/items/290e83d2c50cdadbcb2d)
- [「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)
- [「コワすぎ」るカメラアプリ１～歪む顔編～【Unity × OpenCV × Dlib】](http://qiita.com/utibenkei/items/9bfe8f273a0cdbbc492b)
- [「コワすぎ」るカメラアプリ２～地獄だぞ編～【Unity × OpenCV × Dlib】](http://qiita.com/utibenkei/items/a282d277e234ee4c2b29)
- [FaceRig無しでも中の人(二次元)になりたい！【Unity × OpenCV × Dlib × Live2D】](http://qiita.com/utibenkei/items/15925db826721f6bb00c)

##Unity Cloud Buildによる一括自動ビルド##

アプリ製作中はデバッグの為に各プラットフォーム向けにビルドする必要が何度もあると思いますが、そのときに便利なUnityのサービスがUnity Cloud Buildです。OpenCVとは直接関係ありませんが、Unityで開発する場合は必須だと思うので紹介します。

###Unity Cloud Buildとは###

クラウド上でUnityプロジェクトをビルドしてくれるサービスです。
Windows/Mac/Linux/Android/iOS/WebGLに対応！
GitHub等のレポジトリを指定するだけでマルチプラットフォーム出力が可能になります。

![cloud_build.png](https://qiita-image-store.s3.amazonaws.com/0/28558/32669855-a213-8494-5ca8-5662f703e507.png)


[超便利！ Unity Cloud Build の使い方](http://www.slideshare.net/MakotoIto2/unity-cloud-build-63711473)

以下のような開発サイクルをとることで効率的なアプリ開発が可能になります。

1. プロジェクトを更新
2. レポジトリにpush
3. クラウド上で自動ビルド開始
4. ビルド完了をメールで通知
5. (複数の)プラットフォームでテスト
6. 1に戻る

このサービスを利用するとマルチプラットフォーム対応アプリ開発やデバッグ作業も苦にならなくなります。

##Unityで画像処理アプリを作成する利点##
たとえばウェブカメラの入力画像から人物の顔検出を行い、検出された人物の頭部にネコミミを重ねて描画するデジタルインスタレーション作品をWindowsプラットフォーム向けに作成したとします。
そのアプリを同僚に向けて発表した際に「スマートフォンアプリにした方が面白い」とアドバイスされた場合、あなたはその期待にすぐに応えること出来るでしょうか？
Unityを使わないでアプリを制作していた場合、あなたはAndroidアプリを作成するためにJavaを、iOSアプリを作成するためにObjective-CやSwiftの学習から始めなければなりません。
さらに上司に「プロモーションのためにWebアプリとしてウェブサイト上で公開したい」などと言われた場合にはJavascriptの学習も必要になります。
一方、Unityを使ってアプリを制作していた場合なら、あなたはUnityエディタのビルド設定を変更するだけで目的を達成することができるのです。


#まとめ#
マルチプラットフォーム対応のOpenCVアプリを作成するならUnityがオススメです。


明日は[hon_no_mushi](http://qiita.com/hon_no_mushi)さんの「freetype対応したまとめを(Harfbuzzも足したい！）」です。