UnityでOpenCVを利用した顔検出・画像処理アプリ事始め

  • 84
    いいね
  • 0
    コメント

※記事の情報を「OpenCV for Unity 2.0.9」に対応した内容に更新しました。
以前のバージョンのセットアップ方法は「旧バージョン(2.0.0以前)のセットアップ方法」の項目を参考にしてください。

はじめに

UnityでOpenCVを利用したアプリが簡単に作れるようになるAssetプラグイン「OpenCV for Unity」がAssetStoreで販売されています。

OpenCV for Unity (https://www.assetstore.unity3d.com/jp/#!/content/21088)

公式では無いがインストール手順を詳細に紹介しているサイト


Windows、Mac、Android、IOS、Linux、WindowsStore、WindowsPhone、Windows10 UWP WebGLという数多くのプラットフォーム対応しています。
自分で一からネイティブプラグインを作成する手間を考えたら$95は十分お得だと思います。

このAssetを使用した「MarkerBased AR」や「Face Tracker」「RealTime FaceRecognition」のサンプルプロジェクトもAssetStoreで無料配布されています。(動作確認には「OpenCV for Unity」が必要。これらのサンプルは「Mastering OpenCV With Practical Computer Vision Projects」という本のに載っているいるサンプルコードを移植したもののようです)
たまたま参考に読んでいた「OpenCV for Secret Agents」という電子書籍でも一章にわたってサンプルアプリの作成手順が掲載されていました。

Unity5ならproライセンスを持っていなくてもエディタ上でも実行できるのでOpenCVを使った顔検出や画像加工アプリなどのアイデアを手軽に試すことが出来るので楽しいです。
(バージョン2.0.9からWebGLプラットフォームに対応したことにより、ブラウザ上で実行できるWebアプリを作成することが出来るようになりました!実行速度も実用的なレベルでした)

この記事ではAssetのインポートからサンプルの実行までの流れを解説したいと思います。

※AssetにはReadMe.pdf(英語)が同梱されています。合わせて読んでください。(以下は基本的にはこのマニュアル内容を翻訳したものとなります)

OpenCV for Unityのインポート

UnityのAssetStoreから「OpenCV for Unity」をダウンロードし、プロジェクトにインポートします。(※「OpenCV for Unity」Assetのインポートサイズを削減する方法を参考に必要なプラットフォームのプラグインファイルのみインポートすることを推奨)

Assetsのインポートが完了すると、メニューに[Tools/OpenCV for Unity/Set Plugin Import Settings]が追加されます。

OpenCV for Unityのセットアップとサンプル実行

セットアップ

  1. メニューの[Tools/OpenCV for Unity/Set Plugin Import Settings]を選択する QiitaOpenCV124_setup.jpg
  2. “OpenCVForUnity/StreamingAssets/”フォルダを“Assets/”フォルダ直下に移動する QiitaOpenCV300bata2.jpg

サンプル実行

  1. [PlayerSettings]-[Resolution and Presentation]-[Orientation]-[Default Orientation : Portrait]に設定を変更する。
  2. [Build Settings] を開き、全てのシーン“***.unity” を[Scene In Build]に追加してビルド。サンプルを実行。
※UNITY5.0.0/5.0.1 + IOS向けビルドにおいてwebCamTextureToMat()という関数を使用したサンプルシーンを実行する場合は[PlayerSettings]-[Other Settings]-[Configuration]-[Graphics API]の値を「OpenGL ES」に設定する必要があるようです。(iPhone5の場合は「OpenGL ES 2.0」にする)
※通常ならば上記のセットアップ作業を行えば、サンプルを動かすことができるはずです。

もし、なにかしらのエラーが出た場合でもReadMe.pdfを見れば、たいていの問題は解決出来るんじゃないかと思います。
よくあるケースとしては、Assetのインポート時や何かの弾みでopencvforunity.bundleやopencv2.frameworkファイルのインポート設定がリセットされてしまうことがあるようです。その場合はメニューの[Tools/OpenCV for Unity/Set Plugin Import Settings]を選択することで壊れた設定を修復することが出来ます。

QiitaOpenCV_sample01.jpg

QiitaOpenCV_sample02.jpg

QiitaOpenCV_sample03.jpg

旧バージョン(2.0.0以前)のセットアップ方法

※UNITY4とUNITY5では異なるファイルがインポートされます。もしプロジェクトをUNITY4からUNITY5に更新した際には、一旦Assetsファイルを削除してから再度Assetをインポートしてください。

セットアップ(UNITY4)

  1. “OpenCVForUnity/Plugins/”フォルダを“Assets/”フォルダ直下へ移動する
  2. “OpenCVForUnity/StreamingAssets/”フォルダを“Assets/”フォルダ直下に移動する QiitaOpenCV118_unity4.jpg

セットアップ(UNITY5)

  1. メニューの[Tools/OpenCV for Unity/Set Plugin Import Settings]を選択する QiitaOpenCV124_setup.jpg
  2. “OpenCVForUnity/StreamingAssets/”フォルダを“Assets/”フォルダ直下に移動する QiitaOpenCV118_unity5.jpg

サンプル実行(共通)

  1. [PlayerSettings]-[Resolution and Presentation]-[Orientation]-[Default Orientation : Portrait]に設定を変更する。
  2. [Build Settings] を開き、全てのシーン“***.unity” を[Scene In Build]に追加してビルド。サンプルを実行。
※UNITY4 + IOS向けビルドの場合は、出力されたXcodeプロジェクトを開き、“OpenCVForUnity/iOSforXcode/opencv2.framework”へのリンクを追加する必要があります。 (Build Phases > Link Binary with Libraries > Add opencv2.framework )

(この手順はPostprocessBuildPlayerという機能を使用して自動化することも可能なようです)

※UNITY4.6.3/5.0.0/5.0.1 + IOS向けビルドにおいてwebCamTextureToMat()という関数を使用したサンプルシーンを実行する場合は[PlayerSettings]-[Other Settings]-[Configuration]-[Graphics API]の値を「OpenGL ES」に設定する必要があるようです。(iPhone5の場合は「OpenGL ES 2.0」にする)
※通常ならば上記のセットアップ作業を行えば、サンプルを動かすことができるはずです。

もし、なにかしらのエラーが出た場合でもReadMe.pdfを見れば、たいていの問題は解決出来るんじゃないかと思います。
よくあるケースとしては、Assetのインポート時や何かの弾みでopencvforunity.bundleやopencv2.frameworkファイルのインポート設定がリセットされてしまうことがあるようです。その場合はメニューの[Tools/OpenCV for Unity/Set Plugin Import Settings]を選択することで壊れた設定を修復することが出来ます。(UNITY4の場合はReadMe.pdfの説明を見て手動で再設定をしてください)

あなたのOpenCVアプリを作成する

ReadMeによると、このAssetはOpenCV Javaのクローンとして作成されているとあるので、Javaのラッパーで対応しているAPIは基本的に対応している1と考えて良いようです。
これまでのOpenCV Java向けの技術情報等もそのまま活用出来ると思います。

[参考資料]OpenCVでできることの一部(ICVS2013資料から引用)

02_s.gif

画像処理 (Image Processing)

  • 勾配,エッジ,コーナー (Gradients, Edges and Corners)
  • サンプリング,補間,幾何変換 (Sampling, Interpolation and Geometrical Transforms)
  • モルフォロジー演算 (Morphological Operations)
  • フィルタと色変換 (Filters and Color Conversion)
  • ピラミッドとその応用 (Pyramids and the Applications)
  • 画像分割、領域結合、輪郭検出 (Image Segmentation, Connected Components and Contour Retrieval)
  • 画像と形状のモーメント (Image and Contour Moments)
  • 特殊な画像変換 (Special Image Transforms)
  • ヒストグラム (Histograms)
  • マッチング (Matching)

構造解析 (Structural Analysis)

  • 輪郭処理 (Contour Processing)
  • 計算幾何 (Computational Geometry)
  • 平面再分割 (Planar Subdivisions)

モーション解析と物体追跡 (Motion Analysis and Object Tracking)

  • 背景統計量の累積 (Accumulation of Background Statistics)
  • モーションテンプレート (Motion Templates)
  • 物体追跡 (Object Tracking)
  • オプティカルフロー (Optical Flow)
  • 推定器 (Estimators)

パターン認識 (Pattern Recognition)

  • 物体検出 (Object Detection)
  • カメラキャリブレーションと3次元再構成 (Camera Calibration and 3D Reconstruction)
  • カメラキャリブレーション (Camera Calibration)
  • 姿勢推定 (Pose Estimation)
  • エピポーラ幾何 (Epipolar Geometry)

機械学習

  • 単純ベイズ分類器 (Naive Bayes Classifier)
  • k近傍法 (K Nearest Neighbors)
  • サポートベクターマシン (SVM)
  • 決定木 (Decision Trees)
  • ブースティング (Boosting)
  • Random forest (Random forest)
  • EMアルゴリズム (Expectation-Maximization)
  • ニューラルネットワーク (Neural Networks)

ユーザインタフェース

  • シンプルGUI (Simple GUI)
  • 画像の読み込みと保存 (Loading and Saving Images)
  • ビデオ入出力 (Video I/O)

...and more

OpenCV.jp : OpenCV逆引きリファレンス
画像処理速報

関連記事

UnityでOpenCVを利用した顔検出・画像処理アプリ事始め
UnityでOpenCVを利用した顔検出・画像処理アプリ事始め2 サンプルコード詳解
「OpenCV for Unity」Assetのインポートサイズを削減する方法
UnityでOpneCVを利用した動画再生をしてみた
UnityでOpneCVを利用したハコスコVR体験


  1. 公式のOpenCV JavaラッパーがOpenCVの全てのAPIをラップしているわけではないようなので、使用したい機能が対応しているかどうかは確認が必要です。