画像処理・解析用ライブラリ OpenCVで顔検出する
1.使用するライブラリは下記画像を参考にnugetで入れます。
2.githabにカスケード識別器の定義データがあるので必要なものをDLします。
https://github.com/opencv/opencv/tree/master/data/haarcascades
3.正面の顔検出でしたら、haarcascade_frontalface_alt.xmlです。
4.ファイル名はhaarcascade_frontalface_default.xmlで保存。
5.ABC.xml等と変えたりすると動きません。例外でます。
6.このファイルをデスクトップに配置。顔認識するjpg画像もデスクトップに配置。
7.実行すると検出結果画像が出ます。あわせて人数がタイトルに表示されます。
・人数カウントして店の混雑具合をWebに自動的に開示する等。
・PC接続カメラで動画を撮影 -> 数秒毎にjpg変換 -> OpenCVで検出、人数算出も
簡単にできる。 と思ったらもっとスマートな方法があった↓。
・動画版。OpenCV等専用ライブラリ使わず自力で作ってみようと思う。
https://kimamani89.com/2019/09/17/post-506/
・OpenCVについて改めて書くまでもなく資料は色々あるので、↓など参照。
https://qiita.com/tnoce/items/c819c85a85c16d246be8
上記リンク先に画像があったのでその画像で顔認識してみる。
入力画像に四角のバウンディングボックスが追加表示される。
左が今回作成したもの。右は上記リンク中にある恐らく19~21年検出結果。
1.Nuget
2.WPF (C#)
using OpenCvSharp;
using OpenCvSharp.WpfExtensions;
using System;
namespace OPENCV {
public partial class MainWindow : System.Windows.Window {
public MainWindow() {
InitializeComponent();
var face_cascade = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "haarcascade_frontalface_default.xml");
int cnt=0;
//顔の矩形を抽出
using (Mat mat = new Mat(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "3.jpg"))) {
//グレースケールに加工(精度向上の為)
var gray = new Mat();
OpenCvSharp.Cv2.CvtColor(mat, gray, OpenCvSharp.ColorConversionCodes.RGB2GRAY);
//顔を検知
using (CascadeClassifier cascade = new CascadeClassifier(face_cascade)){
foreach (OpenCvSharp.Rect rectFace in cascade.DetectMultiScale(gray)){
OpenCvSharp.Rect rect = new OpenCvSharp.Rect(rectFace.X, rectFace.Y, rectFace.Width, rectFace.Height);
Cv2.Rectangle(mat, rect, new OpenCvSharp.Scalar(0, 0, 255), 4);
cnt++;
}
}
ImageData.Source = mat.ToWriteableBitmap();
}
Title =cnt.ToString()+"人";
}
}
}
3.WPF (XAML)
<Window x:Class="OPENCV.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:OPENCV" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
<Grid>
<Image x:Name="ImageData" Margin="5,5,5,5"/>
</Grid>
</Window>