Kaynak kodlar (C#) için: | tıklayınız |
Son yazdığım 2 kütüphanenin nerelerde kullanılabileceğine ilişkin iyi bir örnek olacağını düşünerek C# ile bir araç plakası konum tespit uygulaması hazırladım.
Programda çeşitli parametrelere verdiğim değerler, birkaç araba resmi üzerinde yaptığım ölçümlere dayanıyor. Normalde en uygun değerler yüzlerce araba resmi üzerinde yapılan testler sonucunda elde edilir ama elimde o kadar görüntü yok. Zaten elimdekilerini de google görsellerinden aldım...
Programın kullandığı kütüphaneler ile ilgili daha fazla bilgi için:
Yöntemler ile ilgili daha fazla bilgi için:
Aşağıdaki resimler görüntülerin adım adım hangi işlemlerden geçirildiğini gösteriyor:
1. Orjinal görüntü |
2. Gri görüntü |
3. Filtreli görüntü(Gabor ile) |
4. Eşiklenmiş ikili görüntü |
5. Yatayda genişletilmiş görüntü |
6. Etiketlenmiş bileşenler |
Her pixelin ana renklerinin ortalaması alınarak((r+g+b)/3) pixeller gri seviyeye indirgenebilir.
Bu işlem GaborFiltresi.dll kütüphanesi tarafından yapılır. Görüntüdeki dik ayrıtlar dışındaki tüm ayrıtlar gabor filtresi ile filtrelenir. Böylece yataya dik ve dike yakın açılar yapan ayrıtlar elde edilir. Görüntüler üzerinde dik ayrıtların en yoğun olduğu bölgeler plaka karakterlerinin bulunduğu bölgelerdir. Yoğunluğun tespiti ileriki adımlarda yapılır. Programda gabor filtresi kütüphanesine gönderilen parametreler; yönelim açısı 90, faz açısı 0, en/boy oranı 0.9, band genişliği 1, standart sapma 0(0 değeri standart sapmanın kütüphane tarafından hesaplanmasını sağlar), dalga boyu 4.
Görüntü sabit bir eşik değeri ile eşiklenerek ikili biçime dönüştürülür. Programda kullanılan eşik değer; 70.
Elde edilen ikili görüntü yatay doğrultuda genişletilir. Programda hem ikili seviyeye dönüşüm hem de genişletme işlemleri .NET'in Graphic sınıfından yararlanılarak gerçekleştirilmiştir. İkili seviye dönüşümü için basit bir eşikleme yapılmış, genişletme işlemindeyse görüntü üzerinde rastlanan her bir beyaz pixel için, pixeli orta nokta kabul eden 16 pixel genişliğinde yatay çizgiler çizilmiştir.
resim = new Bitmap(genislik, yukseklik); Graphics grafik = Graphics.FromImage(resim); Pen kalem = new Pen(Brushes.White); grafik.Clear(Color.Black); for (y = 0; y < yukseklik; y++) for (x = 0; x < genislik; x++) if (gPixeller[y * genislik + x] > esik) // gPixeller[]: gabordan geçmiş gri pixel dizisi grafik.DrawLine(kalem, x - genisletmeMiktari, y, x + genisletmeMiktari, y);
Bu işlem BaglantiliBilesenEtiketleme.dll kütüphanesi tarafından yapılır. Görüntüdeki bileşenler bağlantılı bileşen etiketleme yöntemi ile etiketlenir. Böylece koordinatlarının tespiti kolaylaşır.
Bu işlem de BaglantiliBilesenEtiketleme.dll kütüphanesi tarafından yapılır. Her bir etiketlenmiş bileşenin en sol-üst ve en sağ alt pixellerinin konumu tespit edilir. Bu değerler kullanılarak en ve boy bilgileri hesaplanır.
Elde edilen bileşenlerin tümü plakalara ait değildir. Bileşenlerin en ve boy değerleri plakaOlabilirMi() fonksiyonuna yollanır ve burada basit bir en/boy oranı kontrolünden geçirilir:
private bool plakaOlabilirMi(int en, int boy) { if (boy < 5) return false; // Aşağıdaki oranı ve tölerans değerini birkaç plaka örneğini deneyerek buldum. // Bu yüzden bu yöntem tüm plaka konumlarının tespit edilmesini sağlayamayabilir. if (Math.Abs((float)en / boy - 4.5) < 2 && en > 40) return true; return false; }
Plaka sağa veya sola eğimli olabileceği için en/boy oranına +-2 kadarlık fark töleransı tanınmalıdır. Ayrıca farklı oranlarda plakalar da kullanıldığından, bu fonksiyona farklı değerler eklenerek farklı oranlara sahip plaka tiplerinin de doğrulanması sağlanabilir...
Faydalı yazı, tebrikler. İşime çok yaradı.
Merhaba. Zamaninizi ayirip bunlari yazdiginiz icin tesekkur ederim.
Bir sorum olacakti. Bu yukaridaki islemlerin uygulandigi resimleri ben kendim programi calistirarak her islemden sonra resmi kayd etmek istiyorum. Bunu nasil yapa bilirim? Tesekkurler.
Görüntüyü kaydetmek istediğiniz aşamada Save() fonksiyonunu kullanabilirsiniz:
Örnek: resim.Save(@"C:\resim1.bmp");
Merhaba. Uğraşmakta olduğum projede aracın plaka konumunu tespit etmem gerekiyor. Bağlantılı bileşen etiketleme kütüphanenizi indirdim ancak projeme ekleyemiyorum hata veriyor uğraşmama rağmen.Acaba kütüphane içindeki konum tespit metodunuzun kodlarına nasıl ulaşabilirim ? Yardımcı olursanız çok sevinirim.
İndirdiğiniz dosyanın içinde örnek kodlar vardı aslında. Yine de kütüphanenin kodlarını bulabilirsem atarım.
merhaba hocam güzel bir iş çıkarmışsınız tebrikler. Benim bir sorum olacaktı zaman ayırıp cevap verirseniz çok sevinirim, ben ayrıca plakadaki karakterleri de okumak istiyorum nasıl yapabilirim, hangi yöntemleri kullanabilirim yani tam olarak nasıl bir yol izlemem gerekiyor ?
Merhaba,
İnternette OCR şeklinde bir arama yaparsanız detaylı bilgi edinebilirsiniz. Konuyla ilgili pek çok yöntem var. Açık kaynak kodlu kütüphaneler de mevcut. Mesela Tesseract ünlüdür, kullanabilirsiniz.
Siteniz çok güzel
Hocam selamlar. ben bu plaka tespit programını kuramadım. yardımcı olma şansınız var mı
Bu bir örnek bu aslında. İndirip Visual Studio ortamında derlemeniz gerekiyor. Ama program, kayıp arabaların yerini plaka ile bulan bir program olarak algılanıyor. Böyle bir amaçla kullanmayı düşünüyorsanız, bu porgram böyle bir işleve sahip değil.
Hocam emeğinize sağlık ben kuramadım yardımcı olabilirmisiniz
İndirdiğiniz dosyada kaynak kodlar mevcut. bin klasörünün içinde derlenmiş hali var onu kurulum yapmadan çalıştırabilirsiniz.