Önceki makalelerimde Python ve OpenCV kullanarak farklı ve basit görüntü işleme uygulamaları geliştirmiştim. Bu makalemde benzer görüntü işleme teknikleri kullanarak yön işaretlerinin hangi yönü gösterdiğini ses ile kullanıcıya bildiren bir uygulamanın nasıl geliştirileceğini anlatmaya çalışacağım.

Kodlara göz atmadan önce algoritmamızın adımları şu şekilde olacaktır:

  1. Kamerayı aç
  2. Gelen Frame'a Threshold (kenar çıkarımı) uygula
  3. Thresold görüntüden şekilleri tespit et
  4. Tespit edilen şekillerleri bir döngü yardımıyla tek tek incele
  5. Şekillerden yön işaretini bul
  6. Yön işaretinin hangi yönü gösterdiğini tespit et
  7. Kullnıcıya sesli uyarı gönder.

Şimdi kodları yukarıdaki adımları tek tek uygulayarak yazmaya başlayabiliriz.

Kamerayı açalım Frame'i gri göntüye çevirip gürültüleri azaltmak için GaussianBlur uygulayalım ve gelen Frame'e kenar çıkartımı uygulayalım.
 

import cv2

cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()

    genislik = frame.shape[0]
    yukseklik = frame.shape[1]

    griGoruntu = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gaussBlur = cv2.GaussianBlur(griGoruntu,(5,5),0)
    kenarCikartim = cv2.threshold(gaussBlur, 127, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)[1]


Şimdi elimizde tamamen siyah-beyaz kenar çıkartımı yapılmış bir Frame var. Bu Frame'deki şekilleri tespit etmek için:

    sekiller = cv2.findContours(kenarCikartim,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[1]

Elde ettiğimiz şekilleri tek tek incelemek için

    if len(sekiller) > 0:
        for c in sekiller:

Bulduğumuz her bir şekli inceleyip 7 köşeli bir yön işaretini tespit etmek için:
 

            alan = cv2.contourArea(c)

            epsilon = 0.01*cv2.arcLength(c,True)
            approx = cv2.approxPolyDP(c,epsilon,True) 
            
            if alan > 100 and alan < (genislik*yukselik-1) and len(approx == 7):
                
                M = cv2.moments(c)
                cx = int(M['m10']/M['m00']) //şeklin orta noktasının x koordinatı
                cy = int(M['m01']/M['m00']) //şeklin orta noktasının y koordinatı
             
                cv2.drawContours(frame, [c], 0, (0, 255, 0), 2) //şeklin kenarlarını çizdik
                cv2.circle(frame, (cx, cy), 7, (255, 0, 0), -1) //orta noktasını işaretledik

ve son olarak tespit ettiğimiz yön işaretinin yönünü şeklin üzerine yazdırmak için:
 

                    sekilYonu = ""
                    if approx[0][0][0] < cx:
                        sekilYonu = "SOL"
                    else:
                        sekilYonu = "SAG"

                cv2.putText(frame, "sekilYonu", (cx-5, cy-5),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2)

ve sonuç olarak ekranda görüntülemeyi veya programı sonlandırmak için

    cv2.imshow('frame',resim)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break  
    
cap.release()
cv2.destroyAllWindows()