如何排除绿灰组合物体?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
关键说明
- 灰色HSV范围设置:灰色的H通道可以是0-180全范围,S通道要设置为低数值(比如0-30),V通道设置为中等亮度(50-200),这样才能准确识别灰色区域。
- 轮廓验证逻辑:通过计算轮廓区域内灰色像素的占比,判断该物体是否为绿灰组合。如果灰色占比超过设定阈值(比如5%),则认为是需要排除的物体,不加入有效轮廓列表。
- 阈值调整:你可以根据实际游戏画面中绿灰组合物体的灰色占比,调整
0.05这个阈值,确保既能排除误判,又不会漏掉纯绿色物体。
内容的提问来源于stack exchange,提问作者user582426
相关产品推荐
相关产品推荐

