LoginSignup
1
0

[開発] 顔検出 (WPF+OpenCV)

Last updated at Posted at 2024-03-19

画像処理・解析用ライブラリ 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

上記リンク先に画像があったのでその画像で顔認識してみる。
入力画像に四角のバウンディングボックスが追加表示される。

B - コピー (8).jpg

左が今回作成したもの。右は上記リンク中にある恐らく19~21年検出結果。

1.Nuget

NUGET.jpg

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>
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0