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に追加
正直ここが一番苦労しました。今でも怪しいですが、踏んだ手順だけ残しておきます。
- NuGet for Unityアセットを追加
- Unityを再起動してNuGet for Unityを有効化
- メニューバーNuGetからManage NuGet Packagesを選択してマネージャを起動
- OpenCvSharp3をInstall(←時間かかるやつ)
- AssetsフォルダにPackagesフォルダ、その中にOpenCvSharpのフォルダが作成されてる
- x64とx86のライブラリがぶつかるのでAssets/Packages/OpenCvSharp3-~~~~~/NativeDlls/のx86を削除
- 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