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

如何合并形状不同的多个人体二值掩码?

解决不同形状人体掩码合并的问题

你的代码报错核心原因是不同人体的掩码数组形状不一致,numpy无法直接对形状不同的数组执行加法运算。要解决这个问题,关键是把每个裁剪后的人体掩码映射回原视频帧的对应位置,再叠加合并。

具体解决步骤

  • 先确定原视频帧的尺寸(假设你有当前帧图像frame,可通过h, w = frame.shape[:2]获取高和宽)
  • 初始化一个和原帧同尺寸的全零画布作为结果掩码
  • 遍历每个人体时,获取该掩码在原帧中的边界框(通常人体检测/分割结果会包含bbox,格式一般为(x1, y1, x2, y2),对应左上角和右下角坐标)
  • 将裁剪后的人体掩码放到全零画布的对应位置,再叠加到结果中

修改后的代码示例

import cv2
import numpy as np

# 假设已获取当前帧frame
h, w = frame.shape[:2]
# 初始化全零结果掩码,用float32避免数值溢出
result_mask = np.zeros((h, w), dtype=np.float32)

for body in bodies_list:
    print(f"body ID {body.id} Position {body.keypoint_2d[2]}")
    mask = body.mask.get_data().astype(np.float32)
    # 获取当前人体的边界框,替换成你实际获取bbox的方式
    x1, y1, x2, y2 = body.bbox  # 需确认你的body对象是否具备bbox属性
    # 裁剪边界框,避免超出帧范围
    y1_clamped = max(0, y1)
    y2_clamped = min(h, y2)
    x1_clamped = max(0, x1)
    x2_clamped = min(w, x2)
    # 计算有效区域的尺寸
    roi_h = y2_clamped - y1_clamped
    roi_w = x2_clamped - x1_clamped
    # 将掩码的对应区域叠加到结果画布
    if roi_h > 0 and roi_w > 0:
        result_mask[y1_clamped:y2_clamped, x1_clamped:x2_clamped] += mask[:roi_h, :roi_w]

# 转换为可显示的uint8格式
result_mask = np.clip(result_mask, 0, 1) * 255  # 先限制值在0-1区间,再放大到255
result_mask = result_mask.astype(np.uint8)

cv2.imshow("mask", result_mask)
cv2.waitKey(1)

额外说明

  • 如果没有直接的bbox属性,可通过人体关键点的坐标计算边界框:取所有keypoint_2d的x最小/最大值、y最小/最大值作为bbox范围
  • 若你的分割库支持直接输出整帧尺寸的实例掩码(每个掩码和原帧同大小,仅人体区域非零),可直接跳过映射步骤,直接累加所有掩码,这是更高效的方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:40:12