#概要
UnityでHoloLens(UWP:Universal Windows Platform)向けにアプリ開発をしていて、OpenCVの導入にごにょごにょと苦戦したあげく、ネイティブプラグインと『Holographic Remoting Player』で解決した。
#はじめに
外部カメラ映像をリアルタイムで画像処理しHoloLensに投影するという、需要のない特異な仕様のアプリ開発に取り組んだ。
画像処理といえばOpenCV、でもUnityでC#でコーディングしている、どう組み込もうかと考えた。
本来であれば『OpenCV for Unity』のような便利なプラグインを導入するところであるが、有料というのがネックであり、無料で何とかできないかと画策した。
#やったこと
###その1. OpenCVSharpの導入
OpenCVをC#で扱えるようにした.Net Framework向けラッパーである『OpenCVSharp』をNuGet経由で導入した。導入手順は、Unity であらゆる C#(.NET) パッケージを使う(例:opencv) を参照してください。
結果としては、ライブラリがUWP環境に対応しておらず不動作。CV::Matできず
ただし、普通にUnityでOpenCVする分には動作する。
###その2. OpenCVSharp-UWPの導入
OpenCVSharpのUWP向けラッパーである『OpenCVSharp-UWP』を導入した。
結果としては、参照エラーが頻出し不動作。CV::Matとか、そのレベルじゃなかった
公式のリポジトリのIssuesにもバグ報告があった。。
###その3. OpenCV-Hololensの導入
OpenCVをHoloLensで扱えるようにしたラッパーである『OpenCV-Hololens』をネイティブプラグインとして導入した。導入手順は、【UWPアプリでOpenCVを無料で使おう!】C#(.NET) UWPアプリへのC++ダイナミックライブラリ(dll)の組み込み方を参照してください。
この方法により、無事HoloLensでOpenCVを使うことに成功した。CV::Matが動く
#課題
無事使えるようになったOpenCVで外部カメラ映像を取得し画像処理するアプリとHoloLensに乗っけた投影用のアプリの通信に、Low-Level Native Plugin Interfaceを使おうと思ったら、テクスチャの送受信でメモリがいっぱいいっぱいに。とてもじゃないけど動かせない。
#最終的に
###方向転換
そこで、これまでのHoloLensにアプリを乗っけてテクスチャを通信でやり取りする方法ではなく、『Holographic Remoting Player』を使ってHoloLensに直接投影する荒業に変更した。
###Holographic Remoting Playerとは
Microsoftが公式で発表しているHoloLens向けのアプリで、LANを介しUnityと通信し、UnityのEdito画面を直接投影することができる。もともとは、開発上のビルドの手間を省き、楽に動作チェックできるという代物(?)であるが、アプリ間通信よりも動作が非常に安定している。
###どう変わったか
HoloLensにアプリを乗っけるという枠に囚われるあまりハード・ソフトウェア依存の沼にハマっていってしまったが、Holographic Remoting Playerの導入により、そのような依存に左右されず、さらにはビルドの必要もない開発環境に落ちつけることができた。
HoloLens、しいてはUWP向けに開発する必要がないということは、ネイティブのOpenCVをdllとして読み込み、C++で記述したOpenCVによる画像処理をネイティブプラグインとしてC#で扱えるようになった。
#おわりに
特異な仕様ゆえにOpenCVの導入という初歩的な手順で多くの時間を無駄にしてしまった。
そもそもHoloLensにアプリを実装するには、UnityでUWP向けに開発、ビルドしVSソリューションファイルを生成、VSでx86向けにデバックし実機に乗っけるという非常に面倒な手順を踏むのだが、UnityとVSのバージョン関係でビルドが通らなかったり、ビルドが通らなかったり、はたまたビルドが通らなかったりして、多くの時間を犠牲にした。