Hoşgeldin Misafir

C# Yüz Tanıma

xS0N3R

23 Ağu 2020
5,424 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Merhabalar herkese hayırlı bayramlar & hayırlı sabahlar bugünkü makalemizde C# dilinde yüz tanıma işlemi yapacağız. Kodlarımız başlıktan da anlaşılacağı üzere yüz tanıma işlemi yapıyor tespit ettiği yüzleri mavi ile daire içerisine alıyor. Bu işlevleri yerine getirirken OpenCvSharp4, OpenCvSharp4.runtime.win, OpenCvSharp4.Windows NuGet paketlerinden destek almakta


Kütüphanelerimizi Tanımlayalım


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using OpenCvSharp;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Forms;

Kütüphanelerimizi tanımladıktan sonra formumuza bir adet PictureBox ile Timer ekleyelim. Bu ögeler sırasıyla tanımlanan yüzleri kullanıcının görsel olarak görmesini yarayacak diğer nesnemiz ise bu olayların sürekli olarak tekrarlanmasına olanak tanıyacak. Timer nesnemizin Intervival özelliği 30 olsun. Ayrıca aşağıda vereceğim linkten bir XML dosyası indirmeniz & herhangi bir dizine kaydetmeniz gerekmekte. Kodlarımıza geçelim;

Link : https://github.com/kipr/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml

partial class verisinin altına aşağıda yer alan kodları olduğu gibi yapıştıralım.

C#:
  private VideoCapture capture;
        private Mat frame;
        private Mat prevFrame;
        private Mat diffFrame;
        private bool isFirstFrame = true;

        private CascadeClassifier faceCascade;

        public Form1()
        {
            InitializeComponent();
            capture = new VideoCapture(0); // Webcam'i başlat
            frame = new Mat();
            prevFrame = new Mat();
            diffFrame = new Mat();

            // Haar Cascade Yüz Tanıma Modelini Yükle
            faceCascade = new CascadeClassifier(@"C:\Desktop\haarcascade_frontalface_default.xml"); // Burada linkte vereceğim XML dosyanızı istediğiniz alana kaydedip yolunu verin.

        }

Form Load olayına aşağıdaki kodu girelim. Bu sayede yüz tanıma işlemimiz uygulamamız çalışır çalışmaz başlayacak.
C#:
timer1.Start();
Ardından Timer nesnemize çift tıklayalım & şu kodları girelim.

Kod:
     // Webcam'den yeni bir kare al
            capture.Read(frame);

            if (frame.Empty()) return;

            // Yüz algılama işlemi
            DetectFaces(frame);

            // Hareket algılama (önceki kodda olduğu gibi)
            if (isFirstFrame)
            {
                frame.CopyTo(prevFrame); // İlk kareyi sakla
                isFirstFrame = false;
                return;
            }

            // Çerçeveler arasındaki farkı hesapla
            Cv2.Absdiff(frame, prevFrame, diffFrame);
            Cv2.CvtColor(diffFrame, diffFrame, ColorConversionCodes.BGR2GRAY);
            Cv2.GaussianBlur(diffFrame, diffFrame, new OpenCvSharp.Size(21, 21), 0);

            // Hareketi algıla (threshold işlemi ile)
            Cv2.Threshold(diffFrame, diffFrame, 25, 255, ThresholdTypes.Binary);
            Cv2.Dilate(diffFrame, diffFrame, new Mat(), iterations: 2);

            // Hareketi çevreleyen dikdörtgenleri çiz
            OpenCvSharp.Point[][] contours;
            Cv2.FindContours(diffFrame, out contours, out _, RetrievalModes.External, ContourApproximationModes.ApproxSimple);

           foreach (var contour in contours)
            {
                if (Cv2.ContourArea(contour) > 500) // Yeterince büyük olan hareketleri algıla
                {
                    var boundingRect = Cv2.BoundingRect(contour);
               //     Cv2.Rectangle(frame, boundingRect, new Scalar(0, 0, 255), 2);
                }
           }

            // Hareketli görüntüyü göster turkhacks.com
            pictureBox1.Image = MatToBitmap(frame); // Bitmap dönüşümü burada yapılır

            // Şu anki kareyi bir sonraki için sakla
            frame.CopyTo(prevFrame);

Dönüşüm yapısının kolaylaşması için aşağıdaki kodları projemize ekleyelim.
C#:
public static Bitmap MatToBitmap(Mat mat)[/B][/B][/B]
 [B][B][B]{
     return new Bitmap(mat.Width, mat.Height, Convert.ToInt32(mat.Step()), System.Drawing.Imaging.PixelFormat.Format24bppRgb, mat.Data);
}

Şimdi ise yüz tanıma işlemimizi gerçekleştirecek olan DetectFaces void nesnemize şu kodları girelim.
C#:
 private void DetectFaces(Mat frame)[/B][/B][/B]
 [B][B][B]{
     // Yüz tanıma işlemi
     var faces = faceCascade.DetectMultiScale(frame, 1.1, 10, HaarDetectionTypes.ScaleImage);

     foreach (var face in faces)
     {
         // Yüzün merkezini ve çapını hesapla
         var center = new OpenCvSharp.Point(face.X + face.Width / 2, face.Y + face.Height / 2);
         var radius = (int)(Math.Min(face.Width, face.Height) / 2);

         // Yüzü mavi bir yuvarlak ile işaretle
         Cv2.Circle(frame, center, radius, new Scalar(255, 0, 0), 2); // Mavi renk (255, 0, 0)
     }
}

Projemizi derleyelim bakalım sonuçlar nasıl geliyor?

[ SONUÇ ]


tjuxwis.png
 

Graves

Graves

Karanlık Özgürlüktür
Moderator
9 Eki 2024
10,447 Mesaj
TIM Görevleri
2

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Merhabalar herkese hayırlı bayramlar & hayırlı sabahlar bugünkü makalemizde C# dilinde yüz tanıma işlemi yapacağız. Kodlarımız başlıktan da anlaşılacağı üzere yüz tanıma işlemi yapıyor tespit ettiği yüzleri mavi ile daire içerisine alıyor. Bu işlevleri yerine getirirken OpenCvSharp4, OpenCvSharp4.runtime.win, OpenCvSharp4.Windows NuGet paketlerinden destek almakta


Kütüphanelerimizi Tanımlayalım


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using OpenCvSharp;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Forms;

Kütüphanelerimizi tanımladıktan sonra formumuza bir adet PictureBox ile Timer ekleyelim. Bu ögeler sırasıyla tanımlanan yüzleri kullanıcının görsel olarak görmesini yarayacak diğer nesnemiz ise bu olayların sürekli olarak tekrarlanmasına olanak tanıyacak. Timer nesnemizin Intervival özelliği 30 olsun. Ayrıca aşağıda vereceğim linkten bir XML dosyası indirmeniz & herhangi bir dizine kaydetmeniz gerekmekte. Kodlarımıza geçelim;

Link : https://github.com/kipr/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml

partial class verisinin altına aşağıda yer alan kodları olduğu gibi yapıştıralım.

C#:
  private VideoCapture capture;
        private Mat frame;
        private Mat prevFrame;
        private Mat diffFrame;
        private bool isFirstFrame = true;

        private CascadeClassifier faceCascade;

        public Form1()
        {
            InitializeComponent();
            capture = new VideoCapture(0); // Webcam'i başlat
            frame = new Mat();
            prevFrame = new Mat();
            diffFrame = new Mat();

            // Haar Cascade Yüz Tanıma Modelini Yükle
            faceCascade = new CascadeClassifier(@"C:\Desktop\haarcascade_frontalface_default.xml"); // Burada linkte vereceğim XML dosyanızı istediğiniz alana kaydedip yolunu verin.

        }

Form Load olayına aşağıdaki kodu girelim. Bu sayede yüz tanıma işlemimiz uygulamamız çalışır çalışmaz başlayacak.
C#:
timer1.Start();
Ardından Timer nesnemize çift tıklayalım & şu kodları girelim.

Kod:
     // Webcam'den yeni bir kare al
            capture.Read(frame);

            if (frame.Empty()) return;

            // Yüz algılama işlemi
            DetectFaces(frame);

            // Hareket algılama (önceki kodda olduğu gibi)
            if (isFirstFrame)
            {
                frame.CopyTo(prevFrame); // İlk kareyi sakla
                isFirstFrame = false;
                return;
            }

            // Çerçeveler arasındaki farkı hesapla
            Cv2.Absdiff(frame, prevFrame, diffFrame);
            Cv2.CvtColor(diffFrame, diffFrame, ColorConversionCodes.BGR2GRAY);
            Cv2.GaussianBlur(diffFrame, diffFrame, new OpenCvSharp.Size(21, 21), 0);

            // Hareketi algıla (threshold işlemi ile)
            Cv2.Threshold(diffFrame, diffFrame, 25, 255, ThresholdTypes.Binary);
            Cv2.Dilate(diffFrame, diffFrame, new Mat(), iterations: 2);

            // Hareketi çevreleyen dikdörtgenleri çiz
            OpenCvSharp.Point[][] contours;
            Cv2.FindContours(diffFrame, out contours, out _, RetrievalModes.External, ContourApproximationModes.ApproxSimple);

           foreach (var contour in contours)
            {
                if (Cv2.ContourArea(contour) > 500) // Yeterince büyük olan hareketleri algıla
                {
                    var boundingRect = Cv2.BoundingRect(contour);
               //     Cv2.Rectangle(frame, boundingRect, new Scalar(0, 0, 255), 2);
                }
           }

            // Hareketli görüntüyü göster turkhacks.com
            pictureBox1.Image = MatToBitmap(frame); // Bitmap dönüşümü burada yapılır

            // Şu anki kareyi bir sonraki için sakla
            frame.CopyTo(prevFrame);

Dönüşüm yapısının kolaylaşması için aşağıdaki kodları projemize ekleyelim.
C#:
public static Bitmap MatToBitmap(Mat mat)[/B][/B][/B]
 [B][B][B]{
     return new Bitmap(mat.Width, mat.Height, Convert.ToInt32(mat.Step()), System.Drawing.Imaging.PixelFormat.Format24bppRgb, mat.Data);
}

Şimdi ise yüz tanıma işlemimizi gerçekleştirecek olan DetectFaces void nesnemize şu kodları girelim.
C#:
 private void DetectFaces(Mat frame)[/B][/B][/B]
 [B][B][B]{
     // Yüz tanıma işlemi
     var faces = faceCascade.DetectMultiScale(frame, 1.1, 10, HaarDetectionTypes.ScaleImage);

     foreach (var face in faces)
     {
         // Yüzün merkezini ve çapını hesapla
         var center = new OpenCvSharp.Point(face.X + face.Width / 2, face.Y + face.Height / 2);
         var radius = (int)(Math.Min(face.Width, face.Height) / 2);

         // Yüzü mavi bir yuvarlak ile işaretle
         Cv2.Circle(frame, center, radius, new Scalar(255, 0, 0), 2); // Mavi renk (255, 0, 0)
     }
}

Projemizi derleyelim bakalım sonuçlar nasıl geliyor?

[ SONUÇ ]


tjuxwis.png
Teşekkürler