如何合并形状不同的多个人体二值掩码?
解决不同形状人体掩码合并的问题
你的代码报错核心原因是不同人体的掩码数组形状不一致,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
相关产品推荐
相关产品推荐

