UnityのOpenCVはどれ使おう？

# きっかけ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">UnityのOpenCVアセット、複数あって何がどう違うのかよくわからない...<br>お値段が違うのはわかる。</p>&mdash; foka (@foka22ok) <a href="https://twitter.com/foka22ok/status/1205054231582932992?ref_src=twsrc%5Etfw">December 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

UnityでOpenCVが使いたかったのですが、アセットストアを探すとそれっぽいものが複数見つかって混乱してしまいました。
その後調べた結果、違いが少しわかったので、自分以外にも混乱してしまった人の参考になればと書いてみます。

# 3つのOpenCVアセット
OpenCVでアセットストアを検索すると以下の3つがみつかります。

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

`OpenCV plus Unity`　free
https://assetstore.unity.com/packages/tools/integration/opencv-plus-unity-85928

`OpenCV# for Unity`　$16
https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-100374


### OpenCV for Unity
Enox Softwareが作っている$95のアセットです。
（2019/12/13現在、半額の$47.5でセール中）

これの特徴は、Java用OpenCVのクローンであること。
後に説明するOpenCVSharpとは関係がありません。

namespaceが`OpenCVForUnity`になっており、APIはJava用OpenCVと同じです。
C++・PythonのOpenCVのAPIとは記述が結構異なる印象です。

```c#:OpenCVForUnityのusing記述
using OpenCVForUnity;
```

2019年12月現在、OpenCV 4.1.0にも対応して継続的にメンテナンスされてます。

### OpenCV plus Unity
Paper Plane Toolsが作っているfreeのアセットです。
以前は$50くらいだったようですが、2019年1月24日より無料化しました。

これの特徴は、OpenCVSharpをUnityで使えるようにしたものであること。
そのためAPIはOpenCVSharpと同じです。

namespaceはOpenCVSharpと同様に`OpenCVSharp`になっており、APIももちろんOpenCVSharpと同じです。
C++・PythonのOpenCVのAPIと比較的記述が近い印象です。

```c#:OpenCVplusUnityのusing記述
using OpenCVSharp;
```

ただし、アセットをインポートして使おうとすると以下のエラーが出まくります。

```
error CS0227: Unsafe code may only appear if compiling with /unsafe. Enable "Allow 'unsafe' code" in Player Settings to fix this error.
```
このエラーを消すには、`Player Settings > Other Settings > Configuration` にある `Allow 'unsafe' Code` にチェックをつける必要があります。

対応OpenCVのバージョンは、アセットストアの説明文を見るとOpenCV 3のようです。
無料化した理由も少し書いてあり、`サポートはしない、コンピュータビジョンの世界を学びたい人のために無料でアセットを残しておくから楽しんでくれ`的なことが書かれてます。

今後の更新はあまり期待できないかもしれません。

### OpenCV# for Unity
NWH Codingが作っている$16のアセットです。
特徴は、native C++のOpenCVプラグインをC#でラップしていること。

このアセットは使える環境が無いので詳しいことは把握してませんが、アセットストアの説明文に`Includes optimized functions conversion between common Unity and OpenCV structures` とあるので、オリジナルAPIなのかもしれません。
↓がドキュメントのようなのですが、空っぽで詳細不明でした。
http://nwhcoding.com/index.php/products/opencv-for-unity/
（変なURL...）

# OpenCVSharp
OpenCVは色々な環境に移植されているので、C#専用のOpenCVSharpというものがあります。

`OpenCVCharp`
https://github.com/shimat/opencvsharp

自分で色々調べていた時、アセットわからんと思って迷ってしまったので、いっそのことアセット使わずこれをそのまま使うのが一番シンプルなのではと思って試しました。

が。
UnityにNuGetプラグインを入れてパッケージをインストールするという [Unity であらゆる C#(.NET) パッケージを使う（例：opencv）](https://qiita.com/kingyo222/items/11100e8f7be396b98453) もあったので試してみましたが、自分の環境ではうまく動かず...
該当記事とはUnityのバージョン、OpenCVのバージョンどちらも違ったので、そのせいかもしれません。

なお、OpenCVCharpの公式ドキュメントには以下の一文が。
`OpenCvSharp may not work on Unity platform. Please consider using OpenCV for Unity`

#結局、どれ使うのがいいの？

### C++、PythonのOpenCVに近い書き方で書きたい人
＞OpenCV plus Unity
＞OpenCVSharp（環境構築がうまくいけば...）

### OpenCVSharpに慣れている人
＞OpenCV plus Unity

### JavaのOpenCVに慣れている人
＞OpenCV for Unity

### 今後のサポートまで考慮する人
＞OpenCV for Unity
＞OpenCVSharp（環境構築がうまくいけば...）

### お金を使わずUnityでOpenCV試してみたい人
＞OpenCV plus Unity


#まとめ
環境構築がうまくいくなら、アセット使わず`OpenCVSharp`をそのまま使うのがベターだと思いました。

OpenCVSharp公式は、Unityでは`OpenCV for Unity`を使うことを推奨してますが、個人的にはAPIに独自感があってちょっと使いにくい印象...（個人の感想です）
でも今後も考えるとアセットでは`OpenCV for Unity`一択な感じもあり...。

難しいですね。