Macademia'nın robotik ve mühendislik programı · ücretsiz seviye tespiti ve kişisel öğrenme yolu

Ergonomi · Vücut noktaları (Pose)

🪑 Duruş (postür) analizi

Masa başı çalışanlar için: kamburlaşınca "dik otur" hatırlatması.

Ergonomi uygulamaları ve ofis sağlığı yazılımları web kamerasıyla oturuşunu izler. Üç basit geometrik ölçü yeter: omuzlar düz mü, baş omuzların üstünde mi, baş öne-aşağı düştü mü? Kişiden kişiye değişen tek şey "dik duruş" oranıdır; onu bir kez kalibre ederiz.

Durum: …

Eşikler

Örnek sahne: masa başında çalışan sentetik bir kişi; zamanla kamburlaşır, omzu düşer, sonra düzelir.

Nasıl çalışıyor?

  1. Nokta bulma: MediaPipe Pose; burun (0), kulaklar (7, 8) ve omuzlar (11, 12) yeter.
  2. Özellik 1, omuz eğimi: iki omuzu birleştiren doğrunun yatayla açısı.
  3. Özellik 2, boyun açısı: omuz ortasından kulak ortasına giden doğrunun dikeyle açısı (yandan bakışta başın öne uzanmasını da ölçer).
  4. Özellik 3, baş düşmesi: (omuz ortası y − burun y) / omuz genişliği. Kamburlaşınca baş omuzlara yaklaşır, oran küçülür.
  5. Kural: eğim > 8° ya da boyun > 18° ya da oran < kalibrasyon × 0,8 → kötü duruş. 3 sn sürerse "Dik otur" hatırlatması.

Kendin dene

Kamera modunda dik otur ve "Kalibre et" düğmesine bas. Sonra öne eğilip telefona bakar gibi yap: kaç saniyede uyarı geldi? Hatırlatma süresini 10 sn yap; gerçek bir uygulamada kaç dakika olmalı?

Python karşılığı (OpenCV / MediaPipe)

durus_analizi.py
  1. import cv2, math, time, mediapipe as mp
  2. pose = mp.solutions.pose.Pose(model_complexity=0)
  3. cap = cv2.VideoCapture(0)
  4. TILT, NECK, DROP, HOLD = 8, 18, 0.8, 3
  5. base, bad_since = None, None
  6. while cap.isOpened():
  7. ok, frame = cap.read()
  8. if not ok: break
  9. h, w = frame.shape[:2]
  10. res = pose.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
  11. if res.pose_landmarks:
  12. p = lambda i: (res.pose_landmarks.landmark[i].x * w, res.pose_landmarks.landmark[i].y * h)
  13. nose, le, re, ls, rs = p(0), p(7), p(8), p(11), p(12)
  14. sw = math.dist(ls, rs); sm = ((ls[0] + rs[0]) / 2, (ls[1] + rs[1]) / 2)
  15. ear = ((le[0] + re[0]) / 2, (le[1] + re[1]) / 2)
  16. tilt = math.degrees(math.atan2(abs(rs[1] - ls[1]), abs(rs[0] - ls[0])))
  17. neck = math.degrees(math.atan2(abs(ear[0] - sm[0]), sm[1] - ear[1]))
  18. ratio = (sm[1] - nose[1]) / sw
  19. base = base or ratio # ilk kare = kalibrasyon
  20. bad = tilt > TILT or neck > NECK or ratio < base * DROP
  21. bad_since = (bad_since or time.time()) if bad else None
  22. if bad_since and time.time() - bad_since > HOLD:
  23. cv2.putText(frame, "Dik otur!", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 3) # Sit up!
  24. cv2.imshow("posture", frame)
  25. 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ç