Herkese merhabalar internet üzerinde gezerken C# ile Yapay Görme Uygulamaları - Yavuz Mercan - Bir Yazılımcının Günlüğü (: şöyle bir konuya rast geldim. Link içerisinde yer alan bu kodları direkt olarak forma girince hata verdi. Ben de ilgimi çeken konu üzerindeki hataları düzeltmek için Chat GPT 'ye attım ancak verdiği düzeltmeler kütüphaneye zamanla gelen güncelleme nedeniyle kod yapısındaki meydana gelen değişiklikten dolayı mı yoksa benim cahilliğimden mi bir türlü anlayamadım ilk halinden daha da beter oldu. Ben de bu konunun üzerine gitmeye karar verdim, neticede uzun uğraşlar sonucunda kodları revize ettim & sonuçları sizinle paylaşmak istedim. Kodlarımız başlıktan da anlaşılacağı üzere bilgisayara bağlamış olduğunuz herhangi bir kamera içerisinde anlık meydana gelen hareketleri algılıyor & bunları kırmızı renkli bir dikdörtgen ile çerçeve şeklinde size gösteriyor. Kodlarımız bu işlevleri yerine getirirken OpenCvSharp4, OpenCvSharp4.runtime.win, OpenCvSharp4.Windows NuGet paketlerinden destek alıyor.
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 yakalanan hareketleri 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. Kodlarımıza geçelim;
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;
public Form1()
{
InitializeComponent();
capture = new VideoCapture(0); // Webcam'i başlat
frame = new Mat();
prevFrame = new Mat();
diffFrame = new Mat();
}
Form Load olayına aşağıdaki kodu girelim. Bu sayede yakalama işlemimiz uygulamamız çalışır çalışmaz başlayacak.
C#:
timer1.Start();
Şimdi ise Timer nesnemize çift tıklayalım & şu kodları girelim.
C#:
// Webcam'den yeni bir kare al
capture.Read(frame);
if (frame.Empty()) return;
// İlk kareyi al ve sonrasındaki karelerle karşılaştır
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
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);
Daha sonra dönüşüm yapısının kolaylaşması için aşağıdaki kodları projemize ekleyelim.
C#:
public static Bitmap MatToBitmap(Mat mat)
{
return new Bitmap(mat.Width, mat.Height, Convert.ToInt32(mat.Step()), System.Drawing.Imaging.PixelFormat.Format24bppRgb, mat.Data);
}
Ardından projemizi derleyelim bakalım çalışıyor mu?
[ SONUÇ ]
Bayramınız mübarek olsun hayırlı geceler dilerim.
Son düzenleme:




