Untitled
unknown
csharp
a month ago
6.3 kB
2
Indexable
using System; using System.Drawing; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using System.Threading; using Emgu.CV; using Emgu.CV.Structure; using Emgu.CV.CvEnum; using System.Windows.Forms; public class ContinuousRegionMatcher : IDisposable { // Global sonuç değişkenleri public static volatile bool Region1Result = false; public static volatile bool Region2Result = false; public static volatile bool Region3Result = false; public static volatile bool Region4Result = false; private class RegionInfo { public int RegionId { get; set; } public Rectangle Region { get; set; } public List<Mat> Templates { get; set; } public string TemplateFolder { get; set; } public double Threshold { get; set; } } private List<RegionInfo> regions; private volatile bool isRunning; private List<Task> processingTasks; private CancellationTokenSource cancellationTokenSource; public ContinuousRegionMatcher() { regions = new List<RegionInfo>(); processingTasks = new List<Task>(); cancellationTokenSource = new CancellationTokenSource(); } public void AddRegion(int regionId, Rectangle region, string templateFolder, double threshold = 0.8) { var regionInfo = new RegionInfo { RegionId = regionId, Region = region, Templates = LoadTemplates(templateFolder), TemplateFolder = templateFolder, Threshold = threshold }; regions.Add(regionInfo); } private List<Mat> LoadTemplates(string folder) { var templates = new List<Mat>(); if (!Directory.Exists(folder)) throw new DirectoryNotFoundException($"Template klasörü bulunamadı: {folder}"); foreach (var file in Directory.GetFiles(folder, "*.png")) { var colorTemplate = CvInvoke.Imread(file, ImreadModes.Color); var grayTemplate = new Mat(); CvInvoke.CvtColor(colorTemplate, grayTemplate, ColorConversion.Bgr2Gray); templates.Add(grayTemplate); colorTemplate.Dispose(); } return templates; } private void SetResult(int regionId, bool result) { switch (regionId) { case 1: Region1Result = result; break; case 2: Region2Result = result; break; case 3: Region3Result = result; break; case 4: Region4Result = result; break; } } public void Start() { if (isRunning) return; isRunning = true; foreach (var region in regions) { var task = ProcessRegionContinuously(region, cancellationTokenSource.Token); processingTasks.Add(task); } } private async Task ProcessRegionContinuously(RegionInfo region, CancellationToken token) { while (!token.IsCancellationRequested) { try { using (var colorScreenCapture = CaptureRegion(region.Region)) using (var screenCapture = new Mat()) { // Görüntüyü gri tonlamaya çevir CvInvoke.CvtColor(colorScreenCapture, screenCapture, ColorConversion.Bgr2Gray); var matchFound = false; foreach (var template in region.Templates) { using (var result = new Mat()) { CvInvoke.MatchTemplate(screenCapture, template, result, TemplateMatchingType.CcoeffNormed); double minVal = 0, maxVal = 0; Point minLoc = new Point(), maxLoc = new Point(); CvInvoke.MinMaxLoc(result, ref minVal, ref maxVal, ref minLoc, ref maxLoc); if (maxVal >= region.Threshold) { matchFound = true; break; } } } SetResult(region.RegionId, matchFound); } await Task.Delay(25, token); } catch (OperationCanceledException) { break; } catch (Exception ex) { Console.WriteLine($"Bölge {region.RegionId} işlenirken hata: {ex.Message}"); await Task.Delay(1000, token); } } } //private Mat CaptureRegion(Rectangle region) //{ // using (var bitmap = new Bitmap(region.Width, region.Height)) // { // using (var graphics = Graphics.FromImage(bitmap)) // { // graphics.CopyFromScreen(region.X, region.Y, 0, 0, bitmap.Size); // } // return bitmap.ToMat(); // } //} private Mat CaptureRegion(Rectangle region) { using (var bitmap = new Bitmap(region.Width, region.Height)) { using (var graphics = Graphics.FromImage(bitmap)) { graphics.CopyFromScreen(region.X, region.Y, 0, 0, bitmap.Size); } // Bitmap'i Mat'e çevirme işlemi Mat mat = new Mat(); mat = bitmap.ToImage<Bgr, byte>().Mat; return mat; } } public void Stop() { if (!isRunning) return; isRunning = false; cancellationTokenSource.Cancel(); Task.WhenAll(processingTasks).Wait(); cancellationTokenSource = new CancellationTokenSource(); processingTasks.Clear(); } public void Dispose() { Stop(); foreach (var region in regions) { foreach (var template in region.Templates) { template?.Dispose(); } region.Templates.Clear(); } cancellationTokenSource.Dispose(); } }
Editor is loading...
Leave a Comment