情報工学科学生による備忘録

1学生の備忘録です。開発したときのことを思い出せるように。

Unity 2018とOpenCvSharpで無料で顔認識までやってみる

お久しぶりです。
学祭の関係でUnityとOpenCVやってます。 文献が全然見つからなくて少し苦労したのでメモ。

Unity

有名ですね。3Dでゲームつくるやつです。 Unity 2018.1でやります。2017とかはだいたい同じように出来るかと思いますが、5とかはわからないです。

OpenCV

こっちは画像処理のライブラリ。3.4.1を使っていきます。

OpenCvSharp

C#OpenCVを使えるようにしたものです。日本の方が作成していてC#+OpenCVの中では日本語の文献が多いです。 C#OpenCVを使わないのであれば公式が提供するPyhton2や、C++Javaなんかを使ったほうがいいんじゃないでしょうか。

追記2018/09/07 OpenCV for Unityなどのアセットもありますが、学生なので有料は躊躇する大きなポイントです。
OpenCvSharpはフリーなので導入こそ手間はかかりますが、無料でOpenCVが使えるので積極的に活用していきましょう。

ライブラリをUnityに追加

正直ここが一番苦労しました。今でも怪しいですが、踏んだ手順だけ残しておきます。

  1. NuGet for Unityアセットを追加
  2. Unityを再起動してNuGet for Unityを有効化
  3. メニューバーNuGetからManage NuGet Packagesを選択してマネージャを起動
  4. OpenCvSharp3をInstall(←時間かかるやつ)
  5. AssetsフォルダにPackagesフォルダ、その中にOpenCvSharpのフォルダが作成されてる
  6. x64とx86のライブラリがぶつかるのでAssets/Packages/OpenCvSharp3-~~~~~/NativeDlls/のx86を削除
  7. Unityを再起動(念の為)

以上です。

追記2018/11/06

Unity であらゆる C#(.NET) パッケージを使う(例:opencv) - Qiita こちらのページでリンクを貼っていただきまして、「お気をつけください」と言われてしまいました。 私が手探りでやっているなかx86のものを削除しないと動作しなかったために、こちらの手順を紹介すると同時に、自身へのメモとして残しました。 当時の私がUnityやC#、各種ライブラリの扱いを詳しくわかっていなく、また、きちんと検証をしなかったことをお詫び申し上げます。

こちらの手順は、当時の記憶としてそのまま残しますのでご了承ください。

スクリプト

今回は、Webカメラから一枚画像を撮影し、顔認識したものを保存するというスクリプトを作成しました。
プログラムはOpenCvSharp3で検索するのを推奨します。僕もまだ手探りです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OpenCvSharp;

public class Test : MonoBehaviour {

    // Use this for initialization
    void Start () {
        using (var video = new VideoCapture(0))
        {
            //保存先行列
            var frame = new Mat();
            //保存
            video.Read(frame);
            //分類器
            var haarcascade = new CascadeClassifier("Assets/haarcascades/haarcascade_frontalface_default.xml");
            //グレースケール
            var gray = new Mat();
            Cv2.CvtColor(frame, gray, ColorConversionCodes.BGR2GRAY);
            //検出
            var faces = haarcascade.DetectMultiScale(gray);
            //検出箇所に円を描画
            foreach (OpenCvSharp.Rect face in faces)
            {
                var center = new Point
                {
                    X = (int)(face.X + face.Width * 0.5),
                    Y = (int)(face.Y + face.Height * 0.5)
                };
                var axes = new Size
                {
                    Width = (int)(face.Width * 0.5),
                    Height = (int)(face.Height * 0.5)
                };
                Cv2.Ellipse(frame, center, axes, 0, 0, 360, Scalar.Red, 4);
                print("Found!");
            }
            //保存
            frame.SaveImage("ThisIsYourFaces.png");
        }
    }
    
    // Update is called once per frame
    void Update () {
    }
}

少々雑な記事ですがメモということでお許しを。それでは。

追記2018/09/05

続き

続き書きました。 ssssota.hatenablog.com