Bu yazımda Python ve OpenCV kütüphanesi ile HoughLineP fonksiyonunu kullanarak Çizgi Tanımlama yardımıyla Roket Tespiti Yapacağız.
Bir süredir düşünüyordum OpenCV kütüphanesi çizgi tespiti özelliği ile değişik ne yapabilirim diye, daha sonra karadan havaya atılan roketlerin arkasında iz bıraktığı aklıma geldi.
Bu doğrultuda Roketin atış derecesi ve Hızını hesaplatabilirmiyim derken aslında daha geliştirilmesi gereken aşağıdaki gibi bir sonuç çıktı.
Ek olarak HoughLinesP’nin HoughLinesla olan farkına gelirsek HoughLines sistem tespit edilen tüm noktaları dikkate alark işlem yapar.
HoughLinesP’de ise sistem bir çizgi oluşturmak için gereken rastgele nokta miktarını dikkate alarak işlem yapar.
Kısaca nokta hüzmesinin tam bir çizgi oluşturması beklenmez onun yerine nokta hüzmesinin çizgi oluşturabilme ihtimali üzerine çalışır.
Sorularınız ve tavsiyeleriniz için yorum bölümünü kullanabilirsiniz.
Kodların ve Videonun Tamamına Şu Linkten Ulaşabilirsiniz : Github
Şimdi kodlarımızı adım adım inceleyebiliriz ;
1.Adım : Gerekli olan kütüphanelerimizi ekliyoruz :
1 2 3 4 5 |
# wwPHP.com Rocket Detection with Line Detection. import cv2; import numpy as np; import math; import time; |
2.Adım : Video Dosyamızı Açıyoruz :
1 2 3 |
cap = cv2.VideoCapture('wwPHPRocketDetection.mp4'); # Read Video File. while(cap.isOpened()): |
3.Adım : Videomuzu Kare Kare Okuyoruz :
1 2 |
# Capture Frame ret, frame = cap.read(); |
4.Adım : Resmimizi Üzerinde Tespit Yapabilmek İçin Gri Tonlamalı Olarak Yeniden Düzenliyoruz :
1 2 |
# Convert the frame to gray scale. gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY); |
5.Adım : Resmimiz Üzerinde Bulunan Kenarları Canny Fonksiyonu ile Tespit Ediyoruz :
1 |
edges = cv2.Canny(blur_gray, low_threshold, high_threshold); |
6.Adım : Resmimiz Üzerinde Bulunan Çizgileri Tespit Ediyoruz :
1 |
lines = cv2.HoughLinesP(edges, 1, (np.pi / 180), 15, np.array([]), 50, 20); |
7.Adım : Tespit Edeceğimiz Roketlerimiz İle İlgili Değişkenleri Tanımlıyoruz :
1 2 3 4 5 6 |
RocketLineCount = 0; #Detected Line Counts. RocketInfoArray = []; #This array in detected rocket lines information. RocketSpeed = 0; #Rocket Speed varible. yCoorArray = []; #Y Coordinates Array. RocketDegree = 1; #Rockets Degrees Varible. PixelsOneMeter = 50; #How much pixel in one meter ? |
8.Adım : Tespit Edilen Çizgilerimizi Döngüye Sokuyoruz ve Koordinatlarını Alıyoruz,
Bu koordinatlardan benim kullandığım video üzerinde kenarlarda istemediğim çizgiler olduğu için kenarlardan ve aşağıdan boşluk bırakıyorum :
1 2 3 4 5 6 |
for line in lines: for x1,y1,x2,y2 in line: #I give space around the edges. #Because my video has bad lines. if x1 > 80 and x2 < 1000: if y1 < 400 and y2 < 400: |
9.Adım : Roketimizin Bilgilerini Çok Boyutlu Dizide Tutacağım İçin İlk Boyutunu Oluşturuyoruz :
1 |
RocketInfoArray.append([RocketLineCount]); |
10.Adım : Tespit Edilen Roketin Kaç Derece İle Havalandığını Buluyoruz :
1 2 |
Radians = math.atan2(y2-y1, x2-x1); Degress = math.degrees(Radians); #I calculate rocket degree with this parameters. |
11.Adım : Tespit Edilen Roketin Bilgilerini Dizimize Ekliyoruz, Dizi Üzerinde Kat Ettiği Yolun Maksimum Zamanı İle Minimum Zamanını Bulup Hızını Hesaplatıyoruz :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#I'm adding the rocket information to the array. RocketInfoArray[RocketLineCount].append(str(y1)+"-"+str(y2)+"-"+str(x1)+"-"+str(x2)+"-"+str(Degress)+"-"+str(time.time())); #I increase by 1 for each line. RocketLineCount = RocketLineCount + 1; yCoorArray.append(y1); RocketDegree = RocketDegree + Degress; cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),4); MaxTime = float(RocketInfoArray[yCoorArray.index(max(yCoorArray))][1].split("-")[5]); MinTime = float(RocketInfoArray[yCoorArray.index(min(yCoorArray))][1].split("-")[5]); # I Calculate Rocket Speed : if MaxTime != 0.0 and MinTime != 0.0 and (MaxTime-MinTime) != 0.0: RocketTime = MaxTime-MinTime; Speed = ((max(yCoorArray)-min(yCoorArray))/PixelsOneMeter)*(1.0/RocketTime); if Speed > 0.0 : RocketSpeed = RocketSpeed + Speed; |
12.Adım : Birden Fazla Roket Oabileceği İçin Bunların Çıkış Noktasını Tek Varsayıyoruz ve Ortalama Havalanma Açılarını ve Hızlarını Hesaplatıp Ekranda Gösteriyoruz :
1 2 3 4 5 6 7 8 9 10 |
# I Calculate Rocket Speed and Degree Average. RocketsAverageSpeed = int(RocketSpeed/(RocketLineCount+1)); RocketsAverageDegree = int(RocketDegree/(RocketLineCount+1)); if RocketsAverageSpeed > 50 and RocketsAverageDegree > 10: print("Rockets Average Speed : " + str(RocketsAverageSpeed)+" km"); print("Rockets Average Degree : " + str(RocketsAverageDegree)); cv2.putText(img, "Rocket Detected !", (150, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (139,35,3), 2); lines_edges = cv2.addWeighted(img, 0.8, line_image, 1, 0); cv2.imshow("wwPHP Rocket Detection",lines_edges); |
Kodların Tamamına ve Videoya Yukarıdaki Github Linki Üzerinden Ulaşabilirsiniz.