2022.8.14
OpenCV plus Unityを使った物体認識をやってみました。今回は顔認識のカスケード分類器を適用しました。
OpenCV plus Unityの環境設定は前回の記事にまとめてあります。
『UnityでOpenCV plus Unityを動かす環境構築 』
OpenCV plus Unityでカスケード分類器を使うにはOpenCvSharpのCascadeClassifierクラスを使います。
↓CascadeClassifierはこちらのクラスになります。
今回はWebカメラに映る顔を認識するプログラムを作成します。
OpenCV plus Unityの環境構築を行ったら、Assets > Scenes に SampleScene というSceneがあります。これを今回は使います。
Assets > OpenCV + Unity > DemoLiveSketch_WebCamを起動してCanvasとRawImageをコピーします。これをSampleSceneにペーストします。
Live Sketch Scriptコンポーネントを削除します。新たに CascadeRecognizer.cs スクリプト作成し、アタッチします。
CascadeRecognizer.csのソースコードはこちらです。先程のコンポーネントで、FacesにはAssets/OpenCV+Unity/Demo/Face_Detector/haarcascade_frontalface_default.xml
を、SurfaceにはRawImageをアタッチします。
このhaarcascade_frontalface_default.xml
というファイルがカスケード分類器になります。
namespace OpenCvSharp.Demo
{
using UnityEngine;
public class CascadeRecognizer : WebCamera
{
public TextAsset faces;
private CascadeClassifier cascadeFaces;
protected override void Awake()
{
base.Awake();
// classifier
FileStorage storageFaces = new FileStorage(faces.text, FileStorage.Mode.Read | FileStorage.Mode.Memory);
cascadeFaces = new CascadeClassifier();
if (!cascadeFaces.Read(storageFaces.GetFirstTopLevelNode()))
{
throw new System.Exception("FaceProcessor.Initialize: Failed to load faces cascade classifier");
}
}
protected override bool ProcessTexture(WebCamTexture input, ref Texture2D output)
{
Mat image = Unity.TextureToMat(input);
Mat gray = image.CvtColor(ColorConversionCodes.BGR2GRAY);
Mat equalizeHistMat = new Mat();
Cv2.EqualizeHist(gray, equalizeHistMat);
OpenCvSharp.Rect[] rawFaces = cascadeFaces.DetectMultiScale(gray, 1.1, 6);
foreach (var faceRect in rawFaces)
{
Cv2.Rectangle((InputOutputArray)image, faceRect, Scalar.LightGreen, 2);
}
output = Unity.MatToTexture(image);
return true;
}
}
}
このように顔が認識されます。haarcascade_frontalface_default.xml
のファイルは今回は顔認識でしたが、別の物体認識用のファイルを作成して適用すれば、別の物体認識ができるようになります。
今回のサンプルプロジェクトはこちらのリポジトリに置いてあります。
https://github.com/SatoshiKawabata/Unity-Object-Detection/tree/main/Assets/Cascade Sample