Python OpenCV ile Plaka Tanıma (Plate Recognition) Basit
Python, nesne yönelimli, yorumlamalı, birimsel ve etkileşimli yüksek seviyeli bir programlama dilidir.
OpenCV gerçek-zamanlı bilgisayar görüsü uygulamalarında kullanılan açık kaynaklı kütüphane. İlk olarak Intel tarafından geliştirilmiş, daha sonra Willow Garage ve sonra Itseez tarafından sürdürüldü. Bu kütüphane çoklu platform ve BSD lisansı altında açık kaynaklı bir yazılımdır.
Öncelikle bu projede size information (bilgi) sağlamayacağım daha çok proje odaklı anlatım sağlayacağım.
Kodları yazının sonunda paylaşacağım.
Proje Hakkında Genel Bilgi
Başlıkta da belirttiğimiz gibi Basit olduğu için Çerçeve alarak OCR(Optik Karakter Tanıma) tarama işlemi yapacağız.
- Plaka Algılama: İlk adım, araçtan plakayı algılamaktır. Dikdörtgen nesneleri tespit etmek ve plakayı bulmak için OpenCV’deki “Contour” seçeneğini kullanacağız. Plakanın tam boyutunu, rengini ve yaklaşık konumunu bilebilirse doğruluk oranı arttırılabilir. Normalde algılama algoritması, kameranın konumuna ve o ülkede kullanılan plaka türüne göre eğitilir. Ama resimde araba yoksa, bu durumda daha da zorlaşır, bu durumda aracı ve ardından plakayı tespit etmek için ek bir adım atacağız.
- Karakter Segmentasyonu: Araç Plakasını bulduktan sonra onu Çerçeveye alıp yeni bir resim olarak kaydetmemiz gerekir. Yine bu, OpenCV kullanılarak kolayca yapılabilir.
- Karakter Tanıma: Şimdi, önceki adımda elde ettiğimiz yeni görüntünün üzerinde bazı karakterler (Sayılar / Alfabe) yazılı olduğundan emin olun. Böylece, numarayı algılamak için üzerinde OCR (Optik Karakter Tanıma) gerçekleştirebiliriz.
Yapacağımız OCR taramayı Tesseract üzerinden inceleyelim :
Yaptığımız taramadan sonra image processing işlemi yardımıyla çerçevelerimizdeki alfabe tespitini kütüphane yardımıyla gerçekleştiriyoruz.
Kullanacağımız Kütüphaneler
- cv2 : (eski OpenCV sürümlerindeki eski arayüz cv olarak adlandırılırdı), OpenCV geliştiricilerinin bağlama oluşturucuları oluştururken seçtikleri addır.
- imutils : çeviri, döndürme, yeniden boyutlandırma, iskeletleştirme ve Matplotlib görüntülerini OpenCV ve hem Python 2.7 hem de Python 3 ile görüntüleme gibi temel görüntü işleme işlevlerini kolaylaştıran bir dizi kolaylık işlevidir.
- numpy as np : Python programlama dili için bir kütüphane olup, büyük, çok boyutlu diziler ve matrisler için destek eklerken, bu dizilerde çalışmak için yüksek düzeyli matematiksel fonksiyonların geniş bir koleksiyonudur.
- pytesseract : çeşitli işletim sistemleri için geliştirilen özgür bir optik karakter tanıma (OCR) motorudur. (Wikipedia)
Projemizi Kodluyoruz
Tesseract uzantıyı da tanımlamamız gerekiyor :
imread resim okuma ile resmimizi uzantısı ile aldık ardından 600x400 resize fonksiyonu ile çerçeveledik
Sözdizimi: cv2.imread (path, flag)
Parametreler:
- path: Okunacak görüntünün yolunu temsil eden bir dize.
- flag: Görüntünün nasıl okunması gerektiğini belirtir. Varsayılan değeri cv2.IMREAD_COLOR şeklindedir
- Return Value: Bu yöntem, belirtilen dosyadan yüklenen bir görüntüyü döndürür.
Çerçevemizi grayscale işlemine tabi tutuyoruz ve Bilateral filter yani :Her pikselin yoğunluğunu, yakındaki piksellerden gelen ağırlıklı ortalama yoğunluk değerleriyle değiştirir.
Sözdizimi: cv2.cvtColor (src, kod [, dst [, dstCn]]) Parametreler:
- src: Renk alanı değiştirilecek görüntüdür.
- code: Renk alanı dönüşüm kodudur.
- dst: src görüntüsü ile aynı boyut ve derinlikteki çıktı görüntüsüdür. İsteğe bağlı bir parametredir.
- dstCn: Hedef görüntüdeki kanal sayısıdır. Parametre 0 ise, kanalların sayısı otomatik olarak src ve koddan türetilir. İsteğe bağlı bir parametredir.
- Return Value: Bir görüntü döndürür.
bilateralFilter (src, dst, d, sigmaColor, sigmaSpace, borderType)
Bu yöntem aşağıdaki parametreleri kabul eder
- src — Bu işlem için kaynağı (giriş görüntüsü) temsil eden bir Mat nesnesi.
- dst — Bu işlem için hedefi (çıktı görüntüsü) temsil eden bir Mat nesnesi.
- d — Piksel mahallesinin çapını temsil eden tür tamsayısının bir değişkeni.
- sigmaColor — Renk uzayındaki filtre sigmasını temsil eden tam sayı türünde bir değişken.
- sigmaSpace — Koordinat alanında filtre sigmasını temsil eden tam sayı türünde bir değişken.
- borderType — Kullanılan kenarlığın türünü temsil eden bir tamsayı nesnesi.
Ardından şekil algılama ve Canny detector kullanacağız. Canny Yöntemi : görüntülerdeki çok çeşitli kenarları algılamak için çok aşamalı bir algoritma kullanan bir kenar algılama operatörüdür.
canny (radius, sigma, lower_percent, Upper_percent)
Parametreler: Bu işlev, yukarıda belirtildiği ve aşağıda tanımlandığı gibi iki parametreyi kabul eder:
- radius: Bu parametre, gauss filtresinin yarıçapını saklar.
- sigma: Bu parametre, gauss filtresinin standart sapmasını saklar.
- lower_percent: Normalleştirilmiş alt eşiği saklayan bu parametre.
- Upper_percent: Normalize edilmiş üst eşiği saklayan bu parametre.
- Return Value: Bu işlev Wand ImageMagick nesnesini döndürür.
Açık eğrisi meydana getirmek için cv2.approxPolyDP
Ark boyu (Arc length)
Şekilden sonuç elde edip etmediğimizi kontrol ediyoruz. screenCnt değişkenimizde veri yoksa detected yani kontrol değerimiz=0 olacak.
Daha sonra eğer şeklimizi tesbit edebildiysek yeni bir if bloğuna alıp şeklimizi çizdirmek üzere drawCounters fonksiyonuna aktarıyoruz.
drawContours: aşağıda bahsedeceğiz.
Numpy.zeros () işlevi, verilen şekil ve türde sıfırlarla yeni bir dizi döndürür. Sözdizimi:
Parametreler:
- Shape: tam sayı veya tam sayı dizisi
- Order: C_contiguous veya F_contiguous Bellekte C-bitişik sıra (son dizin en hızlı değişir) C sırası, dizide satır artışının çalıştırılmasının biraz daha hızlı olacağı anlamına gelir Bellekte FORTRAN-bitişik sıra (ilk dizin en hızlı olanı değiştirir). F sırası, sütun bazlı işlemlerin daha hızlı olacağı anlamına gelir.
- dtype: [isteğe bağlı, float (byDeafult)] Döndürülen dizinin veri türü.
cv.drawContours işlevi sınır noktalarına sahip olmanız koşuluyla bir şekli çizmek için de kullandık.
OpenCV ile maskeleme yapmak için cv2.bitwise_and () kullandık.
X ve Y koordinatları üzerinden yukarıda yaptığımız maskelemeyi gray scale biçiminde kırpma işlemini yaptık .
pytesseract ile kırptığımız resmi yukarıda bahsettiğimiz OCR tarama işlemi ile yazıya çeviriyoruz. resmimizi 500x300 olarak arabayı çerçeveleme yapıyoruz ardından 400x200 ile plakamızı çerçeveledik.
imshow yani resim çerçevesini görüntüleme yöntemi ile hem araba hem plaka çerçevesini ekrana çıkarıyoruz.
Programımızı çalıştırdık ve çıkan çerçeveler Araba ve Kirpildi olarak erkana geldi
Kütüphanelerimiz yardımıyla hem araba hemde plakayı tanımlayıp kırpma işlemi yapıldı.
OCR tarama ile plakamız resimden yazıya çevrildi.
KODLAR için tıklayın