vio / utils /visualizer.py
harmesh95's picture
Add YOLOv8 model weights with LFS tracking
e2af51e
import cv2
import numpy as np
class Visualizer:
def __init__(self):
self.colors = {
"person": (0, 255, 0), # Green
"keypoint": (255, 255, 0), # Yellow
"connection": (0, 255, 255)# Cyan
}
def rescale_coords(self, x, y, scale_info):
"""Convert model coordinates back to original video dimensions"""
scale = scale_info['scale']
pad_w = scale_info['pad_w']
pad_h = scale_info['pad_h']
original_h, original_w = scale_info['original_size']
# Remove padding and scale back to original dimensions
x_orig = int((x - pad_w) / scale)
y_orig = int((y - pad_h) / scale)
# Ensure coordinates are within bounds
x_orig = max(0, min(x_orig, original_w - 1))
y_orig = max(0, min(y_orig, original_h - 1))
return (x_orig, y_orig)
def draw_detections(self, frame, det_results, pose_results, scale_info, tracked_persons):
"""Draw detections and poses on the frame."""
try:
display_frame = frame.copy()
# Draw person boxes with IDs first
for person_id, box in tracked_persons.items():
try:
if len(box) != 4:
continue
x1, y1, x2, y2 = map(float, box)
x1, y1 = self.rescale_coords(x1, y1, scale_info)
x2, y2 = self.rescale_coords(x2, y2, scale_info)
# Ensure coordinates are valid
if any(coord < 0 for coord in [x1, y1, x2, y2]):
continue
# Draw person box
cv2.rectangle(display_frame,
(int(x1), int(y1)),
(int(x2), int(y2)),
self.colors["person"],
2)
# Draw person ID
id_text = f"ID:{person_id}"
(text_w, text_h), _ = cv2.getTextSize(
id_text, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2
)
cv2.rectangle(
display_frame,
(int(x2 - text_w - 5), int(y1)),
(int(x2), int(y1 + text_h + 5)),
self.colors["person"],
-1,
)
cv2.putText(
display_frame,
id_text,
(int(x2 - text_w - 2), int(y1 + text_h + 2)),
cv2.FONT_HERSHEY_SIMPLEX,
0.5,
(0, 0, 255),
1,
)
except Exception as e:
print(f"Error drawing person ID {person_id}: {e}")
continue
# Draw keypoints
if pose_results:
for result in pose_results:
if result.keypoints:
for kpts in result.keypoints:
try:
keypoints = kpts.data[0].cpu().numpy()
for kp in keypoints:
x, y, conf = kp
if conf > 0.5: # Only draw keypoints with high confidence
x, y = self.rescale_coords(x, y, scale_info)
cv2.circle(display_frame, (int(x), int(y)), 3, self.colors["keypoint"], -1)
except Exception as e:
print(f"Error drawing keypoints: {e}")
continue
return display_frame
except Exception as e:
print(f"Error in draw_detections: {e}")
return frame