Sağlık · Vücut noktaları (Pose)
🧓 Düşme tespiti
Yaşlı bakımı ve hastanelerde: kişi düşerse saniyeler içinde alarm.
Huzurevleri, hastane odaları ve yalnız yaşayan yaşlılar için kameralı düşme algılayıcıları bu fikirle çalışır. Model yalnızca vücudun 33 noktasını verir; "düştü mü?" kararını basit, açıklanabilir bir kural verir: kalça hızla aşağı indi ve hemen ardından gövde yatay kaldı.
Not: Gerçek sistemler bu kurala ek olarak hareketsizlik süresi, birden çok kamera ve insan onayı kullanır. Bu demo eğitim amaçlıdır.
Durum: …
Örnek sahne: sentetik bir karakter yürür, oturur, düşer ve kalkar. İskelet noktaları modele değil sahne üreticisine aittir; karar kodu kamera moduyla aynıdır.
Nasıl çalışıyor?
- Nokta bulma: MediaPipe Pose her karede 33 vücut noktası verir. Omuz (11, 12) ve kalça (23, 24) noktalarının ortalarını alırız.
- Özellik 1, düşüş hızı: kalça ortasının aşağı hızı, gövde boyuna bölünür (gövde/sn). Böylece kameraya yakın ya da uzak olman sonucu değiştirmez.
- Özellik 2, gövde açısı: omuz-kalça doğrusunun dikeyle açısı. Ayakta ≈ 0°, yerde ≈ 90°.
- Kural: hız > 1,2 gövde/sn ise "düşüyor olabilir" evresine geçilir. 1,5 sn içinde açı 55° üstünde 6 kare üst üste kalırsa DÜŞME alarmı.
- Yanlış alarmı önleme: hızlı çömelmede açı dik kalır, pencere dolunca normale döner. Yavaşça uzanmak (hız yok) "yatıyor" sayılır, alarm vermez. Dik duruş (açı < 30°) 12 kare sürerse alarm kapanır.
Kendin dene
Örnek sahnede karakter önce oturur (yavaş alçalma), sonra düşer. N kare sayısını 2'ye indir: alarm daha erken ama titrek; 20'ye çıkar: geç ama kararlı. Kamera modunda kameradan 2–3 m uzaklaş, bir koltuğa yavaşça uzan, sonra yumuşak bir minderin üstüne kontrollü "düş" ve farkı gör.
Python karşılığı (OpenCV / MediaPipe)
import cv2, math, mediapipe as mppose = mp.solutions.pose.Pose(model_complexity=0)cap = cv2.VideoCapture(0)SPEED, ANGLE, N, WINDOW = 1.2, 55, 6, 1.5phase, prev_y, prev_t, frames, drop_t = "ok", None, 0, 0, 0while cap.isOpened():ok, frame = cap.read()if not ok: breakt = cv2.getTickCount() / cv2.getTickFrequency()res = pose.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))if res.pose_landmarks:lm = res.pose_landmarks.landmarksx, sy = (lm[11].x + lm[12].x) / 2, (lm[11].y + lm[12].y) / 2 # omuz ortasıhx, hy = (lm[23].x + lm[24].x) / 2, (lm[23].y + lm[24].y) / 2 # kalça ortasıtorso = math.hypot(hx - sx, hy - sy)angle = math.degrees(math.atan2(abs(hx - sx), hy - sy)) # 0 dik, 90 yatayv = 0 if prev_y is None else (hy - prev_y) / torso / (t - prev_t) # gövde/snprev_y, prev_t = hy, tif phase == "ok" and v > SPEED:phase, drop_t, frames = "drop", t, 0elif phase == "drop":frames = frames + 1 if angle > ANGLE else 0if frames >= N: phase = "fall"; print("DÜŞME ALARMI") # alarm gönderelif t - drop_t > WINDOW: phase = "ok"elif phase == "fall" and angle < 30:phase = "ok"cv2.imshow("fall", frame)if cv2.waitKey(1) == 27: break
🔒 Kamera görüntüsü yalnız bu cihazda işlenir; hiçbir yere gönderilmez ve kaydedilmez. Sekmeden ya da sayfadan çıkınca kamera kapanır.
