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

如何排除绿灰组合物体?OpenCV自动点击器误判问题求助

解决自动点击器误判绿灰组合物体的问题

问题分析

当前代码仅通过绿色HSV掩码识别轮廓,导致包含绿色的绿灰组合物体被误检测。你尝试的掩码位运算方法无效,是因为绿灰组合物体中的绿色区域和灰色区域是分离的,位运算后仍会保留绿色部分的轮廓,无法彻底排除整个物体。

解决方案

我们需要先识别所有绿色轮廓,再对每个轮廓对应的区域进行验证——检查该区域是否包含灰色像素,若包含则排除该轮廓。同时要确保灰色的HSV范围设置正确(灰色的核心特征是低饱和度)。

修改后的代码

def find_contours():
    screen = sct.grab(monitor)
    img = np.array(screen)
    hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 绿色HSV范围,请根据实际画面微调
    lower_green = (40, 40, 40)
    upper_green = (70, 255, 255)
    mask_for_green = cv2.inRange(hsv_img, lower_green, upper_green)

    # 灰色HSV范围:低饱和度,亮度适中(核心是S通道值低)
    lower_gray = (0, 0, 50)
    upper_gray = (180, 30, 200)
    mask_for_gray = cv2.inRange(hsv_img, lower_gray, upper_gray)

    # 提取所有绿色轮廓
    contours, _ = cv2.findContours(mask_for_green, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    valid_contours = []
    for cnt in contours:
        # 获取轮廓的外接矩形
        x, y, w, h = cv2.boundingRect(cnt)
        # 截取该轮廓区域内的灰色掩码
        roi_gray_mask = mask_for_gray[y:y+h, x:x+w]
        # 计算区域内灰色像素的占比
        gray_pixel_num = cv2.countNonZero(roi_gray_mask)
        total_pixels = w * h
        # 如果灰色像素占比低于阈值(可根据实际情况调整,比如5%),则保留该轮廓
        if total_pixels > 0 and (gray_pixel_num / total_pixels) < 0.05:
            valid_contours.append(cnt)

    return valid_contours

关键说明

  1. 灰色HSV范围设置:灰色的H通道可以是0-180全范围,S通道要设置为低数值(比如0-30),V通道设置为中等亮度(50-200),这样才能准确识别灰色区域。
  2. 轮廓验证逻辑:通过计算轮廓区域内灰色像素的占比,判断该物体是否为绿灰组合。如果灰色占比超过设定阈值(比如5%),则认为是需要排除的物体,不加入有效轮廓列表。
  3. 阈值调整:你可以根据实际游戏画面中绿灰组合物体的灰色占比,调整0.05这个阈值,确保既能排除误判,又不会漏掉纯绿色物体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:57:22