
こんにちは、コンサルティングサービス本部の朝日です。
みなさん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でポリゴン近似してから頂点が何個あるかで何角形の図形か判定しています。
Live Face Detector
カメラ画像に対して、顔認識をしてくれます。
そのまま実行すると、追加データをダウンロードするかダイアログが表示されますが、「OK, process with face rects only」を選ぶと、顔の位置を検出して矩形を表示するだけになります。
OpenCVのデモでよく使われる女性の画像
に対して使ってみると、こんな感じになります。
「Download」を選んだ場合、ダウンロードされたファイルを解凍し、ファイルの拡張子を.byteに変更してから、プロジェクトにインポートしましょう。
メッセージでは、既存のファイルと置き換えるように書いてありますが、リネームしてインポート後、FaceDetectorScene→Canvas→RawImageのインスペクターでFace Detector Scene (Script)の「形状」を切り替える方が良いと思います。
その設定をすると、顔の部品についての検出まで可能になります。 有料アセットだとDlib FaceLandmark Detectorというのがありますね。
目や口の位置まで検出できるので、FaceRigっぽい感じで使えると思います。
Face Recognizer
いくつかある顔認識のアルゴリズムのうち、FisherFaceを使って誰なのか認識させています。
このデモでは学習済みデータが提供されていますが、実際に使う際には訓練データをつかって学習させる必要があります。
Grayscale Image
シンプルに画像をグレースケールに変換して表示してるだけですね。
Live Sketch
カメラ画像に対して、Canny法によるエッジ抽出をして表示しています。
Maker Detector
ArUcoというARマーカーを検出するモジュールを使ったマーカー検出のデモです。
Document Scanner
スマホアプリなどでよくある、カメラで斜めに撮ったホワイトボードやレシートを四角に補正してくれるやつです。
矩形検出→射影変換をしてるようです。
Alphabet OCR
隠れマルコフモデル(HMM)を使ったOCRのデモです。
OpenCV自体では他にもTesseractというOCRエンジンと連携できるようですがそちらについては未調査です。
Object Tracking
OpenCVにはいくつか物体追跡のアルゴリズムが実装されていますが、このデモではMedianFlowを使っているようです。
カメラ画像で、追跡したいオブジェクトをマウスで範囲指定してあげると、それを追跡してくれます。(下記のキャプチャはちょっとコマ落ちしてますが、イメージは掴めると思います)
さいごに
今回はアセットとデモの紹介だけでしたが、OpenCVの機能は非常に多いので、色々調べて使えそうなものがあれば実際のプロダクト開発で活用してみたいですね。