使用YOLOv8结合DeepSORT实现人物追踪和体态检测的Python代码
import cv2
import numpy as np
from ultralytics import YOLO
from deep_sort_realtime.deepsort_tracker import DeepSort
# 初始化YOLOv8姿势估计模型
pose_model = YOLO('yolov8n-pose.pt') # 使用预训练的人体姿势估计模型
# 初始化DeepSORT追踪器
tracker = DeepSort(max_age=30) # 设置最大追踪丢失帧数
# 打开视频文件或摄像头
cap = cv2.VideoCapture(0) # 0表示默认摄像头,也可替换为视频路径
# 定义关键点连接关系(用于绘制骨骼)
skeleton = [
(0, 1), (0, 2), (1, 3), (2, 4), # 头部和肩部
(5, 6), (5, 7), (7, 9), (6, 8), (8, 10), # 手臂
(11, 12), (11, 13), (13, 15), (12, 14), (14, 16) # 腿部
]
while cap.isOpened():
success, frame = cap.read()
if not success:
break
# 使用YOLOv8进行姿势估计
results = pose_model.track(frame, persist=True, classes=0) # classes=0只检测人
# 提取检测结果
if results[0].boxes.id is not None:
boxes = results[0].boxes.xyxy.cpu().numpy()
track_ids = results[0].boxes.id.int().cpu().numpy()
keypoints = results[0].keypoints.xy.cpu().numpy()
# 准备DeepSORT需要的检测结果格式 [x1, y1, x2, y2, confidence]
detections = []
for box, keypoint in zip(boxes, keypoints):
x1, y1, x2, y2 = box
conf = 0.9 # 使用固定置信度(实际应根据需要调整)
detections.append(([x1, y1, x2 - x1, y2 - y1], conf, keypoint))
# 使用DeepSORT更新追踪
tracked_objects = tracker.update_tracks(detections, frame=frame)
# 绘制追踪结果和姿势
for track in tracked_objects:
if not track.is_confirmed():
continue
track_id = track.track_id
ltrb = track.to_ltrb()
# 绘制追踪框
x1, y1, x2, y2 = map(int, ltrb)
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(frame, f"ID: {track_id}", (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 查找对应的关键点
for det in detections:
det_box = det[0]
if abs(det_box[0] - x1) < 5 and abs(det_box[1] - y1) < 5:
keypoints = det[2]
break
# 绘制关键点和骨骼
for i, kp in enumerate(keypoints):
x, y = int(kp[0]), int(kp[1])
cv2.circle(frame, (x, y), 3, (0, 0, 255), -1)
for start, end in skeleton:
if start < len(keypoints) and end < len(keypoints):
x1, y1 = int(keypoints[start][0]), int(keypoints[start][1])
x2, y2 = int(keypoints[end][0]), int(keypoints[end][1])
cv2.line(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)
# 显示结果
cv2.imshow('Person Tracking with Pose', frame)
# 按'q'退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
-
依赖库:
-
OpenCV (cv2)
-
Ultralytics YOLOv8 (
pip install ultralytics
) -
DeepSORT实时追踪 (
pip install deep-sort-realtime
)
-
-
主要功能:
-
使用YOLOv8姿势估计模型检测人体并估计17个关键点
-
使用DeepSORT算法进行人物追踪
-
实时显示追踪ID和人体骨骼
-