Okullar için Robotik ve Mühendislik · anaokulundan liseye

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: …

Eşikler

Ö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?

  1. 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.
  2. Ö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.
  3. Özellik 2, gövde açısı: omuz-kalça doğrusunun dikeyle açısı. Ayakta ≈ 0°, yerde ≈ 90°.
  4. 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ı.
  5. 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)

dusme_tespiti.py
  1. import cv2, math, mediapipe as mp
  2. pose = mp.solutions.pose.Pose(model_complexity=0)
  3. cap = cv2.VideoCapture(0)
  4. SPEED, ANGLE, N, WINDOW = 1.2, 55, 6, 1.5
  5. phase, prev_y, prev_t, frames, drop_t = "ok", None, 0, 0, 0
  6. while cap.isOpened():
  7. ok, frame = cap.read()
  8. if not ok: break
  9. t = cv2.getTickCount() / cv2.getTickFrequency()
  10. res = pose.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
  11. if res.pose_landmarks:
  12. lm = res.pose_landmarks.landmark
  13. sx, sy = (lm[11].x + lm[12].x) / 2, (lm[11].y + lm[12].y) / 2 # omuz ortası
  14. hx, hy = (lm[23].x + lm[24].x) / 2, (lm[23].y + lm[24].y) / 2 # kalça ortası
  15. torso = math.hypot(hx - sx, hy - sy)
  16. angle = math.degrees(math.atan2(abs(hx - sx), hy - sy)) # 0 dik, 90 yatay
  17. v = 0 if prev_y is None else (hy - prev_y) / torso / (t - prev_t) # gövde/sn
  18. prev_y, prev_t = hy, t
  19. if phase == "ok" and v > SPEED:
  20. phase, drop_t, frames = "drop", t, 0
  21. elif phase == "drop":
  22. frames = frames + 1 if angle > ANGLE else 0
  23. if frames >= N: phase = "fall"; print("DÜŞME ALARMI") # alarm gönder
  24. elif t - drop_t > WINDOW: phase = "ok"
  25. elif phase == "fall" and angle < 30:
  26. phase = "ok"
  27. cv2.imshow("fall", frame)
  28. 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.

Esc
  • PanelAna sayfaSayfa
  • ModüllerTüm modüllerSayfa
  • ParçalarParça ansiklopedisiSayfa
  • Mühendislik yoluBüyükler için robotik: 128 parça, 7 seviyeSayfa
  • Robotik dersi (ESOF 323)Üniversite robotik dersi, 14 haftaSayfa
  • Drone dersiBüyükler için: parça, simülasyon, yazılım; 10 üniteSayfa
  • Blok atölyesiSerbest blok programlamaAraç
  • Devre laboratuvarıSanal Arduino ve devreAraç
  • Robot arenasıSanal robot sürüşüAraç
  • OyunlarBloklarla 8 öğretici oyunAraç
  • Mikro Kart atölyesiSanal LED kartı bloklarla programlaAraç
  • Robot atölyesiMikro Kart'ı robota tak, bloklarla görev yapAraç