Python Eye Blinker

Python Eye Blinker

Şbt 22, 2024 - 17:21
Eki 17, 2024 - 00:56
 0  204
Python Eye Blinker
Python Eye blinker
import cv2
import dlib
from imutils import face_utils
from scipy.spatial import distance

def eye_aspect_ratio(eye):
    # Göz oranını hesapla
    A = distance.euclidean(eye[1], eye[5])
    B = distance.euclidean(eye[2], eye[4])
    C = distance.euclidean(eye[0], eye[3])
    ear = (A + B) / (2.0 * C)
    return ear

EAR_THRESHOLD = 0.3  # Göz oranı eşiği
EAR_CONSEC_FRAMES = 3  # Göz kırpma tespiti için gereken çerçeve sayısı

# Dlib'den yüz belirleyici yükle
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

# Sol ve sağ göz için belirleyici indeksleri tanımla
(lstart, lend) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"]
(rstart, rend) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]

# Video akışını başlat
vs = cv2.VideoCapture(0)
blink_count = 0  # Göz kırpma sayısını tut
blink_flag = False  # Göz kırpma bayrağı

while True:
    ret, frame = vs.read()  # Videodan bir çerçeve oku
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # Çerçeveyi gri tonlamaya çevir

    # Çerçevede yüzleri tespit et
    faces = detector(gray, 0)

    for face in faces:
        shape = predictor(gray, face)  # Yüz noktalarını tahmin et
        shape = face_utils.shape_to_np(shape)

        # Gözlerin koordinatlarını al
        left_eye = shape[lstart:lend]
        right_eye = shape[rstart:rend]

        # Sol ve sağ göz için göz oranını hesapla
        left_ear = eye_aspect_ratio(left_eye)
        right_ear = eye_aspect_ratio(right_eye)

        # Ortalama göz oranını hesapla
        average_ear = (left_ear + right_ear) / 2.0

        # Gözlerin dış hatlarını çiz
        left_eye_hull = cv2.convexHull(left_eye)
        right_eye_hull = cv2.convexHull(right_eye)
        cv2.drawContours(frame, [left_eye_hull], -1, (0, 255, 0), 1)
        cv2.drawContours(frame, [right_eye_hull], -1, (0, 255, 0), 1)

        # Göz kırpma tespiti
        if average_ear < EAR_THRESHOLD:
            if not blink_flag:  # Göz kırpma başladığında
                blink_count += 1  # Göz kırpma sayısını artır
                blink_flag = True  # Göz kırpma bayrağını ayarla
        else:
            blink_flag = False  # Göz açık olduğunda bayrağı sıfırla

    # Göz kırpma sayısını çerçeveye yaz
    cv2.putText(frame, "Hareketler: {}".format(blink_count), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)

    # Çerçeveyi göster
    cv2.imshow("Frame", frame)

    # 'q' tuşuna basılırsa döngüyü kır
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Kaynakları serbest bırak
vs.release()
cv2.destroyAllWindows()

Kodun Açıklaması:

  1. Kütüphaneler:

    • cv2: OpenCV kütüphanesi, görüntü işleme için kullanılır.
    • dlib: Yüz tespiti ve yüz noktaları için kullanılır.
    • face_utils: Yüz noktalarını numpy dizisine dönüştürmek için kullanılır.
    • distance: İki nokta arasındaki mesafeyi hesaplamak için kullanılır.
  2. eye_aspect_ratio Fonksiyonu:

    • Göz oranını (EAR) hesaplar. Bu, gözün açılıp kapanmasını tespit etmek için kullanılır.
  3. Sabitler:

    • EAR_THRESHOLD: Göz oranı eşiği; bu değer altında göz kırpma olarak kabul edilir.
    • EAR_CONSEC_FRAMES: Göz kırpma tespitinin kararlılığı için gereken çerçeve sayısı.
  4. Yüz ve Göz Tespiti:

    • detector ve predictor ile yüz tespiti ve yüz noktalarının tahmini yapılır.
  5. Video Akışı:

    • cv2.VideoCapture(0): Kamera açılır ve video akışı başlatılır.
    • Sonsuz döngüde her bir çerçeve okunur, gri tonlamaya dönüştürülür ve yüzler tespit edilir.
  6. Göz Kırpma Tespiti:

    • Tespit edilen yüzlerdeki göz noktaları alınır ve göz oranları hesaplanır.
    • Eğer ortalama göz oranı eşiğin altındaysa göz kırpma sayısı artırılır.
  7. Sonuçların Görselleştirilmesi:

    • Gözlerin dış hatları çizilir ve toplam göz kırpma sayısı ekrana yazdırılır.
  8. Döngüden Çıkış:

    • 'q' tuşuna basıldığında döngü sonlandırılır ve kaynaklar serbest bırakılır.

Bu kod, yüz ve göz tespiti yaparak göz kırpma sayısını sayan bir sistem oluşturur.