使用YOLOv8结合DeepSORT实现人物追踪和体态检测

 使用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()
  1. 依赖库

    • OpenCV (cv2)

    • Ultralytics YOLOv8 (pip install ultralytics)

    • DeepSORT实时追踪 (pip install deep-sort-realtime)

  2. 主要功能

    • 使用YOLOv8姿势估计模型检测人体并估计17个关键点

    • 使用DeepSORT算法进行人物追踪

    • 实时显示追踪ID和人体骨骼

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值