OpenCV-Renk Alanı Değiştirme Ve Nesne Takibi

Hedefler:

Bu yazıda görüntü üzerindeki renkleri bir renk uzayından diğerine çevirmeyi(convert) öğreneceğiz.
Ek olarak bir objenin gerçek zamanlı olarak akan görüntü üzerinden ayrılması(extract) işlemini öğreneceğiz.
Kullanılacak Fonksiyonlar: cv2.cvtColor(), cv2.inRange()

Renk Alanlarını Değiştirme:

OpenCV içerisinde 150 den fazla renk uzayı değiştirme(convert) metodu bulunmakta. İlerleyen zamanlarda birçoğunu uygulamalarımız içinde kullanacağız. İş bu yazının konusu olan dönüştürme metodları ise BGR <-> Gray ve BGR <-> HSV metodlarından oluşmaktadır.
Renk dönüştürmek için cv2.cvtColor(input_image,flag) fonksiyonunu kullanacağız. "Flag" dönüşümümüzün(convert) çeşidine(type) karar verecek.
BGR -> Gray dönüşümü için cv2.COLOR_BGR2GRAY flag olarak seçiliyor. Benzer şekilde BGR -> HSV dönüşümü için ise cv2.COLOR_BGR2HSV flag olarak kullanıyoruz. Diğer flag'leri merak ediyorsanız. Aşağıdaki kod bloğunu python terminalinizden çalıştırmanız yeterli olacaktır.
>>> import cv2
>>> flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
>>> print flags

Nesne Takibi

Artık bir görüntüyü BGR'den HSV'ye nasıl çevirebileceğimizi biliyoruz. Şimdi bunu herhangi bir nesnenin rengini görüntü içinde ayırt etmek için nasıl kullanırızı göreceğiz. HSV renk uzayında renkleri ayırt etmek BGR'ye göre çok daha kolay olmakta. Ayrıntılı bilgi için web'de arama yapabilirsiniz. Uygulamamızda mavi renkli bir objeyi görüntüdeki diğer nesnelerden ayıracağız(extracting).

İşte Adımlar:

Video'nun her karesini yakala
Görüntülere BGR -> HSV işlemini uygula
Değer aralığını(range) belirlediğimiz nesneyi görüntüye threhold işlemini uyguladık.
Sonra mavi objemizi görüntüden ayırıyoruz(extracting)
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while(1):

    # Her görüntü çerçevesini(frame) yakala
    _, frame = cap.read()

    # BGR'yi HSV'ye çevir
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # HSV renk uzayında mavi renk oranını(range) ayarla
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # Görüntüde Mavi Objeye Threshold Uygula
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    # Orjinal Görüntüye Bitwise-AND İşlemini Uygula
    res = cv2.bitwise_and(frame,frame, mask= mask)

    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()
Bu yöntem nesne takibinin en basit yöntemi, ilerleyen zamanlarda çerçeveleri(countour) kullanarak merkez noktayı veya spesifik bir noktayı takip işlemini gerçekleştirebileceğiz.

Soru:
HSV renk uzayında renklerin değerlerini(range) nasıl öğrenebilirim?
Cevap:
Aşağıdaki örnekte yeşil renginin HSV değerlerinin nasıl bulunduğunu görüyoruz. Sizde bu yöntem yardımı ile ihtiyacınız olan değeri elde edebilirsiniz.
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
>>> print hsv_green
[[[ 60 255 255]]]

Kaynakça: http://docs.opencv.org/3.2.0/
Kaynak dosyaları ve Resimleri indirmek için: TIKLAYINIZ

0 yorum:

OpenCV- Plaka Tespiti Uygulaması

Cuma, Ekim 13, 2017 , , 4 Comments


Makinelerin yükselişi bir dip dalga ile beraber artarak sürmekte. Elbette bu yükselişi gerçekleştirmeleri için "Görü(Vision)" kavramının içinin doldurulması gerekmekte. Bu yazının konusunu ise; bilgisayarlı görünün ufak bir adımı olan tanımlama(recognition) oluşturmaktadır. Önceki derslerimizde OpenCV'nin fonksiyonlar üzerinden kullanımını gördük. Şimdi ise projemizi algoritma üzerinden anlatmaya çalışacağım.

Hedefler

Araç Üzerindeki Plakayı Bulma
Bulunan plaka görüntüsünü temizleme
Temizlenen Görüntünün Tanımlanması

Projemizin ana omurgasını iki görev oluşturmaktadır:
1. Muhtemel Plaka alanlarının tespit edilmesi.
2. Muhtemel Plaka üzerindeki karakterlerin tespit edilmesi


Görev 1: Plaka Alan Tespiti İşlem Basamakları:

a) Görüntüyü Al (imread)
b) Alınan Görüntüyü Gri'ye çevir (GrayScale)
c) Görüntü Alanındaki Muhtemel Karakterlerin Vektörel Tespiti
d) Plaka Bölgesini Kesip Görüntüden Ayır (ImageExtract)


Görev 2: Plaka Üzerindeki Karakterlerin Tespiti Ve Sınıflandırılması:

e) Muhtemel Plakanın Vektörel İz Düşümü
f) Görüntünün Treshold'u
g) KNN Verinin Yüklenmesi (Load&Train)
h) Karakter Eşleştirme (Matching)
i) Tanımlanan Plakanın Değerinin Döndürülmesi (imshow)


Algoritmamızdaki tüm bu adımları takip ettiğimizde aşağıdakine benzer bir çıktı almamız mümkün olmaktadır.


Kaynakça: http://doc.openalpr.com/

4 yorum:

Görüntü Üzerinde Aritmetik İşlemler

Pazar, Ekim 01, 2017 , , 0 Comments

Şekil-1 Görüntü Ekleme(Adding)
Kullanılan Sistem Özellikleri: Ubuntu 16.04 LTS, OpenCV 3.2, Python 3.5.2

Hedefler:

Görüntüler üzerinde toplama, çıkarma, bitwise işlemlerinin yapılması
Kullanılacak Fonksiyonlar: cv2.add() , cv2.addWeighted()

İki görüntüyü cv2.add() fonksiyonu yardımı ile birbirine ekleyebilirsiniz veya basitçe Numpy operasyonu ile direkt img = res1+res2 şeklinde ekleme yapabilirsiniz. Tabi görüntülerin derinikleri, tipleri aynı olmak veya ikinci resmin sadece skalar değerlerinin bulunması şartı ile.
OpenCV görüntü ekleme işlemi ile Numpy arasında farklılıklar bulunmaktadır.
OpenCV ile görüntü ekleme işleminde satürasyon bulunurken, Numpy da modulo operasyonu
yapılmaktadır.
Peki bu satürasyon ve modulo işlemleri ne demek oluyor??
-Matematiksel model olarak bakacak olursak sonuç olarak aşağıdaki işlemleri görürüz:

>>> a = np.uint8([250])
>>> b = np.uint8([10])
>>> print cv2.add(a,b) # 250+10 = 260 => 255
[[255]]
>>> print a+b          # 250+10 = 260 % 256 = 4
[4]
Görüntüler ile işlem yaptığımızda sonuçlar daha net görüntülenmiş olacaktır.

Görüntü Karıştırma(Blending)

Bu işlem aynı zamanda görüntü ekleme(adding) işlemidir. İşlem sırasında farklı oransal ağırlıklar(weights) verilerek, görüntüde şeffaklık(transpency) ve karışma(blending) hissi verilir. Görüntüler aşağıdaki matematiksel denkleme göre eklenir.

Alfa değişkeni 0 ile 1 arasında değiştirilerek istenilen geçiş sağlanılabilir.
Örneğimizde birinci görüntünün değişkeni olarak 0.8 atamasını yaptım, ikincisinin ağırlık değeri olarak ise 0.2 değerini atadım. Takip eden denklemdeki işlemleri gerçekleştirmiş olduk.

 Gama değeri sıfır olarak atandı.
İş bu denklemleri bilgisayarımızın anlayacağı dile çevirirsek:
img1 = cv2.imread('ml.png')
img2 = cv2.imread('opencv-logo.png')

# Görüntünün Karıştırma(Blending) İşlemi:
dst = cv2.addWeighted(img1,0.8,img2,0.2,0)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
Şekil-1 dekine benzer bir çıktı almalısınız.


Bitwise İşlemleri

Bu kısımda mantıksal AND, OR, NOT, XOR işlemlerini öğreneceğiz. Görüntünün herhangi bir bölümünü çıkarırken, dikdörtgen olmayan ROI çıkarırken veya bu ve buna benzer birçok işlemde çok kullanışlı olduklarını göreceğiz. Aşağıda herhangi bir görüntünün belirli bir kısmının nasıl değiştirileceğini göreceğiz.
# İki Görüntü Yükle:
img1 = cv2.imread('messi5.jpg')
img2 = cv2.imread('opencv-logo.png')
# Sol Üst Köşeye Görüntüyü Yerleştirmek İstiyoruz:
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# Şimdi Bir Maske Oluşturuyoruz, Ve O Maskenin Tersini Oluşturuyoruz:
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# ROI Üzerindeki Siyah Bölge İçin:
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
# Görüntü Bölgesinin Alımı:
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)
# Ana Resmi İşliyoruz:
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
Sonuçlar aşağıdakine benzer şekilde görüntülenecektir. İyi Eğlenceler
Kaynakça: http://docs.opencv.org/3.2.0/
Kaynak dosyaları ve Resimleri indirmek için: TIKLAYINIZ

0 yorum: