import cv2 import tkinter as tk from PIL import Image, ImageTk import winsound import threading # Threading modülünü ekliyoruz # Yüz tanıma için Haar Cascade sınıflandırıcılarını yükle face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') # Kamera başlat cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FPS, 60) # Kamera çözünürlüğünü ayarla cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) # Genişlik: 920 piksel cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 160) # Yükseklik: 720 piksel # Tkinter penceresi oluştur root = tk.Tk() # Pencerenin boyutlarını window_width = 300 window_height = 200 # Pencereyi ekranın sol üst köşesinden 100 piksel sağa ve 100 piksel aşağıya yerleştir x_position = 47 y_position = 34 # Pencereyi konumlandır root.geometry(f"{window_width}x{window_height}+{x_position}+{y_position}") # Pencerenin üst kısmındaki başlık çubuğunu gizle root.overrideredirect(True) # Pencereyi her zaman üstte tut root.attributes("-topmost", True) # Alarm fonksiyonu (separat bir thread ile çalışacak) def play_alarm(): winsound.Beep(750, 100) # 1000 Hz frekansta 500 ms'lik bir beep sesi çalar # Alarm çalma işlemi için yeni bir thread başlatan fonksiyon def alarm_thread(): threading.Thread(target=play_alarm).start() # **Kritik Yükseklik Çizgisi** - Sabit bir yükseklik değeri critical_height = int(window_height * 0.90) # Çizgi, pencerenin %95'inde olacak # Alarm durumu kontrolü için global değişken alarm_triggered = False # Kamera görüntüsünü sürekli olarak Tkinter penceresinde göster def update_frame(): global alarm_triggered # Alarm durumunu global olarak kullanacağız ret, frame = cap.read() if ret: # Yüz tanıma işlemi gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) # Alarm çalmaya karar verecek iki durum: if len(faces) > 0: # Yüzün ilk tespit edilen koordinatlarını al (x, y, w, h) = faces[0] # Yüzün boyutunu hesapla face_size = w * h # Yüz boyutunu sadece binler basamağını göstermek için 1000'e böl ve tam sayı olarak al face_size_display = face_size // 1000 # Binler basamağına yuvarla color = (0, 255, 0) # Varsayılan renk (yeşil) # Yüzün boyutu 220,000'den büyükse alarm çalar if face_size > 20000: color = (0, 0, 255) # Kırmızı alarm_triggered = True # Alarm çalmasını tetikle alarm_thread() # Alarm çalma thread'ini başlat # Yüzün etrafına bir kare çiz cv2.rectangle(frame, (x, y), (x + w, y + h), color, 2) # Yüzün boyutunu sadece binler basamağını göster font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(frame, f"Size: {face_size_display}", (x, y - 10), font, 0.6, color, 2, cv2.LINE_AA) # Yüzün ortasını hesapla face_center_y = y + h // 2 # Yüzün dikey ortası # Yüzün ortası çizginin altına inerse alarm çalar if face_center_y > critical_height: alarm_triggered = True # Alarm çalmasını tetikle alarm_thread() # Alarm çalma thread'ini başlat # **Kritik Yükseklik Çizgisini Çizme** (alarm çizgisi) - Sabit çizgi cv2.line(frame, (0, critical_height), (frame.shape[1], critical_height), (50, 50, 50), 2) # Görüntüyü tekrar boyutlandır (pencere boyutuna sığacak şekilde) frame_resized = cv2.resize(frame, (window_width, window_height)) # OpenCV görüntüsünü RGB formatına dönüştür frame_rgb = cv2.cvtColor(frame_resized, cv2.COLOR_BGR2RGB) # Tkinter için uygun formata dönüştür img = Image.fromarray(frame_rgb) img = ImageTk.PhotoImage(img) # Etiket ile resmi göster label.config(image=img) label.image = img # Burada resmi kaydederek referans kaybolmasını engelliyoruz # Sürekli olarak kareyi yenile label.after(10, update_frame) # Tkinter etiketi oluştur ve görüntü için yer tutucu label = tk.Label(root) label.pack() # Frame güncellemesini başlat update_frame() # Kamera penceresini ve tüm kaynakları serbest bırakmak için ESC tuşunu dinle def close_program(event): cap.release() # Kamerayı serbest bırak cv2.destroyAllWindows() # OpenCV penceresini kapat root.quit() # Tkinter penceresini kapat # ESC tuşuna basıldığında programı kapat root.bind("", close_program) # Pencereyi göster ve döngüye sok root.mainloop()