You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python+OpenCV+Mediapipe人体跟踪随机切换目标问题求解

解决Mediapipe人体跟踪频繁切换目标的问题

核心思路

通过手动框选目标区域(ROI),在每一帧中仅保留该区域内的人体骨骼关键点,过滤框外的检测结果,从而实现固定目标跟踪,避免随机切换。

具体实现步骤

1. 初始化基础组件

导入所需库,初始化Mediapipe Pose检测器和摄像头捕获:

import cv2
import mediapipe as mp

mp_pose = mp.solutions.pose
pose = mp_pose.Pose(
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5
)
cap = cv2.VideoCapture(0)

2. 让用户框选跟踪目标

启动摄像头后,捕获一帧画面让用户用鼠标框选目标区域,获取ROI坐标:

# 捕获初始帧用于框选
ret, frame = cap.read()
if not ret:
    print("无法读取摄像头画面")
    cap.release()
    exit()

# 让用户框选目标区域
roi = cv2.selectROI("选择跟踪目标", frame, fromCenter=False, showCrosshair=True)
cv2.destroyWindow("选择跟踪目标")
x_roi, y_roi, w_roi, h_roi = roi

3. 帧处理时过滤框外目标

每帧处理中,先获取Mediapipe检测结果,判断人体边界框是否在ROI内,仅保留符合条件的关键点绘制:

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 转换颜色空间并处理
    image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = pose.process(image)
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

    if results.pose_landmarks:
        # 计算当前检测到的人体的边界框
        h, w, _ = image.shape
        landmarks = results.pose_landmarks.landmark
        x_coords = [lm.x * w for lm in landmarks]
        y_coords = [lm.y * h for lm in landmarks]
        person_x_min = min(x_coords)
        person_y_min = min(y_coords)
        person_x_max = max(x_coords)
        person_y_max = max(y_coords)

        # 判断人体是否在ROI内(允许少量偏移,避免框选太严)
        overlap = (person_x_min >= x_roi - 20 and 
                   person_y_min >= y_roi - 20 and 
                   person_x_max <= x_roi + w_roi + 20 and 
                   person_y_max <= y_roi + h_roi + 20)
        
        if overlap:
            # 绘制ROI框
            cv2.rectangle(image, (x_roi, y_roi), (x_roi+w_roi, y_roi+h_roi), (0,255,0), 2)
            # 绘制骨骼关键点
            mp.solutions.drawing_utils.draw_landmarks(
                image,
                results.pose_landmarks,
                mp_pose.POSE_CONNECTIONS,
                mp.solutions.drawing_utils.DrawingSpec(color=(245,117,66), thickness=2, circle_radius=2),
                mp.solutions.drawing_utils.DrawingSpec(color=(245,66,230), thickness=2, circle_radius=2)
            )

    cv2.imshow("固定目标跟踪", image)
    if cv2.waitKey(5) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

关键逻辑说明

  • Mediapipe的Pose跟踪默认优先检测画面中姿态最清晰的人体,多目标场景下易因帧间匹配误差切换目标。
  • 通过ROI过滤后,仅处理框内人体,即使画面中有其他人也会被忽略,实现稳定跟踪。
  • 代码中加入20像素偏移量,避免用户框选范围过小时,目标轻微移动就被过滤。

内容的提问来源于stack exchange,提问作者Stevolution2023

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:12:24