sai10の雑記

センサー類, Python, Unity(C#), 機械学習とかについてのメモ

Hololensのカメラ画像をOpenCVforUnityで加工して透過表示するメモ

はじめに

OpenCVforUnityのサンプルを利用します。
(ライセンス関係に抵触する可能性があるため、ソースコードを用いた説明は省きます。)
(また、ある程度OpenCVを知っていることを前提とします。Mat形式とか。)
具体的には、Hololensのカメラ画像をOpenCVforUnityで加工して透過表示するサンプルとして、
OpenCVforUnityのHoloLensComicFilterExample.csを編集していきます。
まずは、以下の動画をご覧ください。


Comic Filter Sample of OpenCVforUnity with HoloLens

少しわかりづらいかもしれませんが、
視線のある一定範囲に漫画の線が重なるような表示が透過されているのが確認できます。
このように、Hololensのカメラ映像をOpenCVforUnityで加工して、透過表示することができます。

カメラ画像の特徴量を透過表示

次に、HoloLensComicFilterExample.csを編集し、
カメラ画像の特徴量を表示するように変更します。以下の動画をご覧ください。


ORB Feature Visualization Test of OpenCVforUnity with HoloLens

コミックフィルターをかける代わりに、
ORB特徴量として複数の小さい円が表示されているのが確認できます。
(右の画像は、静止画でORB特徴を算出した例です。)
これは、HoloLensComicFilterExample.csのOnFrameMatAcquired関数を変更しています。

OnFrameMatAcquired関数での流れメモ

流れを説明する前に、ちょっとポイントがあります。 これらのサンプルでは、実際のカメラの範囲より少し狭めになるよう、表示する画像を変換しています。 (変換部分をわかりやすくするため、処理を軽くするため等が考えられます。)

そのとき、カメラのサイズそのままの画像加工用のdstMat、
少し狭めの表示領域となるdstMatClippingROIがあります。
確認が取れていないので、推測になりますが....
dstMatClippingROIは、その表示領域部分のみdstMatのメモリを参照しています。(のはず)
つまり、dstMatClippingROIのみ加工し、dstMatごと、テクスチャに貼るMatへコピーするという流れになります。
(ちょっと自信ない)


そして、以下がOnFrameMatAcquired関数での流れとなります。
① Hololensカメラ画像 → 変数bgraMat (BGRA32形式のMatデータ)として受け取る
② 変数bgraMatを表示サイズへ変換
(Mat bgraMatClipROI = new Mat(bgraMat, processingAreaRect);)
③ bgraMatClipROI → dstMatClippingROI (この時にしたい処理をする。今回は特徴量表示。)
④ dstMat → bgraMatへコピー

まとめ

  • OpenCVforUnityのHoloLensComicFilterExampleを紹介しました
  • HoloLensComicFilterExample.csを特徴量表示するよう変更しました
  • HoloLensComicFilterExample.csの流れのメモを記述しておきました