Merhabalar herkese hayırlı bayramlar & hayırlı sabahlar bugünkü makalemizde C# dilinde yüz tanıma işlemi yapacağız. Aslında kodlar bir önceki konu ile benzerlikler taşımakta isterseniz bir önceki konuma bana tıkla bu adresten gidebilirsiniz. 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.
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.
C#:
// 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
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Ç ]
Görüldüğü üzere bazı bilim adamlarını başarıyla tespit etti. Tabi ki eksikleri var & geliştirilmesi gerekiyor bunu da sizin takdirinize bırakıyorum.
Görüldüğü üzere bazı bilim adamlarını başarıyla tespit etti. Tabi ki eksikleri var & geliştirilmesi gerekiyor bunu da sizin takdirinize bırakıyorum.
Son düzenleme:


