25 Mayıs 2026 · ~18 dk okuma · C# / OpenCvSharp4

C# ve OpenCvSharp4 ile Görüntü İşleme Mimarisi

PixelWork ürünlerinde (özellikle ScreenSense Studio ve FlowPilot Pro) görüntü katmanı büyük ölçüde C# ve OpenCvSharp4 üzerine kuruludur. Bu makale, üretimde sürdürülebilir bir VisionWorker tasarımını, bellek disiplinini ve OCR entegrasyonunu adım adım açıklar.

1. Neden C# masaüstü otomasyonunda?

.NET, Windows masaüstünde olgun UI framework’leri (WPF), güçlü async/await ve kolay dağıtım (tek exe + self-contained) sunar. OpenCvSharp4, OpenCV’nin native DLL’lerini P/Invoke ile sarar; Python prototipinden sonra performans kritik modülleri C#’a taşımak yaygın bir yoldur. C++ native modüller yalnızca darboğazlarda (ör. özel capture sürücüsü) kullanılır; iş mantığı C#’da kalır.

2. Mat yaşam döngüsü ve Dispose

OpenCvSharp.Mat yönetilmeyen bellek tutar. Her karede yeni Mat oluşturmak GC baskısı ve native sızıntı riski yaratır. Önerilen desen:

// Tek seferlik tamponlar — VisionWorker ctor
private Mat _frameBgra;
private Mat _roiGray;
private Mat _template;

public void InitBuffers(int w, int h) {
  _frameBgra = new Mat(h, w, MatType.CV_8UC4);
  _roiGray = new Mat();
}

public void DisposeBuffers() {
  _frameBgra?.Dispose();
  _roiGray?.Dispose();
  _template?.Dispose();
}

using var roi = new Mat(frame, rect); kısa ömürlü dilimler için uygundur. UI thread’inde asla ağır Cv2 çağrısı yapmayın; sonuçları immutable DTO ile ana thread’e taşıyın.

3. Capture ve ROI kalibrasyonu

Ekran yakalama GDI, DXGI Desktop Duplication veya üçüncü parti capture API ile yapılabilir. OCR ve şablon eşleştirme için sabit çözünürlük ve Windows ölçeklemesi %100 şarttır. ROI (Region of Interest) kullanıcı arayüzünde dikdörtgen seçici ile kaydedilir ve JSON profilde saklanır:

{
  "profile_id": "excel_status_v2",
  "resolution": { "w": 1920, "h": 1080 },
  "rois": [
    { "id": "status_bar", "x": 120, "y": 980, "w": 400, "h": 80 }
  ]
}

Çoklu monitörde ROI koordinatları monitör kimliği ile birlikte tutulmalıdır; aksi halde ikinci ekrana geçişte yanlış piksel okunur.

4. Şablon eşleştirme (MatchTemplate)

Sabit UI öğelerinde Cv2.MatchTemplate + MinMaxLoc yeterlidir. Gri tonlama gürültüyü azaltır:

Cv2.CvtColor(roiBgra, _roiGray, ColorConversionCodes.BGR2GRAY);
Cv2.MatchTemplate(_roiGray, _template, _result, TemplateMatchModes.CCoeffNormed);
Cv2.MinMaxLoc(_result, out _, out maxVal, out _, out maxLoc);
bool hit = maxVal >= profile.Threshold; // örn. 0.88

Eşik değeri ortama göre kalibre edilir. Işık değişiminde normalize edilmiş katsayı (CCoeffNormed) daha stabildir. Renkli butonlarda HSV kanalı ayrı ROI profili olarak saklanabilir.

5. VisionWorker ve thread modeli

UI donmasını önlemek için görüntü döngüsü arka planda çalışır. .NET’te Channel<VisionEvent> veya BlockingCollection ile üretici-tüketici ayrımı yapılır:

Kare hızı hedefi uygulamaya göre değişir; ofis senaryosunda 5–15 FPS çoğu durumda yeterlidir. Döngü süresi Stopwatch ile loglanır; p95 süre 40 ms üzerindeyse ROI küçültülür veya çözünürlük düşürülür.

6. Tesseract OCR entegrasyonu

Metin tabanlı durum okuma (sayı, yüzde, etiket) için ROI gri tonlamaya çevrilir, isteğe bağlı eşikleme (Cv2.Threshold) uygulanır ve Tesseract’a PNG byte dizisi verilir. Dil paketi (tur, eng) kurulumda doğrulanmalıdır. OCR sonucu regex ile filtrelenir; güven skoru düşükse olay üretilmez (fail-safe).

OCR + şablon hibrit senaryoda önce ucuz piksel testi, başarısızsa OCR çalıştırmak CPU tasarrufu sağlar.

7. Performans kontrol listesi

  1. ROI alanını minimum tutun; tam ekran işlemeyin.
  2. Mat kopyalarını azaltın; mümkünse referans ROI kullanın.
  3. YOLO inference’ı ayrı makalede anlatıldığı gibi ONNX ile GPU’da çalıştırın.
  4. Profil JSON sürümleyin; geri dönüş için yedek alın.
  5. 24 saatlik stres testinde bellek eğrisinin düz olduğunu doğrulayın.

İlgili: YOLOv8 ONNX pipeline · OpenCV vs YOLO · Teknik dokümantasyon merkezi

← Tüm makaleler