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: …
Örnek sahne: masa başında çalışan sentetik bir kişi; zamanla kamburlaşır, omzu düşer, sonra düzelir.
Nasıl çalışıyor?
- Nokta bulma: MediaPipe Pose; burun (0), kulaklar (7, 8) ve omuzlar (11, 12) yeter.
- Özellik 1, omuz eğimi: iki omuzu birleştiren doğrunun yatayla açısı.
- Ö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).
- Özellik 3, baş düşmesi: (omuz ortası y − burun y) / omuz genişliği. Kamburlaşınca baş omuzlara yaklaşır, oran küçülür.
- 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)
import cv2, math, time, mediapipe as mppose = mp.solutions.pose.Pose(model_complexity=0)cap = cv2.VideoCapture(0)TILT, NECK, DROP, HOLD = 8, 18, 0.8, 3base, bad_since = None, Nonewhile cap.isOpened():ok, frame = cap.read()if not ok: breakh, w = frame.shape[:2]res = pose.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))if res.pose_landmarks:p = lambda i: (res.pose_landmarks.landmark[i].x * w, res.pose_landmarks.landmark[i].y * h)nose, le, re, ls, rs = p(0), p(7), p(8), p(11), p(12)sw = math.dist(ls, rs); sm = ((ls[0] + rs[0]) / 2, (ls[1] + rs[1]) / 2)ear = ((le[0] + re[0]) / 2, (le[1] + re[1]) / 2)tilt = math.degrees(math.atan2(abs(rs[1] - ls[1]), abs(rs[0] - ls[0])))neck = math.degrees(math.atan2(abs(ear[0] - sm[0]), sm[1] - ear[1]))ratio = (sm[1] - nose[1]) / swbase = base or ratio # ilk kare = kalibrasyonbad = tilt > TILT or neck > NECK or ratio < base * DROPbad_since = (bad_since or time.time()) if bad else Noneif bad_since and time.time() - bad_since > HOLD:cv2.putText(frame, "Dik otur!", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 3) # Sit up!cv2.imshow("posture", 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.
