Haar Cascade ile Araba Tanıma



İlk hedefim hazır Haar Cascade xml dosyalarını kullanarak herhangi bir videoda geçen arabaların tespitini yapmak. Bunun için şu linkte bulmuş olduğum dosyayı kullandım.

Yazdığım kodu test etmek için de şu videoyu kullandım.

İlk olarak yapacağımız şey, tek ihtiyacımız olan kütüphane OpenCV'yi 'import' etmek:


Daha sonra CascadeClassifier objesi oluşturmalıyız. Cascade'ler bir filtre serisidir, bunlar arabayı tespit etmek için ardı ardına uygulanacak.


VideoCapture method'unu kullanarak videodan frame'leri yakalayıp, daha sonra oluşturulacak olan output.mp4 dosyasına yazmak için de işimize yarayacak olan fps değerini elde ettiğimiz frame'in yükseklik ve genişlik bilgilerinden bulup, saklıyoruz.


Elde ettiğimiz frameleri output'a yazdırmak için 'VideoWriter' objesi yaratıyoruz. (Bu şekilde sadece 'avi' uzantılı dosyalar yaratabiliriz, 'mp4' uzantısını desteklemiyor.) 'VideoWriter' objesini yaratmak için kullandığımız parametrelerin ilki output'a yazacağımız dosyanın ismi, ikincisinde ise FourCC kodu tanımlamamız gerekiyor. Açılımı 'Four character code' olan FourCC yazacağımız dosyanın formatını belirliyor. Bir çok FourCC kodu mevcut, fakat biz MJPG ile çalışacağız. Üçüncü parametre fps bilgisi, sonuncusu ise frame'in boyutunu içeriyor.


Artık videodan frame'leri alıp video sona erene kadar döngüyü döndürebiliriz.
ret, frame = cap.read() bu kod satırı ile videodan frame'leri çekiyoruz. 'ret', videonun son frame'i olup olmadığını anlamak için kullanılıyor ve boolean değer döndürüyor. Eğer 'ret' true ise 'while'da kalıyor, false ise döngüden çıkıp programı sonlandırıyor.  

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 kod satırı ile 'Viola-Jones' algoritmasını kullandığımız için her aldığımız frame'i gri tona çeviriyoruz.

cars = car_cascade.detectMultiScale(gray, 1.3, 5)
 
bu satırda ise detectMultiScale metodu 4 elemanlı tuple döndürecek. Bunlar arabanın bulunduğu çerçevenin başlangıç koordinatları(x,y), ve başlangıç noktasından çizilecek dikdörtgen için w(width), h(height) bilgileri. Bu satırın amacı verilen gray frame'de araba tespitinin yapılıp koordinatlarını döndürmesi. (Gray frame'in boyutunu 1.3 oranında küçültüp, verilen bölgede araba olup olmadığının tespiti için 5 pencereyle kontrolünü yapacak. Bu değerleri değştirebiliriz. Fakat frame'de nesne bulmak için kullanılan en çok kullanılan/ en iyi sonuç veren değerler.) 

Daha sonra for(x, y, w, h) in cars: döngüsünü kullanarak frame'de birden fazla araba varsa hepsini ayrı ayrı tespit edip dikdörtgen çizebileceğiz. Dikdörtgenleri ise cv2.rectangle(frame, (x,y), (x+w, y+h), (255,0,0), 2) kod satırı ile çizebiliyoruz.(Parametreleri kullanarak, renkli frame'e belirtilen koordinatlarda 2 pixel kalınlığında kırmızı dikdörtgenler çizdiriyoruz.)

Outputu görmek için cv2.imshow('Car Detection', frame), dosyaya kaydetmek için out.write(frame) kod satırlarını kullanıyoruz. While döngüsündeyken her frame'i işleyip gösteriyor ve dosyaya yazdırıyor. if cv2.waitKey(1) & 0xFF == ord('q'): break buradaysa 'q' ya basınca 'imshow'dan çıkıp programın sonlanmasını sağlıyoruz.


Aşağıdaki kod satırları ile açtığımız video dosyasını ve frame'leri kaydettiğimiz output dosyasını kapatıp, açılan pencereleri kapatıyoruz.


Kod için:
CarDetector.py




Yorumlar