Deploy_El7a2ny_Application / CPR_Module /Common /wrists_midpoint_analyzer.py
FatemaKotb's picture
CPR Partial Code Cleaning
4cdc77a
import cv2
import numpy as np
from CPR_Module.Common.keypoints import CocoKeypoints
from CPR_Module.Common.logging_config import cpr_logger
class WristsMidpointAnalyzer:
"""Calculate and visualize midpoint between wrists for CPR rescuer"""
def __init__(self, allowed_distance_between_wrists=170):
self.allowed_distance_between_wrists = allowed_distance_between_wrists
self.midpoint = None
self.midpoint_history = []
def detect_wrists_midpoint(self, rescuer_keypoints):
"""Calculate midpoint between wrists in pixel coordinates"""
try:
if rescuer_keypoints is None:
return None
# Get wrist coordinates
lw = rescuer_keypoints[CocoKeypoints.LEFT_WRIST.value]
rw = rescuer_keypoints[CocoKeypoints.RIGHT_WRIST.value]
# If the distance between wrists is too large, return None
distance = np.linalg.norm(np.array(lw) - np.array(rw))
if distance > self.allowed_distance_between_wrists:
return None
# Calculate midpoint
midpoint = (
int((lw[0] + rw[0]) / 2),
int((lw[1] + rw[1]) / 2)
)
return midpoint
except Exception as e:
cpr_logger.error(f"Midpoint tracking error: {e}")
return None
def draw_midpoint(self, frame):
"""Visualize the midpoint on frame"""
if self.midpoint is None:
return frame
try:
# Draw visualization
cv2.circle(frame, self.midpoint, 8, (0, 255, 0), -1)
cv2.putText(
frame, "MIDPOINT",
(self.midpoint[0] + 5, self.midpoint[1] - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2
)
return frame
except Exception as e:
cpr_logger.error(f"Midpoint drawing error: {e}")
return frame
def reset_midpoint_history(self):
"""Reset midpoint history"""
self.midpoint_history = []