21 Ocak 2017 Cumartesi

OPENCV PYTHON İLE ARAÇ SAYMA

    Bu projede araç sayma işlemi yapılmıştır. Yapılan işlem akıllı trafik sistemlerine uygulanabilir.





    Yapılacak işlemlerden ve algoritmadan bahsedelim.Öncelikle videodaki arabaları bulmamız gerekmektedir.Araba bulmak için iki farklı yöntem uygulayabiliriz.

  1. Haarcascade sınıflandırıcısı ile araç bulma
  2. Arka plan çıkarma yöntemi ile araç bulma

Haarcascade sınıflandırıcısı: pozitif ve negatif resimlerin bilgilerinden oluşan "xml" uzantılı bir belgedir.Pozitif resimler videoda aranan nesneleri,negatif resimler ise aranmayan nesneleri temsil eder. 

Arka Plan Çıkarma:Videoda değişen piksellerin yerini belirler ve videodan ayrıştırır.

    Biz bu projede derleme hızı açısından daha hızlı olacağı ve cascade sınıflandırıcısı oluştururken yaşanacak vakit kaybı nedeniyle arka plan çıkarma yöntemi ile yaptık.

Algoritmayı anlatacak olursak;

  1. Video okunur.
  2. Arka plan çıkartılır.
  3. Kontürler bulunur.
  4. Kontür alanı bulunur ve alanın koordinatları bulunur
  5. Kontür alan parametreleri ile karşılaştırılır.(bu aşama diğer hareket eden nesneleri araç olarak saymaması için yapılır.)
  6. Kontür koordinatları belirli bir koordinat değerinden geçerse sayaç bir arttırılır.

    Arka plan çıkarma yöntemi uyguladıktan sonra kontürleri bulma nedenimizi ise şu şekilde açıklayabiliriz. Herhangi bir videoya arka plan çıkarma uyguladığınızda hareketli nesnenin beyaz geri kalan bölgelerin ise siyah olduğunu görürüz.



    Kontür işleminin tanımına baktığımız zaman aynı renk veya yoğunluğa sahip olan tüm kesintisiz noktaları (sınır boyunca) birleştiren bir eğri olarak basitçe açıklanabilir. yani videomuzda ki beyaz pikselleri hiyerarşik bir yapıya aktarır. Ve böylece araç alanını rahatça belirleyip belirli parametrelerle karşılaştırmamızı sağlar.

    KOD:

import cv2
import numpy as np


backsub = cv2.createBackgroundSubtractorMOG2()
capture = cv2.VideoCapture("video.avi")

sayac=0

if capture:

  while True:

    ret, frame = capture.read()

    if ret:
        fgmask = backsub.apply(frame, None, 0.01)
        cv2.line(frame, (50, 0), (50, 300), (0, 255, 0), 2)
        cv2.line(frame, (70, 0), (70, 300), (0, 255, 0), 2)


        im,contours, hierarchy = cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL,                                           cv2.CHAIN_APPROX_NONE)
        try: hierarchy = hierarchy[0]
        except: hierarchy = []
        for contour, hier in zip(contours, hierarchy):
            (x,y,w,h) = cv2.boundingRect(contour)
            if w > 40 and h > 40:
                cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
                if x>50 and x<70:
                    sayac+=1                    print(sayac)

        cv2.putText(frame,"Araba: "+str(sayac), (220, 20), cv2.FONT_HERSHEY_SIMPLEX,                    0.6, (0, 0, 0), 2)

        cv2.imshow("Takip", frame)
        cv2.imshow("Arka Plan Cikar", fgmask)



    key = cv2.waitKey(60)
    if key == ord('q'):
            break
capture.release()
cv2.destroyAllWindows()

    Kodumuzu inceleyecek olursak;

    Arka plan çıkarma ve kontür işlemlerinden geçen videonun kontür parametreleri bulunur ve bulunan araç kare içine alınır.Bulunan kontür alanının eni ve boyu 40dan büyük ise araç olarak saptanır. ve videonun x=50 ve x=70 koordinatları arasındaki bölgeden geçerse sayac bir arttırılır.

SONUÇ:



Örnek kod ve video indirmek için tıklayın.
     

5 yorum:

  1. projeyi çalıştırdığımda birden fazla şeyi araba olarak seçiyor bunu nasıl önleyebilirim? Sayfanızı takip edeceğim. Yorumlarsanız sevinirim. Başarılar dilerim.

    YanıtlaSil
  2. Bu kod videoya özel olarak tasarlanmıştır fakat konturların x,y,w,h parametrelerini kısıtlayarak daha doğru sonuç alabilir veya kontur bulmadan önce alçak geçiren filtreden geçirip frameleri gürültüden kurtarabilirsiniz.En son resimde gözüken yeşil iki çizgiyi kesen belirttiğiniz boyuttaki nesneleri saymaktadır.Çizgi koordinatlarınızın kullandığınız videoda sadece yolu kapsadığına dikkat edin.
    Bu kod çok profesyonel bir çalışma değildir. fakat daha doğru sonuç istiyorsanız KNN gibi Machine learning ile eğitim yapabilir veya HaarCascade sınıflandırıcısı ile yapabilirsiniz. Yakında KNN ve Cascade konularına da değineceğim.Kolay gelsin.

    YanıtlaSil
  3. Öncelikle kod için teşekkür ederim. Bu uygulamayı akılı kavşak uygulaması için kullanırken sinyalizasyon sistemi ile haberleşmesini nasıl gerçekleştirebiliriz?

    YanıtlaSil
  4. merhaba ben haarcascade kodlarını bir türlü indiremiyorum yardımcı olabilir misiniz?

    YanıtlaSil
    Yanıtlar
    1. Merhaba Bu kod haarcascade sınıflandırıcısı ile çalışmamaktadır kontur işlemi ile araç bularak saymaktadır.

      Sil