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

如何让MediaPipe手部检测在戴蓝色手套的手上实时生效

解决MediaPipe蓝色手套手部检测问题

原代码的核心问题

  • 仅匹配纯蓝色像素[0,0,255],但实际手套受光照影响,颜色会有深浅变化,导致mask漏选大量像素
  • 直接替换为固定肤色值,完全丢失手部的明暗纹理,MediaPipe无法识别完整的手部特征

改进方案:保留明暗的颜色替换

步骤1:动态识别蓝色区域(基于HSV色域)

HSV色域比RGB更适合颜色检测,能轻松覆盖蓝色的深浅变化:

def findHands(self, img, draw=True, flipType=True):
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    
    # 定义蓝色的HSV范围(可根据你的手套实际颜色调整)
    lower_blue = np.array([90, 50, 50])
    upper_blue = np.array([130, 255, 255])
    # 生成蓝色区域的mask
    blue_mask = cv2.inRange(imgHSV, lower_blue, upper_blue)

步骤2:保留手部明暗,替换颜色

不是直接替换成固定肤色,而是将蓝色区域的色调(H)替换为肤色的H值,同时保留原有的饱和度(S)和明度(V),这样能保留手部的光影纹理:

# 定义肤色的HSV色调值(可根据需要微调)
    skin_hue = 10  # 肤色的H值大概在0-20之间
    # 复制HSV图像,只修改蓝色区域的H通道
    modified_hsv = imgHSV.copy()
    modified_hsv[blue_mask > 0, 0] = skin_hue  # 替换H通道
    
    # 转换回RGB格式,传给MediaPipe
    img_res = cv2.cvtColor(modified_hsv, cv2.COLOR_HSV2RGB)

步骤3:优化mask(可选)

如果手套边缘有杂色,可对mask做形态学操作,去除噪声:

# 形态学开运算,去除小噪声
    kernel = np.ones((3,3), np.uint8)
    blue_mask = cv2.morphologyEx(blue_mask, cv2.MORPH_OPEN, kernel)
    # 形态学闭运算,填补小漏洞
    blue_mask = cv2.morphologyEx(blue_mask, cv2.MORPH_CLOSE, kernel)

完整改进代码

def findHands(self, img, draw=True, flipType=True):
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    
    # 蓝色HSV范围(可根据实际手套颜色调整)
    lower_blue = np.array([90, 50, 50])
    upper_blue = np.array([130, 255, 255])
    blue_mask = cv2.inRange(imgHSV, lower_blue, upper_blue)
    
    # 优化mask
    kernel = np.ones((3,3), np.uint8)
    blue_mask = cv2.morphologyEx(blue_mask, cv2.MORPH_OPEN, kernel)
    blue_mask = cv2.morphologyEx(blue_mask, cv2.MORPH_CLOSE, kernel)
    
    # 替换蓝色区域的色调为肤色,保留S和V
    modified_hsv = imgHSV.copy()
    modified_hsv[blue_mask > 0, 0] = 10  # 肤色H值,可微调
    
    # 转RGB后传给MediaPipe
    img_res = cv2.cvtColor(modified_hsv, cv2.COLOR_HSV2RGB)
    self.results = self.hands.process(img_res)
    
    # 后续的绘制逻辑(原代码保留)
    if draw:
        # 你的绘制代码
        pass
    return img_res

调试技巧

  • 调整lower_blue和upper_blue:用HSV颜色拾取工具获取手套的实际颜色范围,确保mask完全覆盖手套
  • 微调skin_hue:如果检测还是不稳定,尝试将H值调整到5-15之间,找到最接近真实肤色的数值
  • 实时查看mask:在代码中加入cv2.imshow("Blue Mask", blue_mask),确认mask是否准确覆盖手套区域

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:37:26