Raspberry pi Pose Estimation

Project hii ni kifaa cha kusaidia ufanisi wa mazoezi kwa kutumia teknolojia ya Computer Vision. Lengo lilikua kuunda kifaa cha gharama nafuu na kinachoweza kubebeka kinachoweza kufuatilia mkao na utendaji wa mazoezi ya msingi kama vile push-ups. Mfumo unategemea jukwaa la Raspberry Pi kuendesha modeli nyepesi ya Pose Estimation (MediaPipe), ambayo hutambua na kufuatilia viungo muhimu vya mwili (keypoints) kwa wakati halisi. Kwa kukokotoa pembe za kijiometri (geometric angles) kati ya viungo hivi (kama vile mkono, kiwiko na bega), mfumo huweza kutoa maoni ya papo hapo.
Oct 18, 2025

[coming soon]

embedded image
python
import cv2
import mediapipe as mp
from picamera2 import Picamera2
import numpy as np

CAMERA_RESOLUTION = (1280, 720)  # I find it that 720p has good balance


mp_pose = mp.solutions.pose
pose = mp_pose.Pose(
    min_detection_confidence=0.5, 
    min_tracking_confidence=0.5,
    model_complexity=1  
)
mp_drawing = mp.solutions.drawing_utils


cam = Picamera2()


cam_config = cam.create_video_configuration(
    main={"size": CAMERA_RESOLUTION, "format": "RGB888"},
    controls={"FrameRate": 30}  
)
cam.configure(cam_config)
cam.start()


try:
    cam.set_controls({"AfMode": 2, "AfTrigger": 0})
    print("Autofocus enabled")
except:
    print("Autofocus not available on this camera")


cv2.namedWindow("Pose Skeleton", cv2.WINDOW_NORMAL)
cv2.resizeWindow("Pose Skeleton", 960, 720)  

print("Camera started. Press 'q' to quit.")
print("Pose detection active...")


fps = 0
frame_count = 0
import time
start_time = time.time()

try:
    while True:
        
        frame = cam.capture_array()
        
        
        frame = cv2.flip(frame, 1)
        
        frame = cv2.flip(frame, 0)
        
        
        frame_bgr = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
        
        
        results = pose.process(frame)
        
        
        if results.pose_landmarks:
         
            mp_drawing.draw_landmarks(
                frame_bgr,
                results.pose_landmarks,
                mp_pose.POSE_CONNECTIONS,
                landmark_drawing_spec=mp_drawing.DrawingSpec(
                    color=(0, 255, 0), 
                    thickness=3,
                    circle_radius=3
                ),
                connection_drawing_spec=mp_drawing.DrawingSpec(
                    color=(0, 100, 255),  
                    thickness=2,
                    circle_radius=2
                )
            )
            
            #
            cv2.putText(frame_bgr, "POSE DETECTED", (10, 30),
                       cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
        else:
            cv2.putText(frame_bgr, "NO POSE DETECTED", (10, 30),
                       cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
        
        
        frame_count += 1
        if frame_count >= 30:
            end_time = time.time()
            fps = frame_count / (end_time - start_time)
            frame_count = 0
            start_time = time.time()
        
       
        cv2.putText(frame_bgr, f"FPS: {fps:.1f}", (10, 70),
                   cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
        
       
        cv2.imshow("Pose Skeleton", frame_bgr)
        
       
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            break
        
        elif key == ord('s'):
            cv2.imwrite(f"pose_capture_{int(time.time())}.jpg", frame_bgr)
            print("Screenshot saved!")
            
except KeyboardInterrupt:
    print("\nInterrupted by user")
except Exception as e:
    print(f"An error occurred: {e}")
finally:
    
    pose.close()
    cam.stop()
    cv2.destroyAllWindows()
    print("Camera stopped and resources released.")