はじめに
こんにちは、NTTコノキュー 浅井です。
私はNTTコノキューでXRを使った新規事業を色々やってます。 現在は特に法人向けを多くやってますが、法人向けでMRだとまだまだHoloLens 2が強い印象です。
ということで、今回はHoloLens 2でOpenCVを使う方法を整理しました。
Open CVとは
説明不要な気もしますが、改めて以下の通りです。
出典:https://ja.wikipedia.org/wiki/OpenCV
OpenCV(オープンシーヴィ、英: Open Source Computer Vision Library)とはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリ。
画像処理・画像解析および機械学習等の機能を持つC++、Java、Python、MATLAB用ライブラリ。様々なプラットフォームすなわち複数のオペレーティングシステム (OS) やCPUアーキテクチャに対応するクロスプラットフォームなライブラリであり、macOSやFreeBSD等全てのPOSIXに準拠したUnix系OS、Linux、Windows、Android、iOS等をサポートしている。
つまり、画像処理に使われる古の呪文OSSライブラリです。
ライセンスはApache License 2.0になります。
前提/本記事の対象
本記事は、以下の前提で執筆しています。
- HoloLens 2向けのアプリをUnityで開発している
- Unityライセンスを保有している
- 有償でもOK
全体の流れ
本記事は、大きく以下の2つの流れとなります。
- UnityでOpenCVを使う
- HoloLens 2でOpenCVを使う
1. UnityでOpenCVを使う
以下の有償アセットが、Enox Software社から提供されています。
こちらを購入するのが、現時点では公式かつ最も安心して使えると思います。 買い切りで$95なので、金額も非常に良心的な設定だと思います。
- サポートは現在も継続している
- 2.の手順に出てくるHoloLens 2用のサンプルプロジェクトも現時点で使用可能
その他の手段としては OpenCV plus Unity か、自前で oepncvsharp で実装する、という方法があります。
以下の記事が非常に参考になります。「for」はAPIがJavaで記述されているようです。 参考:https://qiita.com/foka22ok/items/378e1fb337d4b29a75ac
本記事では、OpenCV for Unityを利用します!
2. HoloLens 2でOpenCVを使う
HoloLens 2でUnityアプリを作る場合、1. だけでも良いと思いますが、HoloLens 2のカメラ映像を取得してOpenCVに投げるアレコレを自分で作る必要があります。
そういう手順が手間だな、、という人のために、 HoloLens2WithOpenCVFroUnityExampleというサンプルプロジェクトが存在します。
こちらもOpenCV plus Unity提供元のEnoxSoftware社が提供しています。
サポートも恐らく継続しており、最新版のv1.0.7は2023.1.15リリースです。 ※HoloLens 2自体、ここ数年は大幅な更新が無いため、特に対応不要というのもありそう。
実装方法
基本的にはHoloLens2WithOpenCVFroUnityExampleのSetupに記載があります。
1.HoloLensWithOpenCVForUnityExample.unitypackageをダウンロード
2.OepnCVForUnityをインポート ※HoloLens 2WithOpenCVFroUnityExample自体は無料ですが、これを使うためには有償のOpenCVForUnityが必要になります。
一旦全てのファイルをインポートしてから以下のSetupToolsからMove StreamingAssetsFolderを行った後、StreamingAssets/OpenCVForUnity/objdetect/フォルダから"haarcascadefrontalfacealt.xml", "lbpcascade_ frontalface.xml の2ファイルのみ残して、StreamingAssetsフォルダは空にします。

3.HoloLensCameraStreamリポジトリをクローンして、HoloLensCameraStream/HoloLensVideoCaptureExample/Assets/CamStream/" folder を 自分のUnityプロジェクトのAssets/フォルダーにコピーしてください。
4.MRTK2のセットアップ Microsoft Learn を参考に進めてください。
Unit4の内容まで(Scene作成に入る手間まで)でOKです。
※現在MRTK3をベースにした記載に代わっています。MRTK2の場合はMRTK v2.8.3を参考に以下を選択してください。


5.HoloLensWithOpenCVForUnityExample.unitypackageを自分のUnityプロジェクトにインポート
6.Assets/HoloLensWithOpenCVForUnityExample/.unity* filesをBuildSettingsの "Scenes In Build" list にドラッグアンドドロップで追加。

7.Project Settings>Player>Scripting Define SymbolsにXR_PLUGIN_OPENXRを追加。また、Settings>Player>Publishing settingsのWebCamにチェック。 ※MRTK2ではOpenXRを使用しているため。


8.(オプション)公式ドキュメントを元に、HoloLens 2の環境に適した設定を行う。 ※私は以下の通り実施しました。


9.Unityでビルド
私の場合、以下エラーが出ました。
error CS0103: The name 'MatUtils' does not exist in the current context
該当ファイルを確認し、呼び出している変数の定義がMatUtils.csにあることを確認。 変数名を修正しました。

このエラー解消後も別のエラーが出ました。(メモ忘れ。。)
opencv2の読み込みが多数発生していることが問題という記載だったため、iOSのフォルダを修正。 ※これはどこかのドキュメントに記載があったかと思いますが、失念。

10.slnファイルをビルド Microsoft LearnのUnit6を参考に実施してください。
これで完了です。あとは各種SampleSceneで遊べます。
ArUcoマーカーのサンプルアプリでは、トラッキングしたマーカー上部にCubeが配置され、画面上でトラッキングしている3軸が表示されます。
Cubeの配置は実際のマーカー位置と結構ズレていますが、画像上ではバッチリトラッキング出来ていることがわかります。

参考:ArUcoマーカーのトラッキングを試す場合
ArUcoCreateMarkerExampleというSceneがあるので、UnityEditorで実行するとマーカーをpngファイルで生成出来ます。
このマーカーをHoloLens 2で読み取ればトラッキングが可能です。
