ENGINEER BLOG

ENGINEER BLOG

UnityでOpenCVを使ってみる

こんにちは、コンサルティングサービス本部の朝日です。

みなさんGWはいかがお過ごしでしたでしょうか。
私は積みゲーを消化しつつ、久しぶりにUnityを触っていました。
今回はUnityでOpenCVを使ってみたのでそのご紹介をしたいと思います。

環境

  • Unity 2019.1.2f1
  • Windows 10

OpenCV Plus Unity

OpenCVは数多くの画像処理系のアルゴリズムを含むライブラリです。
Unityで使うには、いままでは有料アセットのOpenCV for Unity等を使うか、自力でOpenCvSharpなどを入れてみるかぐらいしかなかったと思ったのですが、最近調べてみるとOpenCV plus Unityという無料アセットが公開されていたので、そちらを使ってみました。

アセットストアからダウンロード、インポートすると、

error CS0227: Unsafe code may only appear if compiling with /unsafe. Enable "Allow 'unsafe' code" in Player Settings to fix this error.

というエラーがでるので、編集→プロジェクト設定→Playerから「アンセーフコードを許可」にチェックを入れます。

デモの確認

Assets→OpenCV+Utility→Demoの中を見ると、いくつかのデモシーンが存在するので、それを動かしてみます。

全てのシーンをファイル→ビルド設定の「ビルドに含まれるシーン」に追加してから、LobbySceneを開いて実行すると各種デモを実行できます。

以下、デモについて軽く紹介したいと思います

Contours

これはわかりやすいですね。
FindContoursで輪郭を抽出して、ApproxPolyDPでポリゴン近似してから頂点が何個あるかで何角形の図形か判定しています。
img01

img02

Live Face Detector

カメラ画像に対して、顔認識をしてくれます。

そのまま実行すると、追加データをダウンロードするかダイアログが表示されますが、「OK, process with face rects only」を選ぶと、顔の位置を検出して矩形を表示するだけになります。

OpenCVのデモでよく使われる女性の画像

img05

に対して使ってみると、こんな感じになります。

img14

「Download」を選んだ場合、ダウンロードされたファイルを解凍し、ファイルの拡張子を.byteに変更してから、プロジェクトにインポートしましょう。

メッセージでは、既存のファイルと置き換えるように書いてありますが、リネームしてインポート後、FaceDetectorScene→Canvas→RawImageのインスペクターでFace Detector Scene (Script)の「形状」を切り替える方が良いと思います。
img15
その設定をすると、顔の部品についての検出まで可能になります。 有料アセットだとDlib FaceLandmark Detectorというのがありますね。
img16
目や口の位置まで検出できるので、FaceRigっぽい感じで使えると思います。

Face Recognizer

いくつかある顔認識のアルゴリズムのうち、FisherFaceを使って誰なのか認識させています。
このデモでは学習済みデータが提供されていますが、実際に使う際には訓練データをつかって学習させる必要があります。

img03

img04

Grayscale Image

シンプルに画像をグレースケールに変換して表示してるだけですね。
img06

Live Sketch

カメラ画像に対して、Canny法によるエッジ抽出をして表示しています。
img17

Maker Detector

ArUcoというARマーカーを検出するモジュールを使ったマーカー検出のデモです。

img07

img08

Document Scanner

スマホアプリなどでよくある、カメラで斜めに撮ったホワイトボードやレシートを四角に補正してくれるやつです。
矩形検出→射影変換をしてるようです。
img10

Alphabet OCR

隠れマルコフモデル(HMM)を使ったOCRのデモです。

img11

img12

OpenCV自体では他にもTesseractというOCRエンジンと連携できるようですがそちらについては未調査です。

Object Tracking

OpenCVにはいくつか物体追跡のアルゴリズムが実装されていますが、このデモではMedianFlowを使っているようです。
カメラ画像で、追跡したいオブジェクトをマウスで範囲指定してあげると、それを追跡してくれます。(下記のキャプチャはちょっとコマ落ちしてますが、イメージは掴めると思います)

movie1

さいごに

今回はアセットとデモの紹介だけでしたが、OpenCVの機能は非常に多いので、色々調べて使えそうなものがあれば実際のプロダクト開発で活用してみたいですね。