Hikayeler

Reklam vermek için turkmmo@gmail.com

OpenCvSharp ile pencere içi nesne tespiti yapıyorum: mevcut HSV + contour sistemi çalışıyor ama metin tabanlı algılama tarafını nasıl ekleyebilirim?

DemirhanReis

Level 1
Telefon Numarası Onaylanmış Üye TC Kimlik Numarası Doğrulanmış Üye
Üye
Katılım
16 Ağu 2014
Konular
13
Mesajlar
49
Online süresi
75068s
Reaksiyon Skoru
6
Altın Konu
0
Başarım Puanı
87
TM Yaşı
11 Yıl 8 Ay 9 Gün
MmoLira
437
DevLira
0

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

Merhaba,


C# Windows Forms ve OpenCvSharp kullanarak pencere içeriği üzerinde gerçek zamanlı görüntü işleme yapan bir sistem geliştiriyorum. Amacım, ekrandaki belirli bir görsel nesneyi tespit edip onun merkez noktasını bulmak, ardından bu merkez doğrulanırsa ilgili noktaya işlem uygulamak. Şu anki yapım nesnenin görsel özelliklerine göre çalışıyor ancak sahnedeki yazılar ve benzer parlak/koyu alanlar yüzünden zaman zaman hatalı sonuç üretiyor. Bu nedenle mevcut sistemi özetleyip, buna ek olarak metin tespiti veya metin tabanlı doğrulama nasıl eklenebilir diye sormak istiyorum.

Şu an kullandığım sistemin mantığı kısaca şöyle:

Uygulama önce başlık adına göre hedef pencereyi buluyor. Pencere bulunduğunda o pencerenin ekran görüntüsünü alıyor ve bu görüntüyü OpenCvSharp Mat nesnesine çeviriyor. Ardından tüm ekran yerine sadece belirli bir arama alanında çalışıyor. Böylece performans ve doğruluk biraz daha kontrol altında tutuluyor.

Görüntü işleme tarafında iki temel renk grubu kullanıyorum. Birincisi nesnenin üzerinde bulunan yeşil/cyan benzeri damar ya da parlak detayları yakalamak için HSV aralığı. İkincisi ise nesnenin koyu gövdesini yakalamak için geniş bir koyu HSV aralığı. Önce görüntü HSV uzayına çevriliyor, sonra bu iki aralık için ayrı maskeler oluşturuluyor. Daha sonra bu maskeler üzerinde open, close, blur ve threshold işlemleri uygulanıyor. Son aşamada maskeler birleştirilip contour aranıyor.

Contour tarafında da ham şekilde seçim yapmıyorum. Her contour için alan, genişlik-yükseklik, aspect ratio, alt bölgede kalıp kalmama, üstteki yazı bandıyla çakışma durumu, önceden belirlediğim küçük metin bölgeleriyle örtüşme gibi birkaç filtre uyguluyorum. Sonrasında kalan adaylar için koyu piksel oranı, damar piksel oranı, bölgesel tercih skoru ve zamansal tutarlılık skoru hesaplayıp en iyi adayı seçiyorum.

Ayrıca tek karede bulunan şeyi direkt doğru kabul etmiyorum. Son birkaç tespitin merkezini kuyrukta tutuyorum. Eğer son merkezler birbirine yeterince yakınsa bunu “stabil tespit” olarak değerlendiriyorum. Yani sistemde hem görsel filtreleme hem de zamansal doğrulama var. Stabil aday bulunduğunda debug ekranında kutu, artı işareti ve merkez çiziliyor. Şu anki kod yapısında işlem uygulama tarafı da var ama asıl odak noktam burada tespit doğruluğunu artırmak.

Metinlerden etkilenmemek için ayrıca bir “pixelation” yaklaşımı kullandım. Ekranın üst tarafındaki genel yazı bandını ve örnek görsellere göre belirlediğim bazı küçük yazı bölgelerini analizden önce pikselleştiriyorum. Böylece bazı yazılar contour üretmesin istedim. Fakat bu yöntem çok sabit oranlara bağlı çalışıyor. Ekran oranı, kamera açısı, sahne yapısı veya yazının tam konumu değiştiğinde bu yaklaşım yetersiz kalıyor. Yani şu anki sistem metni gerçekten “anlamıyor”; sadece bazı bölgeleri körleştirerek sorunu azaltmaya çalışıyor.

Benim asıl geliştirmek istediğim nokta şu:

Bu yapıya ek olarak, ekrandaki belirli yazıları ya da yazı bölgelerini gerçekten bulabilecek nasıl bir işlev ekleyebilirim? Özellikle iki farklı yaklaşım arasında kararsızım:

Birincisi, OCR tabanlı bir yaklaşım kullanmak. Yani önce olası yazı bölgelerini tespit edip sonra OCR ile gerçekten hangi metnin geçtiğini kontrol etmek. Böylece belirli yazılar varsa o alanları tamamen dışlamak veya tersine, belirli metin görünüyorsa bunu ek bir doğrulama sinyali olarak kullanmak mümkün olabilir.

İkincisi ise OCR kullanmadan, sadece metin bölgesi tespiti yapmak. Mesela MSER, morphology, edge yoğunluğu, connected components veya stroke width benzeri yöntemlerle “burada yazı var” diyebilmek. Böylece sistem, sahnedeki yazı kutularını dinamik şekilde bulup bu alanları ignore edebilir.


Şu an kullandığım sistemin çalışmama nedeni bence: ben şu anda metni gerçekten tespit etmiyorum, sadece örnek görsele göre belli bölgeleri pikselliyorum. Bu da sahne değişince veya yazı başka yere kayınca yeterli olmuyor. Üstelik bazı durumlarda yazı rengi, nesnenin damar/koyu maske mantığına benzediği için yanlış aday da üretebiliyor.

Fakat tam aradığım şey, artık bu sabit pikselleme yerine gerçekten metni veya metin alanını bulup sisteme dahil etmek.

Bu konuda örnek yaklaşım, algoritma önerisi ya da mimari tavsiyesi olan varsa detaylı şekilde paylaşırsanız çok sevinirim.


Teşekkürler.
 

Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)

Geri
Üst