HoloLensでOpenCV その1 ことはじめ #アセットアドカレ

## はじめに
この記事は [Unity Assets Advent Calendar 2016](http://qiita.com/advent-calendar/2016/unity-asset) 8日目の記事になります。

本日はHoloLensにも対応しているOpenCVをUnityで使えるアセットをご紹介します。
OpenCVについては過去記事のこちらをご参照ください。

> Telepathy Jumperアプリを作る OpenCV for Unity #アセットアドカレ – develog.holo
 http://2vr.jp/2015/12/05/unity-assets-telepathy-jumper_opencv-for-unity/

今回はその1と題して、**OpenCV for Unity**のセットアップから、HoloLensのアプリ開発では必須な**HoloToolkit-Unity**と同時に使うのに必要な手順を説明します。

## 環境
- Unity 5.5.0f3

## OpenCV for Unity 2.0.9
[![image](https://qiita-image-store.s3.amazonaws.com/0/32347/95391d6d-26ef-1e05-9ae7-df6a0db38fab.png)](https://www.assetstore.unity3d.com/jp/#!/content/21088)

> Integration Examples | OpenCV for Unity
https://enoxsoftware.com/opencvforunity/documentation/integration-examples/

## HoloToolkit-Unityのインポート
についてはこちらの記事が最高です。
> HoloToolkit-Unityを一発でダウンロード&インポートするエディタ拡張 - 気ままにI/O
 http://kzonag.hatenablog.com/entry/2016/12/07/192228

## OpenCV for Unityのインポート
OpenCV for UnityにはUWPに対応したソースがZIPで含まれているので、ストアからインポートするときは**OpenCVForUnityUWP_Beta2.zipのみ**選択してインポート。

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/b0bf5096-49c2-5374-e6b6-713bb0c3db7a.png)

次に**OpenCVForUnityUWP_Beta2.zip**の中にある**OpenCVForUnityUWP_Beta2.unitypackage**をダブルクリックして全部インポート。
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/cb9dde40-d44e-9212-116a-483ab6809ad1.png)

### HoloToolkit-UnityとOpenCV for Unityを同時にインポートした時の問題を解消する

ここでめちゃくちゃエラーが出まくる
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/f0faf824-8e04-8916-87a6-c76e6fbf9b2c.png)

```text:検索用
Assets/OpenCVForUnity/Samples/CamShiftSample/CamShiftSample.cs(143,9): error CS1502: The best overloaded method match for `OpenCVForUnity.RotatedRect.points(OpenCVForUnity.Point[])' has some invalid arguments
Assets/OpenCVForUnity/Samples/CamShiftSample/CamShiftSample.cs(143,17): error CS1503: Argument `#1' cannot convert `Point[]' expression to type `OpenCVForUnity.Point[]'
Assets/OpenCVForUnity/Samples/CamShiftSample/CamShiftSample.cs(189,45): error CS1729: The type `Point' does not contain a constructor that takes `2' arguments
Assets/OpenCVForUnity/Samples/CamShiftSample/CamShiftSample.cs(193,79): error CS1502: The best overloaded method match for `OpenCVForUnity.Rect.contains(OpenCVForUnity.Point)' has some invalid arguments
Assets/OpenCVForUnity/Samples/CamShiftSample/CamShiftSample.cs(202,39): error CS1540: Cannot access protected member `OpenCVForUnity.MatOfPoint.MatOfPoint(System.IntPtr)' via a qualifier of type `OpenCVForUnity.MatOfPoint'. The qualifier must be of type `OpenCVForUnitySample.CamShiftSample' or derived from it
Assets/OpenCVForUnity/Samples/CamShiftSample/CamShiftSample.cs(202,39): error CS0122: `OpenCVForUnity.MatOfPoint.MatOfPoint(System.IntPtr)' is inaccessible due to its protection level
Assets/OpenCVForUnity/Samples/CamShiftSample/CamShiftSample.cs(228,15): error CS1502: The best overloaded method match for `OpenCVForUnity.Imgproc.circle(OpenCVForUnity.Mat, OpenCVForUnity.Point, int, OpenCVForUnity.Scalar, int)' has some invalid arguments
Assets/OpenCVForUnity/Samples/CamShiftSample/CamShiftSample.cs(228,39): error CS1503: Argument `#2' cannot convert `Point' expression to type `OpenCVForUnity.Point'
Assets/OpenCVForUnity/Samples/CamShiftSample/CamShiftSample.cs(234,15): error CS1502: The best overloaded method match for `OpenCVForUnity.Imgproc.line(OpenCVForUnity.Mat, OpenCVForUnity.Point, OpenCVForUnity.Point, OpenCVForUnity.Scalar, int)' has some invalid arguments
中略
Assets/OpenCVForUnity/Samples/WebCamTextureToMatSample/WebCamTextureToMatSample.cs(94,114): error CS1503: Argument `#3' cannot convert `Point' expression to type `OpenCVForUnity.Point'
```
これは**Pointクラス**が**HoloToolkit-ExamplesのGazeRulerのデモ**に含まれるコードと、**OpenCV for Unity**に含まれるコードで名前が被っているので起こるエラー。なので、**GazeRuler**をフォルダごと削除するか、namespace追加で解消しましょう。

### OpenCV for Unityのセットアップ続き

学習ファイル類が`Aseets/OpenCVForUnity/StreamingAssets`に入っているので`Aseets/StreamingAssets`に移動

次に**PlayerSettings**から**Capabilities**の**WebCam**をチェック。これでアプリからHoloLensのカメラにアクセスできるようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/cf291c3f-7146-c217-af08-422b131fb65a.png)

これで下準備は完了。
それぞれのサンプルプロジェクトを開いて実機に転送して動かしてみましょう。
※Holographic Remoting PlayerだとPCのカメラを使うことになり、HoloLens実機のカメラでは動作してくれません。