如何使用Python检测屏幕固定区域是否存在指定颜色的通知圆点
固定区域通知圆点检测误判排查
问题描述
- 实现目标:检测网站页面对应屏幕固定位置是否存在指定颜色的通知圆点
- 故障现象:参考屏幕黑白点检测方案编写的代码存在恒定误判,区域内不存在目标圆点时也会判定检测到目标
- 已尝试操作:调整过cv2相关的BGR/RGB通道顺序参数,未确认numpy数组是否受通道顺序影响,暂未定位错误原因
根因分析
代码存在3个直接导致误判的问题:
- 判断逻辑永远为真:
zip(x,y)返回的是迭代器对象,Python中无论迭代器内部是否有元素,直接做布尔判断都会返回True,这是恒定误判的核心原因。 - 颜色匹配逻辑错误:直接写
img==(173,95,255)会逐个通道做独立匹配,只要任意一个通道值和目标值相等就会标记为匹配点,没有要求三个通道同时符合目标颜色,极易产生误匹配。 - 通道顺序认知偏差:pyautogui的
screenshot返回的是PIL Image格式,转numpy数组后默认通道顺序为RGB,和cv2默认的BGR顺序不同,如果按BGR顺序填写颜色值,本身就匹配不到正确的目标颜色。
修正后可运行代码
import numpy as np import pyautogui as pya def detect_notification_dot(): # 截取目标固定区域 screen = pya.screenshot(region=(550, 90, 30, 50)) img = np.array(screen) # RGB三通道同时精确匹配目标颜色,pyautogui截图为RGB顺序无需做通道转换 color_match_mask = (img[:, :, 0] == 173) & (img[:, :, 1] == 95) & (img[:, :, 2] == 255) match_y, match_x = np.where(color_match_mask) match_points = list(zip(match_x, match_y)) print(match_points) # 实际匹配到的点数量大于0时才判定存在目标圆点 return len(match_points) > 0
优化提示
如果页面渲染存在抗锯齿、透明叠加导致目标圆点颜色有轻微偏移,可将精确值匹配替换为HSV颜色空间的范围匹配,设置合理的颜色容差即可大幅提升检测稳定性,不会因为微小的颜色波动漏检。
内容的提问来源于stack exchange,提问作者JustDante
相关产品推荐
相关产品推荐

